Unity中的各種坐標系及相互轉化(借鑒大神,僅作為筆記用)


 Unity作為一個3D開發引擎,他的各系坐標系錯綜復雜,學過矩陣的朋友可能還繞得開,沒有學會的一不小心就掉進坐標坑里面了,其實各系坐標的區別在於所建立的坐標系參照不同,下面先了解下各大坐標吧,我盡量說的通俗點。

1.坐標系

   1.世界坐標系:以世界原點為坐標原點建立的三維坐標系,凡是在Unity的游戲對象均有自己的世界坐標系,且獲取坐標的方法很簡單(transform.position),這類似與現實世界我們常說的經緯度,常用來做定義位置,方向的標准。

  2.本地坐標(自身坐標):以自身為原點而建立的三維坐標系,該坐標為局部坐標,與世界坐標系一樣,凡是Unity的游戲對象均有自己的自身坐標,獲取坐標的方法也很簡單(transform.localposition),常用來用於定義自身方向,初始局部位置來用,例如背包當更換物品是其實實在更換UI,而更換UI實則更換UI父對象,然后讓transform.localposition=Vector3.zero讓他等於其父對象的位置。

3.屏幕坐標:以屏幕左下角為原點建立的一個二維坐標系.以屏幕的左下角為(0,0),右上角為(Screen.width,Screen.height),這個坐標坑最多,也是我們經常最繞的一個坐標,這里就詳解下,首先屏幕要知道是相對屏幕。舉個例子,現實的投影儀大家很清楚,我們在天花板頂上放一個投影儀,然后投影的影像映射到牆面上或幕布上,這牆面或幕布的影像區域就是屏幕,當我們移動幕布的時候,屏幕的大小也在變化,這就跟我們幕布到投影儀的垂直距離有關,這個垂直距離就是我們的Z軸,后面的屏幕坐標轉世界坐標會講到。值得注意的一點屏幕的坐標跟分辨率的關系,當我們的分辨率是600*800的時候,但我們截取其中的200*200作為屏幕的話,那么屏幕的左下角坐標為(0,0),屏幕右上角坐標為(200,200)。屏幕坐標常用於鼠標交互,而獲取的鼠標坐標就屬於屏幕坐標(input.mouseposition)。

4.視口坐標:以相機屏幕左下角為原點建立的一個二維坐標系,左下角為(0,0),右上角為(1,1),它的Z軸即是攝像機的Z軸,上面的示例中投影儀屏幕上建立的坐標就是視口坐標,這個坐標大多用來過渡轉化坐標作用,例如世界坐標轉屏幕坐標,世界坐標轉視口坐標,視口坐標轉屏幕坐標。

還有GUI坐標,投影坐標,系統桌面坐標,網格坐標等這些基本很少用到,所以這里懶得去一一贅述了。

2.坐標轉換

1.本地互轉世界:Unity封裝成方法transform.TransformVector,transform.TransformPoint,transform.TransformDirection,這個轉換的意義不大,要獲取直接可以通過上述講的方法可直接獲取。

2.屏幕坐標轉世界坐標:有很多人和很多博客直接用Camera.main.ScreenToWorldPoint(Input.mouseposition)直接轉,這樣是不可以的,因為Input.mouseposition是一個屏幕坐標,沒有Z軸,而我們的世界坐標需要Z軸的,類似於我們需要知道幕布到投影儀的距離我們才可以將幕布上的一個點轉換到世界上來.

                 public Vector3 myscreenToworld(Vector3 mousepos,Transform targetTransform) {
        //先計算相機到目標的向量
        Vector3 dir = targetTransform.position - Camera.main.transform.position;
        //計算投影
        Vector3 normardir = Vector3.Project(dir, Camera.main.transform.forward);
        //計算是節點,需要知道處置屏幕的投影距離
        Vector3 worldpos = Camera.main.ScreenToWorldPoint(new Vector3(mousepos.x, mousepos.y, normardir.magnitude));
        return worldpos;
    }

3.世界轉屏幕: 

Camera.main.WorldToScreenPoint()

世界轉屏幕的過程是這樣的:[世界->視口] *[視口->屏幕],學過矩陣的都知道最后可以變為[世界->屏幕],所以上面的是Unity進行了封裝的結果,有興趣的查找下底層自己轉試下

4.世界轉視口

Camera.main.WorldToViewportPoint()

5.視口轉屏幕

Camera.main.ViewportToScreenPoint()或者自己手寫Vector2 pos=new Vector2(Viewposition.x*Screen.width,Viewposition.y*Screen.hight).


免責聲明!

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



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