unity里Camera.fieldOfView 视野是垂直视野,水平视野盛典里好像没有,就自己写了一个
把摄像机视野当做一个四棱锥(如图所示,F,E分别是BC,CD中点),四棱锥底部边长比就是Camera.aspect,
方法1:
假设AB是1,
BC: Camera.aspect,
角FPO: 0.5倍的Camera.fieldOfView,
PO: 0.5Mathf.Tan(0.5f * Camera.fieldOfView * Mathf.Deg2Rad),
角OPE: Mathf.Atan(0.5Camera.aspect /(Mathf.Tan(0.5f * Camera.fieldOfView * Mathf.Deg2Rad)*0.5)) * Mathf.Rad2Deg,
整理: Mathf.Atan(camera.aspect * Mathf.Tan(0.5f * camera.fieldOfView * Mathf.Deg2Rad)) * Mathf.Rad2Deg,
所以水平视野就是
2 * Mathf.Atan(camera.aspect * Mathf.Tan(0.5f * camera.fieldOfView * Mathf.Deg2Rad)) * Mathf.Rad2Deg
方法2 :
按照实际摄像机范围,
PO: 长度是Camera.farClipPlane,
角FPO: 0.5倍的Camera.fieldOfView,
FO: Camera.farClipPlaneMathf.Tan(0.5f * Camera.fieldOfView * Mathf.Deg2Rad),
DE: 2Camera.farClipPlaneMathf.Tan(0.5f * Camera.fieldOfView * Mathf.Deg2Rad),
BC: Camera.aspect2Camera.farClipPlaneMathf.Tan(0.5f * Camera.fieldOfView * Mathf.Deg2Rad),
OE: Camera.aspectCamera.farClipPlaneMathf.Tan(0.5f * Camera.fieldOfView * Mathf.Deg2Rad),
角OPE: Mathf.Atan(camera.aspectCamera.farClipPlane Mathf.Tan(0.5f * camera.fieldOfView * Mathf.Deg2Rad)/Camera.farClipPlane) * Mathf.Rad2Deg,
整理: Mathf.Atan(camera.aspect * Mathf.Tan(0.5f * camera.fieldOfView * Mathf.Deg2Rad)) * Mathf.Rad2Deg,
所以水平视野就是 2 * Mathf.Atan(camera.aspect * Mathf.Tan(0.5f * camera.fieldOfView * Mathf.Deg2Rad)) * Mathf.Rad2Deg
代码:
/// <summary>
/// 计算水平视野(单位:度)
/// </summary>
float ComputeHFOV(Camera camera)
{
return 2 * Mathf.Atan(camera.aspect * Mathf.Tan(0.5f * camera.fieldOfView * Mathf.Deg2Rad)) * Mathf.Rad2Deg;
}