通过Field Of View值计算屏幕成像的宽高

3 篇文章 1 订阅
1 篇文章 0 订阅

透视相机相机成像的面积、相机高度和视野角度之间的关系

       

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;

 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值