實例詳解Unity各種座標的轉換

實現在物體的頭頂或某個部位顯示UI並跟隨物體的移動改變位置。

     先把栗子端上來:

public Transform Boy;//帥帥的主角
public Transform UI;//對主角死纏爛打的UI君
Camera cam;//主相機
void Update ()
{

     UI.localPosition = cam.WorldToScreenPoint(Boy.position) - new Vector3(Screen.width / 2, Screen.height / 2, 0);
}

好長一串兒代碼急死人。聽我慢慢道來~

 首先無非就是求UI的localPosition 。(這就是屏幕座標)

下圖就是上面公式減法的由來2208/2 =1104,1380/2 = 690; Image.localPosition = new Vector3(1140,690,0);





 我們先把主角物體的世界座標轉換成屏幕座標cam.WorldToScreenPoint(Boy.position)。然後這個值就變成了主角顯示在屏幕上的座標,相對應的就好比是Screen.width這種,對,它們是一個次元的。

 然並卵,我們的UI的座標可是相對於UI Root來的~

 怎麼辦呢~

 注意看這張我截取的NGUI的小破圖:

技術分享,UI Root下邊的子UI們的(0,0,0)是在屏幕的正中心。而屏幕座標系的(0,0,0)呢~在屏幕的左下角,所以它們之間,差了半個屏幕的寬和高。

真相只有一個,用得到的物體的屏幕座標減去半個屏幕的寬和高,就可以得到ui的相對座標啦~~~~~~~~~~~~~~~~~~~~~~~~

 

 

那麼,之前那個栗子是什麼意思呢:

 Vector3 pos = cam.WorldToViewportPoint(Boy.position);
 UI.transform.position = UIcam.ViewportToWorldPoint(pos);
第一句是先得到主角相對於視窗的視口座標。
第二句是將得到的視口位置再轉化爲世界座標。
納尼?

   額,視口座標是相對於相機的。相機的左下爲(0,0);右上是(1,1)。

   但是呢,仔細看兩個的視口座標是相對於哪個相機的~

    思路也就是這樣:把這個物體的世界座標(position)相對應的世界相機的視口座標找到,我們稱這個座標爲A(A= pos 只是pos是相對於世界相機上的位置),再把這個A座標對應到UI相機上,我們把A對應到UI相機上的座標稱爲B(B= pos 只是pos是相對於UI相機上的位置),然後求出來這個UI相機上這個位置的視口座標B在3D世界裏的位置,我們稱這個位置爲C,C就是上面的UI.transform.position。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章