Unity3D研究院之获取摄像机的视口区域
2016-11-29 14:56
489 查看
摄像机分为两种,一种是正交摄像机还有一种是透视摄像机。正交摄像机无论远近它的视口范围永远是固定的,但是透视摄像机是由原点向外扩散性发射,也就是距离越远它的视口区域也就越大。那么我们如何获取距离摄像机任意距离的视口区域呢?如下图所示,分别用红色和黄色两种颜色将计算出来的视口区域标记了出来。
![](http://www.xuanyusong.com/wp-content/uploads/2014/07/Foxmail20140731_1.png)
下面上代码,把如下脚本挂在摄像机出直接运行游戏即可看到。
这个脚本是我在逛国外网站无意间发现的,我这里翻译成了C#语言。http://answers.unity3d.com/questions/509466/scale-box-collider-to-camera-view-1.html?sort=oldest
我们可以根据文章里的算法计算出视口3D的坐标点,有了坐标信息那么想干什么都好干了,呵呵。
本文固定链接: http://www.xuanyusong.com/archives/3036
转载请注明: 雨松MOMO 2014年07月31日 于 雨松MOMO程序研究院 发表
![](http://www.xuanyusong.com/wp-content/uploads/2014/07/Foxmail20140731_1.png)
下面上代码,把如下脚本挂在摄像机出直接运行游戏即可看到。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | using UnityEngine; using System.Collections; public class CameraView : MonoBehaviour { private Camera theCamera; //距离摄像机8.5米 用黄色表示 public float upperDistance = 8.5f; //距离摄像机12米 用红色表示 public float lowerDistance = 12.0f; private Transform tx; void Start (){ if ( !theCamera ) { theCamera = Camera.main; } tx = theCamera.transform; } void Update (){ FindUpperCorners(); FindLowerCorners(); } void FindUpperCorners (){ Vector3[] corners = GetCorners( upperDistance ); // for debugging Debug.DrawLine( corners[0], corners[1], Color.yellow ); // UpperLeft -> UpperRight Debug.DrawLine( corners[1], corners[3], Color.yellow ); // UpperRight -> LowerRight Debug.DrawLine( corners[3], corners[2], Color.yellow ); // LowerRight -> LowerLeft Debug.DrawLine( corners[2], corners[0], Color.yellow ); // LowerLeft -> UpperLeft } void FindLowerCorners (){ Vector3[] corners = GetCorners( lowerDistance ); // for debugging Debug.DrawLine( corners[0], corners[1], Color.red ); Debug.DrawLine( corners[1], corners[3], Color.red ); Debug.DrawLine( corners[3], corners[2], Color.red ); Debug.DrawLine( corners[2], corners[0], Color.red ); } Vector3[] GetCorners ( float distance ){ Vector3[] corners = new Vector3[ 4 ]; float halfFOV = ( theCamera.fieldOfView * 0.5f ) * Mathf.Deg2Rad; float aspect = theCamera.aspect; float height = distance * Mathf.Tan( halfFOV ); float width = height * aspect; // UpperLeft corners[ 0 ] = tx.position - ( tx.right * width ); corners[ 0 ] += tx.up * height; corners[ 0 ] += tx.forward * distance; // UpperRight corners[ 1 ] = tx.position + ( tx.right * width ); corners[ 1 ] += tx.up * height; corners[ 1 ] += tx.forward * distance; // LowerLeft corners[ 2 ] = tx.position - ( tx.right * width ); corners[ 2 ] -= tx.up * height; corners[ 2 ] += tx.forward * distance; // LowerRight corners[ 3 ] = tx.position + ( tx.right * width ); corners[ 3 ] -= tx.up * height; corners[ 3 ] += tx.forward * distance; return corners; } } |
我们可以根据文章里的算法计算出视口3D的坐标点,有了坐标信息那么想干什么都好干了,呵呵。
本文固定链接: http://www.xuanyusong.com/archives/3036
转载请注明: 雨松MOMO 2014年07月31日 于 雨松MOMO程序研究院 发表
相关文章推荐
- (转载)Unity3D研究院之获取摄像机的视口区域
- Unity3D for VR 学习(4): 自绘摄像机的视口区域锥体
- Unity3D for VR 学习(4): 自绘摄像机的视口区域锥体
- Unity3D for VR 学习(4): 自绘摄像机的视口区域锥体
- Unity获取摄像机的视口区域
- Unity 获取摄像机的视口区域
- Unity3D研究院之获取摄像机的视口区域
- Unity3D for VR 学习(4): 自绘摄像机的视口区域锥体
- Unity3D研究院之获取摄像机的视口区域
- Unity3D研究院之主角面朝方向一定区域内对象角度计算(四十五)
- 获取透视摄像机的可视区域
- Unity3D研究院之主角面朝方向一定区域内对象角度计算
- Unity3D研究院之主角面朝方向一定区域内对象角度计算
- Unity3D研究院之处理摄像机与角色之间被挡时的局部透明效果
- (转载)Unity3D研究院之处理摄像机与角色之间被挡时的局部透明效果
- u3d之世界坐标系,屏幕坐标系,视口坐标系,如何获取物体距离摄像机的距离
- Unity3d 梦魇射手--摄像机的射线检测(获取鼠标点击位置的检测)
- 菜鸟在线Unity3d教程:如何获取摄像机图像?
- Unity3D研究院之主角面朝方向一定区域内对象角度计算(四十五)
- Unity3D研究院之主角面朝方向一定区域内对象角度计算