透视相机相机成像的面积、相机高度和视野角度之间的关系
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;