码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2019-12-27 19:45:54      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:坐标   宽高   summary   需求   lower   距离   scene   span   不能   

问题背景:

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中正面视图的相机最大距离定位

标签:坐标   宽高   summary   需求   lower   距离   scene   span   不能   

原文地址:https://www.cnblogs.com/answer-yj/p/12108342.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!