U3D屏幕空间到世界空间变换


using
UnityEngine; using System.Collections; public class FPSCam : MonoBehaviour { Vector3 lastPos; Vector3 newPos; Camera thisCamera; void Start () { thisCamera = GetComponent<Camera> (); } void OnGUI(){ string strInfo = string.Format ("{0}, {1}, {2}", newPos.x, newPos.y, newPos.z); GUI.Label (new Rect(10, 10, 200, 100), strInfo); } // Update is called once per frame void Update () { newPos = (Input.mousePosition); newPos.z = 0.00001f; //thisCamera.nearClipPlane; //屏幕空间到世界空间的转换。应深刻理解三维变换过程:世界空间->相机空间->投影空间->屏幕空间。 //世界空间到相机空间通过viewMatrix来实现。vm可以直接通过相机的三个向量来组成,这三个向量是look, up, right。 //相机空间里以相机位置为原点,朝向Z轴正向,X向右,Y向上。 //相机空间到投影空间的变换是通过projectionMatrix实现,通过PM,将视锥压缩到一个边长为2的半立方体中,x(-1,1),y(-1,1),z(0,1) //投影空间到屏幕空间的变换将投影半立方体的东西投影到二维平面上并作视口及屏幕坐标系变换。 //由此,屏幕空间到世界空间的转换是以上的逆过程。注意, 此变换需要传递一个相机空间的Z值,即相对于相机位置的Z。 //如:newPos =(x,y,0.1)表示将屏幕上点(x,y)转换到世界空间,深度为相机前方0.1 //注意:当newPos.z无限趋于0时,变换后的点在世界空间中就无限趋于相机位置。 newPos = thisCamera.ScreenToWorldPoint (newPos); lastPos = newPos; } void FixedUpdate(){ //newPos = Input.mousePosition; } }

 

 相机的near, far都是相机空间的相对值,0表示相机位置处。
投影变换是将相机平截体压缩到一个边长为2的半立方体中,这个半立方体就是投影空间。
屏幕空间到世界空间转换时,首先要指定使用哪个相机,变换是绑定于相机的变换。
还需要指定一个Z值,因为一个屏幕点对应到世界空间是一条射线上的无数个点,
必须指定一个Z才能确定一个唯一点。这个Z值是相对相机位置的,
如果指定0,则屏幕上的任意点都会转换到同一点,即相机位置。

posted @ 2016-11-18 14:14  时空观察者9号  阅读(2495)  评论(0编辑  收藏  举报