1. 程式人生 > >Unity中的各種座標系及相互轉化

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).

好了,就先寫到這了,有什麼疑問歡迎留言,有錯的或者不同看法的也歡迎留言。

--------------------- 作者:小柯來了 來源:CSDN 原文:https://blog.csdn.net/qq_40786931/article/details/79084344?utm_source=copy 版權宣告:本文為博主原創文章,轉載請附上博文連結!