unity中世界座標與區域性座標
本人學生一枚,剛接觸unity3D,若有理解得不對的地方,還望各路大神不吝賜教~
unity中的座標系統包括世界座標(World Space),螢幕座標(Screen Space),視口座標(View Space)以及GUI座標系統。
世界座標(World Space)
場景中新增的物件,它們是以世界座標顯示在場景中,可以通過程式碼transform.position獲得該物件的世界座標,那麼我們在檢視面板(Inspector)中看到的Position的值在物件沒有父物體時,這個值和transform.position得到的結果一致的,若該物件有父物體,那麼檢視面板中(Inspector)看到的即為相對於父物體的相對座標位置,這樣通過transform.position得到的值自然就不一樣了。總之,通過transform.position得到的都是物件的世界座標。在物件存在父物體的情況下,若想要得到該物件在檢視面板(Inspector)中的值,可以通過transform.Localposition得到。
螢幕座標(Screen Space)
螢幕座標是通過畫素來定義的,螢幕座標的座標系以螢幕左下角為(0,0)點,右上角為(Screen.width,Screen.height),螢幕座標為3維座標,z的大小由相機的世界位置來定義。通過Input.mousePosition得到的是螢幕座標,螢幕座標的數值只與螢幕的大小有關,跟解析度沒有關係。
視口座標(View Space)
視口座標標準化後的螢幕座標,它的座標原點同樣是左下角為(0,0)點,只不過右上角為(1,1)點,若物件處在場景的正中間,則物件的視口座標為(0.5,0.5),與螢幕座標一樣,視口座標也是一個3維的,它的z方向的數值由相機的世界位置來決定。
GUI座標系
GUI座標系主要在通過OnGUI方法繪製螢幕UI介面時運用較多,GUI座標系是一個2維座標系,與螢幕空間類似,所表示的範圍也是整個螢幕空間範圍,只不過GUI座標的座標原點在左上角,即左上角為(0,0)點,右下角為(Screen.width,Screen.height)。
座標之間的轉換
世界座標通過transform.position獲得
區域性座標通過transform.Localposition獲得
世界座標與螢幕座標之間的轉換
Camera.main.ScreenToWorldPoint(Vector 3) ——螢幕座標轉換到世界座標,其中的main為主相機,當然也可以為場景中其他相機
Camera.main.WorldToScreenPoint(transform.position)——世界座標轉換到螢幕座標 ,其中的main為主相機,當然也可以為場景中其他相機。這裡附帶一個滑鼠拖拽物體的程式碼,其中主要就是世界座標與螢幕座標之間轉換
- private Vector3 _vec3TargetScreenSpace;// 目標物體的螢幕空間座標
- private Vector3 _vec3TargetWorldSpace;// 目標物體的世界空間座標
- private Transform _trans;// 目標物體的空間變換元件
- private Vector3 _vec3MouseScreenSpace;// 滑鼠的螢幕空間座標
- private Vector3 _vec3Offset;// 偏移
- void Awake( ) { _trans = transform; }
- IEnumerator OnMouseDown( )
- {
- // 把目標物體的世界空間座標轉換到它自身的螢幕空間座標
- _vec3TargetScreenSpace = Camera.main.WorldToScreenPoint(_trans.position);
- // 儲存滑鼠的螢幕空間座標(Z值使用目標物體的螢幕空間座標)
- _vec3MouseScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, _vec3TargetScreenSpace.z);
- // 計算目標物體與滑鼠物體在世界空間中的偏移量
- _vec3Offset = _trans.position - Camera.main.ScreenToWorldPoint(_vec3MouseScreenSpace);
- // 滑鼠左鍵按下
- while ( Input.GetMouseButton(0) ) {
- // 儲存滑鼠的螢幕空間座標(Z值使用目標物體的螢幕空間座標)
- _vec3MouseScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, _vec3TargetScreenSpace.z);
- // 把滑鼠的螢幕空間座標轉換到世界空間座標(Z值使用目標物體的螢幕空間座標),加上偏移量,以此作為目標物體的世界空間座標
- _vec3TargetWorldSpace = Camera.main.ScreenToWorldPoint(_vec3MouseScreenSpace) + _vec3Offset;
- // 更新目標物體的世界空間座標
- _trans.position = _vec3TargetWorldSpace;
- // 等待固定更新
- yield return new WaitForFixedUpdate();
- }
- }
螢幕座標與視口座標之間的轉換
Camera.ScreenToViewportPoint()方法將螢幕座標轉化為視口座標
螢幕座標與視口座標之間的轉換
螢幕座標與視口座標只有原點的選定不同,數值範圍是一致的,這裡借用一下http://blog.csdn.net/qinyuanpei/article/details/49438919這篇部落格中提到的方法來進行座標之間的轉換
private Vector2 ScreenToGUIPoint(Vector2 v)
{
return new Vector2(v.x,Screen.heigth-v.y)
}
這個方法同樣可以將GUI座標轉換為螢幕座標而不用修改任何地方。
就寫這麼多了,今天在自己的小程式中遇到了關於幾種座標之間的轉換問題,檢視相關的部落格文章,問題得以解決,將所學所得拿出來與大家分享,關於座標的轉換,大家也可以參考http://blog.csdn.net/qinyuanpei/article/details/49438919這篇文章。若有不對的地方,還望不吝賜教。