前言
关于FOV
FOV 是在任何给定时间通过人眼、相机取景器或在显示屏上可见的可观察世界的范围。它指的是整个区域的覆盖范围,而不是单个固定焦点。FOV 还描述了一个人可以看到可见世界的角度。
FOV 越宽,可以看到的可观察世界就越多。它是水平、垂直和对角线测量的。相机镜头、其焦距和传感器尺寸都在确定 FOV 方面发挥作用。
FOV一般可以分为三种类型, 分别是对角线FOV ,垂直FOV, 水平FOV
在Unity中的相机属性里,可以对相机的视野轴进行设置,详见:Camera component
FOV Axis (when Perspective is selected) | 视野轴 |
---|---|
Horizontal | 摄像机使用水平视野轴 |
Vertical | 摄像机使用垂直视野轴 |
但是需要注意的是,如果通过代码对相机的Camera.fieldOfView进行赋值,是对相机的垂直FOV进行赋值。也就是说尽管在Camera的属性里设置了使用水平视野轴,通过代码赋值的话需要自行进行计算转换来赋值。
如何将水平FOV转垂直FOV
- 方法1:手动计算(适用任何情况的FOV转换)
/// <summary>
/// 将垂直FOV转成水平FOV
/// </summary>
/// <param name="verFOV">垂直FOV值</param>
/// <param name="aspect">屏幕分辨率比例</param>
/// <returns></returns>
public static float ConvertVerticalFOVToHorizontally(float verFOV, float aspect)
{
// 垂直fov角度转成弧度
float verFovRadian = verFOV * Mathf.Deg2Rad;
// 算出视野高度的一半
float camHalfHeight = Mathf.Tan(verFovRadian / 2);
// 算出水平视野的弧度
float horFOVRadian = Mathf.Atan(camHalfHeight * aspect) * 2;
// 将水平视野弧度转成角度
float horFOV = horFOVRadian * Mathf.Rad2Deg;
return horFOV;
}
- 方法2:UnityEngine.Camera类提供api(适用于Unity内)
/// <summary>
/// 将垂直FOV转成水平FOV
/// </summary>
/// <param name="verFOV">垂直FOV值</param>
/// <param name="aspect">屏幕分辨率比例</param>
/// <returns></returns>
public static float ConvertVerticalFOVToHorizontally(float verFOV, float aspect)
{
return Camera.VerticalToHorizontalFieldOfView(verFOV, aspect);
}
如何将垂直FOV转水平FOV
- 方法1:手动计算(适用任何情况的FOV转换)
/// <summary>
/// 将水平FOV转成垂直FOV
/// </summary>
/// <param name="horFOV">水平FOV</param>
/// <param name="aspect">屏幕分辨率比例</param>
/// <returns></returns>
public static float ConvertHorizontalFOVToVertically(float horFOV, float aspect)
{
// 水平fov角度转成弧度
float horFOVRadian = horFOV * Mathf.Deg2Rad;
// 算出视野宽度的一半
float camHalfWidth = Mathf.Tan(horFOVRadian / 2);
// 算出垂直视野的弧度
float verFOVRadian = Mathf.Atan(camHalfWidth / aspect) * 2;
// 将垂直视野弧度转成角度
float verFOV = verFOVRadian * Mathf.Rad2Deg;
return verFOV;
}
- 方法2:UnityEngine.Camera类提供api(适用于Unity内)
/// <summary>
/// 将水平FOV转成垂直FOV
/// </summary>
/// <param name="horFOV">水平FOV</param>
/// <param name="aspect">屏幕分辨率比例</param>
/// <returns></returns>
public static float ConvertHorizontalFOVToVertically(float horFOV, float aspect)
{
return Camera.HorizontalToVerticalFieldOfView(horFOV, aspect);
}