[轉] Unity3D的四種坐標系


http://blog.csdn.net/zuoyamin/article/details/8813424

  1. World Space(世界坐標):我們在場景中添加物體(如:Cube),他們都是以世界坐標顯示在場景中的。transform.position可以獲得該位置坐標。            
  2. Screen Space(屏幕坐標):以像素來定義的,以屏幕的左下角為(0,0)點,右上角為(Screen.width,Screen.height),Z的位置是以相機的世界單位來衡量的。注:鼠標位置坐標屬於屏幕坐標,Input.mousePosition可以獲得該位置坐標,手指觸摸屏幕也為屏幕坐標,Input.GetTouch(0).position可以獲得單個手指觸摸屏幕坐標。

  3. ViewPort Space(視口坐標):視口坐標是標准的和相對於相機的。相機的左下角為(0,0)點,右上角為(1,1)點,Z的位置是以相機的世界單位來衡量的。(用的不多,反正我暫時沒有用到~呵呵~)

  4. 繪制GUI界面的坐標系:這個坐標系與屏幕坐標系相似,不同的是該坐標系以屏幕的左上角為(0,0)點,右下角為(Screen.width,Screen.height)。

  • 世界坐標→屏幕坐標:camera.WorldToScreenPoint(transform.position);這樣可以將世界坐標轉換為屏幕坐標。其中camera為場景中的camera對象。

  • 屏幕坐標→視口坐標:camera.ScreenToViewportPoint(Input.GetTouch(0).position);這樣可以將屏幕坐標轉換為視口坐標。其中camera為場景中的camera對象。

  • 視口坐標→屏幕坐標:camera.ViewportToScreenPoint();

  • 視口坐標→世界坐標:camera.ViewportToWorldPoint();
  • 案例1——在鼠標點擊的位置上繪制一張圖片出來(關於繪制GUI界面坐標系與屏幕坐標系之間的關系)。

 

using UnityEngine;
 using System.Collections;
 public class test : MonoBehaviour   {        
      //圖片  
    public Texture img;    
     //儲存鼠標的位置坐標    
    private Vector2 pos;   
     void OnGUI()   
      {           
          //鼠標左擊,獲取當前鼠標的位置       
       if (Input.GetMouseButton(0))         
          {       
               pos = Input.mousePosition;           
           }        
             //繪制圖片      
        GUI.DrawTexture(new Rect(pos.x,Screen.height - pos.y,100,100), img);       
      }   
}

 

案例2——坐標顯示和坐標轉換(這個是觸摸方面的。如果沒有觸摸屏,那就將那個if去掉吧!)

 

using UnityEngine;   
using System.Collections;   
public class test: MonoBehaviour   {       
     //場景的相機,拖放進來      
    public Camera camera;        
     //場景的物體      
    private GameObject obj;    
      void Start()      
       {        
            //初始化      
        obj = GameObject.Find("Plane");       
        }       
         void Update ()     
         {            
               //有觸摸         
          if (Input.touchCount > 0)            
               {                 
                   print("世界坐標" + obj.transform.position);                  
                    print("屏幕坐標" + Input.GetTouch(0).position);                  
                    print("世界坐標→屏幕坐標" + camera.WorldToScreenPoint(obj.transform.position));                  
                    print("屏幕坐標→視口坐標" + camera.ScreenToViewportPoint(Input.GetTouch(0).position));                 
                   print("世界坐標→視口坐標" + camera.WorldToViewportPoint(obj.transform.position));             
            }       
      } 
}

 

場景中有一個照3D物體的透視攝像機,NGUI使用自己獨立的正交攝像機,轉換步驟如下: 

 

1. 使用透視攝像機把世界坐標轉換到屏幕坐標

Vector3 pos = Camera.main.WorldToScreenPoint(worldPos);

pos.z = 0f;   //z一定要為0.

 

2. 使用UI攝像機轉換到NGUI的世界坐標

Vector3 pos2 = UICamera.currentCamera.ScreenToWorldPoint(pos);

 

3. 賦值給NGUI控件

temp.transform.position = pos2; //temp為NGUI控件.

 

 

所有坐標系統間轉換, 可以通過屏幕坐標作為橋梁, 各坐標系映射到屏幕坐標再轉換到目標坐標系。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM