根据物体大小来计算相机的FOV

透视相机的计算

游戏开发中会经常遇到把某个物体要放在相机视野内。可能是游戏的整个背景,如图:

根据物体大小来计算相机的FOV_第1张图片

如果我们需要在运行后按照宽度占满整个屏幕,那么是要移动相机位置或者调整场景位置,或者把相机对准后放好一个适当的距离然后调整Field of View (fov)就可以了,这个更简单些。

如果分辨率是固定的还好,但是在不同手机下分辨率,宽高比可能是不同的,如果不调整就要么会少显示一部分,要么露出边框了。

那么如何来计算fov呢?
我们先看看相机大概的样子
根据物体大小来计算相机的FOV_第2张图片
看图我们知道了,目标对象在Near Plane和Far Plane之间。如果要把目标物按宽度占满屏幕,可以看作已知View宽度,相机到View距离,求fov角的问题。根据三角形公式,
所以我们有如下代码可以计算。

public class CViewCameraTest : MonoBehaviour {

	public Camera mainCamera;	//相机
	public GameObject targetObject;	//显示的图片(场景)
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		//把目标物完全显示在相机范围内

		//把相机的位置放在固定位置
		mainCamera.transform.localPosition = new Vector3(0f, 0f, -10f);
		//mainCamera.aspect是当前相机视口的宽高比
		//targetObject.transform.localScale.x是物体的实际大小,这里面片是1米的
		float vheight = targetObject.transform.localScale.x / mainCamera.aspect; //计算锥体高度距离
		float distance = Vector3.Distance(mainCamera.transform.position, targetObject.transform.position);  //相机距离目标距离

		//根据对边和临边计算角度,并转化成角度
		float view = 2f * Mathf.Atan(vheight * 0.5f / distance) * Mathf.Rad2Deg;    //根据目标高度来计算

		mainCamera.fieldOfView = view;
	}
}

运行后。
根据物体大小来计算相机的FOV_第3张图片
根据物体大小来计算相机的FOV_第4张图片
不同的分辨率下也保持了宽度最大。

同样的,如果视口方和显示的对象forward一致,也可以让显示对象适应相机的视口大小,可以自由调整距离和fov来计算目标对象的大小。如下图:

根据物体大小来计算相机的FOV_第5张图片

		
		float distance = Vector3.Distance(mainCamera.transform.position, targetObject.transform.position);  //相机距离目标距离

		//计算视口高度和宽度
		float frustumHeight = 2.0f * distance * Mathf.Tan(mainCamera.fieldOfView * 0.5f * Mathf.Deg2Rad);
		
		float frustumWidth = frustumHeight * mainCamera.aspect;
		
		//缩放目标面片物体大小
		targetObject.transform.localScale = new Vector3(frustumWidth, frustumHeight,1f);

你拖动相机z的位置,和修改fov,呈现的内容不变。(当然对于Perspective透视相机你要把显示的对象放在正前方,光影会有变化。)

以此类推,你也可以根据物体大小来计算距离,可以通过
float distance = frustumHeight * 0.5f / Mathf.Tan(camera.fieldOfView * 0.5f * Mathf.Deg2Rad);

正交相机的计算

对于Orthographic相机(正交相机)来说,计算可以这样。
首先计算出单位1米的orthographicSize 是多少,然后根据图片或者物体大小计算出真正大小,例如图片是2000的,PixelsPerUnit是100的,那么就是rate * (2000f/100)

        float rate = 1f / ((float)Screen.width / Screen.height) * 0.5f;    //1米的相机距离
        shapeCamera.orthographicSize = rate * ((float)headTexture.width / PixelsPerUnit);

你可能感兴趣的:(Unity,camera)