本文主要是介绍根据物体大小来计算相机的FOV,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
透视相机的计算
游戏开发中会经常遇到把某个物体要放在相机视野内。可能是游戏的整个背景,如图:
如果我们需要在运行后按照宽度占满整个屏幕,那么是要移动相机位置或者调整场景位置,或者把相机对准后放好一个适当的距离然后调整Field of View (fov)就可以了,这个更简单些。
如果分辨率是固定的还好,但是在不同手机下分辨率,宽高比可能是不同的,如果不调整就要么会少显示一部分,要么露出边框了。
那么如何来计算fov呢?
我们先看看相机大概的样子
看图我们知道了,目标对象在Near Plane和Far Plane之间。如果要把目标物按宽度占满屏幕,可以看作已知View宽度,相机到View距离,求fov角的问题。根据三角形公式,
所以我们有如下代码可以计算。
public class CViewCameraTest : MonoBehaviour {public Camera mainCamera; //相机public GameObject targetObject; //显示的图片(场景)void Start () {}// Update is called once per framevoid 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;}
}
运行后。
不同的分辨率下也保持了宽度最大。
同样的,如果视口方和显示的对象forward一致,也可以让显示对象适应相机的视口大小,可以自由调整距离和fov来计算目标对象的大小。如下图:
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);
这篇关于根据物体大小来计算相机的FOV的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!