1. 程式人生 > >unity中世界座標與區域性座標

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為主相機,當然也可以為場景中其他相機。這裡附帶一個滑鼠拖拽物體的程式碼,其中主要就是世界座標與螢幕座標之間轉換

  1. private Vector3 _vec3TargetScreenSpace;// 目標物體的螢幕空間座標  
  2.  private Vector3 _vec3TargetWorldSpace;// 目標物體的世界空間座標  
  3.  private Transform _trans;// 目標物體的空間變換元件  
  4.  private Vector3 _vec3MouseScreenSpace;// 滑鼠的螢幕空間座標  
  5.  private Vector3 _vec3Offset;// 偏移  
  1. void Awake( ) { _trans = transform; }   
  2.   IEnumerator OnMouseDown( )   
  3.     {   
  4.      // 把目標物體的世界空間座標轉換到它自身的螢幕空間座標   
  5.      _vec3TargetScreenSpace = Camera.main.WorldToScreenPoint(_trans.position);  
  6.      // 儲存滑鼠的螢幕空間座標(Z值使用目標物體的螢幕空間座標)   
  7.      _vec3MouseScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, _vec3TargetScreenSpace.z);  
  8.     // 計算目標物體與滑鼠物體在世界空間中的偏移量   
  9.      _vec3Offset = _trans.position - Camera.main.ScreenToWorldPoint(_vec3MouseScreenSpace);  
  10.     // 滑鼠左鍵按下   
  11.      while ( Input.GetMouseButton(0) ) {  
  12.    // 儲存滑鼠的螢幕空間座標(Z值使用目標物體的螢幕空間座標)  
  13.                        _vec3MouseScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, _vec3TargetScreenSpace.z);  
  14.    // 把滑鼠的螢幕空間座標轉換到世界空間座標(Z值使用目標物體的螢幕空間座標),加上偏移量,以此作為目標物體的世界空間座標  
  15.   _vec3TargetWorldSpace = Camera.main.ScreenToWorldPoint(_vec3MouseScreenSpace) + _vec3Offset;                
  16.    // 更新目標物體的世界空間座標   
  17.    _trans.position = _vec3TargetWorldSpace;  
  18.    // 等待固定更新   
  19.    yield return new WaitForFixedUpdate();  
  20.             }   
  21.     }  

         螢幕座標與視口座標之間的轉換

         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這篇文章。若有不對的地方,還望不吝賜教。