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

您所在的位置:网站首页 镜头FOV怎么计算 根据物体大小来计算相机的FOV

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

2023-12-03 09:00| 来源: 网络整理| 查看: 265

透视相机的计算

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

在这里插入图片描述

如果我们需要在运行后按照宽度占满整个屏幕,那么是要移动相机位置或者调整场景位置,或者把相机对准后放好一个适当的距离然后调整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 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; } }

运行后。 在这里插入图片描述 在这里插入图片描述 不同的分辨率下也保持了宽度最大。

同样的,如果视口方和显示的对象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);


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3