之前寫了一篇關於在物體頭頂上顯示名字的隨筆。
估計難懂的點就在各種坐標的轉換。
這里詳細(就我這水平,怎么可能詳細~~~)解說一下。額.............
用另一種方式舉個栗子吧。
還是實現在物體的頭頂或某個部位顯示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 。
我們先把主角物體的世界坐標轉換成屏幕坐標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)。
但是呢,仔細看兩個的視口坐標是相對於哪個相機的~
思路也就是這樣:把這個物體的世界坐標相對應的世界相機的視口坐標找到,再把這個坐標對應到UI相機上,然后求出來這個UI相機上這個位置的視口坐標在3D世界里的位置。
殺了我吧~~~~~~~~~~~~~~~~~~~~~~~~~凌亂成一朵煙花。