标签:坐标 宽高 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 }
正视图也是如此思路,就实现了该功能。
标签:坐标 宽高 summary 需求 lower 距离 scene span 不能
原文地址:https://www.cnblogs.com/answer-yj/p/12108342.html