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,則屏幕上的任意點都會轉換到同一點,即相機位置。