• Unity中正面视图的相机最大距离定位


    问题背景:

    Unity中在场景中有这样的需求,就是俯视整个场景或者平视整个场景。这种情况下场景中物体长宽比不一定和相机视口长宽比一致,要保证所有的物体都在视口内,并且距离不能太远,,所以处理起来需要点手段。

    原图场景:

    Cube模拟场景外包盒:

    效果如下:

    效果一:

     效果二:

    正是这样,正好把相机卡到最大边,主要是物体长宽比和视口宽高比不一致,需要动态计算下这个比例。

    分析草图:

    代码如下:

     1 /// <summary>
     2     /// 俯视场景
     3     /// </summary>
     4     private void FuShiScene()
     5     {
     6         //效果一
     7         //场景中物体外包盒的左下角和右上角坐标(测试定义数据,具体以实体物体(外包轮廓)为准),W>=L
     8         // var upperbounds =new Vector3(3.0f,1.0f,6.0f);
     9         // var lowerBounds = new Vector3(-3.0f, -1.0f, -6.0f);
    10 
    11         //效果二
    12         //场景中物体外包盒的左下角和右上角坐标(测试定义数据,具体以实体物体(外包轮廓)为准),L>=W
    13         var upperbounds = new Vector3(2.0f, 1.0f, 3.0f);
    14         var lowerBounds = new Vector3(-2.0f, -1.0f, -3.0f);
    15 
    16         //外包盒(场景物体中心点)中心点
    17         var center = (upperbounds + lowerBounds) * 0.5f;
    18 
    19         //场景物体的外包盒尺寸(高宽长)
    20         var heright = upperbounds.y - lowerBounds.y;
    21         var width = upperbounds.z - lowerBounds.z;
    22         var length = upperbounds.x - lowerBounds.x;
    23 
    24         //场景外包盒顶端中心点
    25         var upCenter = center + Vector3.up * 0.5f * heright;
    26 
    27         //视口半角
    28         float angle = Camera.main.fieldOfView * 0.5f * Mathf.Deg2Rad;
    29 
    30         //向上偏移量
    31         var offset = 0.0f;
    32 
    33         //宽高比相同时(Camera.main.aspect  即 获取或者设置Camera视口的宽高比例值)
    34         if ((length / width) == Camera.main.aspect)
    35         {
    36             offset = (width * 0.5f) / Mathf.Tan(angle);
    37         }
    38         else
    39         {
    40             //宽高比不一致的话,若长>宽,公式相机长宽比=外包盒长宽比,宽度指定不等同宽高比的宽,求动态宽
    41             if (length >= width)
    42             {
    43                 offset = (length / Camera.main.aspect) * 0.5f / Mathf.Tan(angle);
    44             }
    45             //宽高比不一致的话,若宽>=长,公式相机长宽比=外包盒长宽比,相机长>宽,实体长<宽,宽进来,总体就进来了,所以以宽为准
    46             else
    47             {
    48                 offset = (width) * 0.5f / Mathf.Tan(angle);
    49             }
    50         }
    51 
    52         // 计算旋转(垂直)
    53         var rotation = Quaternion.Euler(new Vector3(90.0f, 0.0f, 0.0f));
    54 
    55         //求相机应当所处的目标位置
    56         var position = upCenter - (rotation * Vector3.forward).normalized * offset;
    57 
    58         // 更新位置
    59         Camera.main.transform.position = position;
    60         Camera.main.transform.rotation = rotation;
    61     }

    正视图也是如此思路,就实现了该功能。

  • 相关阅读:
    OpenGL中glVertex、显示列表(glCallList)、顶点数组(Vertex array)、VBO及VAO区别
    OpenGL FrameBufferCopy相关Api比较(glCopyPixels,glReadPixels,glCopyTexImage2D,glFramebufferTexture2D)
    OpenGL渲染流程
    GPU大百科全书索引(有助于理解openGL工作流程)
    二进制配置文件为什么比json等配置文件效率高
    游戏开发中的矩阵初探
    Objective-C 30分钟入门教程
    cocos2dx骨骼动画Armature源码分析(三)
    cocos2dx骨骼动画Armature源码分析(二)
    linux中df和du查看磁盘大小不一致解决方法(转载)
  • 原文地址:https://www.cnblogs.com/answer-yj/p/12108342.html
Copyright © 2020-2023  润新知