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

Posted answer-yj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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     }

 

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

以上是关于Unity中正面视图的相机最大距离定位的主要内容,如果未能解决你的问题,请参考以下文章

Unity实现相机跟随

如何在 Unity / C# 中访问 Cinemachine 的相机距离值?

是否可以通过 2d-3d 点关系获得图像或相机位置的正面平行视图?

unity获取相机高度

镜面高光取决于相机距离

将图像视图定位为相机预览上的叠加图像