zoukankan      html  css  js  c++  java
  • 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     }

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

  • 相关阅读:
    Lucene.Net
    授权
    测试
    Upgrade ASP.NET 1.1 To ASP.NET 2.0 Cookie
    Highlight
    缓存
    base
    System.Environment.UserDomainName 为什么不返回 当前的 Domainname
    英语骂人一百句
    比较动态调用代码
  • 原文地址:https://www.cnblogs.com/answer-yj/p/12108342.html
Copyright © 2011-2022 走看看