透视相机相机成像的面积、相机高度和视野角度之间的关系
Camera camera = Camera.main;
相机与成像面垂直
float areaHeight = 40,//摄像机成像面积的高度
distance = 50,//摄像机到成像面的高度
fieldOfView = 60;//摄像机视野角度
//已知:摄像机到成像面的高度、视野角度
areaHeight = 2.0f * distance * Mathf.Tan(fieldOfView * 0.5f * Mathf.Deg2Rad);
//已知:摄像机成像面积的高度、视野角度
distance = areaHeight * 0.5f / (Mathf.Tan(fieldOfView * 0.5f * Mathf.Deg2Rad));
//已知:摄像机高度、摄像机成像面积的高度
fieldOfView = 2 * Mathf.Atan(areaHeight * 0.5f / distance) * Mathf.Rad2Deg;
//aspect为相机宽高比 (width/height)
float areaWidth = areaHeight * camera.aspect;//摄像机成像面积的宽度
当相机与成像面有角度
侧面视角:

//相机旋转的角度
float cameraAngle = 45;
areaHeight = 2.0f * distance * Mathf.Tan(fieldOfView * 0.5f * Mathf.Deg2Rad);
float angleInside = Mathf.Atan2(areaHeight / 2, distance) * Mathf.Rad2Deg;
float angleOuntside = Mathf.Abs(cameraAngle - angleInside);
//相机到地面的高度
float cameraHeight = Mathf.Cos(cameraAngle * Mathf.Deg2Rad) * distance;
//成像上半部分
float distanceDown = Mathf.Sin(cameraAngle * Mathf.Deg2Rad) * distance - Mathf.Tan(angleOuntside * Mathf.Deg2Rad) * cameraHeight;
//成像下半部分
float distanceUp = Mathf.Tan((cameraAngle + angleInside) * Mathf.Deg2Rad) * cameraHeight - Mathf.Sin(cameraAngle * Mathf.Deg2Rad) * distance;
顶视图:

float upOutLine = cameraHeight / Mathf.Cos((angleInside * 2 + angleOuntside) * Mathf.Deg2Rad);
float upCameraHeight = upOutLine * Mathf.Cos(angleInside * Mathf.Deg2Rad);
float upAreaHeight = 2.0f * upCameraHeight * Mathf.Tan(fieldOfView * 0.5f * Mathf.Deg2Rad);
float upAreaWidth = upCameraHeight * camera.aspect;
float downOutLine = cameraHeight / Mathf.Cos(angleOuntside * Mathf.Deg2Rad);
float downCameraHeight = downOutLine * Mathf.Cos(angleInside * Mathf.Deg2Rad);
float downAreaHeight = 2.0f * downCameraHeight * Mathf.Tan(fieldOfView * 0.5f * Mathf.Deg2Rad);
float downAreaWidth = downCameraHeight * camera.aspect;

本文探讨了透视相机在不同视角下,成像面积、相机高度与视野角度之间的数学关系。通过公式推导,详细阐述了正面视角和平面视角下如何计算这些参数,并提供了具体的代码实现,适用于游戏开发、计算机视觉等领域中的相机配置和场景理解。
289

被折叠的 条评论
为什么被折叠?



