1. 程式人生 > >Unity學習筆記—本地坐標轉世界坐標

Unity學習筆記—本地坐標轉世界坐標

oid click unit game 希望 項目 坐標 解決 -s

先簡單介紹一下我是一個程序員(菜鳥程序員),用C#開發,在開發的過程中會遇到一些問題,當時解決了但是在遇到可能還會在犯,所以啟發我做這樣一個學習筆記系列,一來是希望能夠督促自己總結學習,二來是可以在變身之路上認識誌同道合的朋友們一起成長,我寫的不對的地方還望朋友們能夠指出來,有什麽問題可以留言,我們可以一起思考共同進步。
上周我在寫UI組件的時候的時候遇到一個問題——UI界面的坐標和世界坐標之間的轉換。今天我就先談談這個問題好了,其實主要是兩個方法。我們今天想說說本地坐標到世界坐標吧

從自身坐標到世界坐標

 public Transform testTra ;
    public Transform parentTra;
    Vector3 localPos;
    Vector3 worldPos;

    
void Awake() { localPos = testTra.localPosition; worldPos = parentTra.TransformPoint(localPos); } void Update() { if (Input.GetKeyDown(KeyCode.A)) { Debug.Log("localPos:" + localPos + "worldPos:" + worldPos); } }

核心用到的方法就是transform.TransformPoint( )

這個方法的返回值就是Vector3類型的世界坐標,transform就是相對的物體,括號裏的就是相對這個transform的本地坐標,比方說我現在的位置吧,知道我相對於我的鄰居的坐標:Pos1,和我相對於小區的坐標Pos2,轉換成世界坐標,結果是一樣的,怎麽做呢?一種表示方法就是:我的鄰居.TransformPoint(Pos1)這樣能返回我的世界坐標,還有一種:小區.TransformPoint(Pos2)這樣也能取得我的世界坐標。

看下圖我穿件出來的一個紅色的小球和一個平面

技術分享圖片

技術分享圖片

看右邊的坐標,我把小球放到了平面的裏面,紅色小球相對於平面的位置是(-2, 0, 0), 白色平面的位置是(2, 0, 0)
在看一下最後書按下A輸出的本地坐標是世界坐標分別是(-2, 0, 0)和(0, 0, 0)正確。本地坐標轉世界坐標就是這麽用的。

下一次我在說說世界坐標是怎麽轉換成本地坐標的。

Unity有世界坐標、本地坐標(localposition)、UI坐標(這個我好像還沒怎麽用)、屏幕坐標等等,之前的一個項目需要考慮世界坐標轉換為本地坐標,後來經過一番嘗試,找到了一種比較取巧的方法。

首先,世界坐標是指物體在場景中的坐標,當某個物體沒有父物體時,它的position即為世界坐標的position,rotation同理;本地坐標是物體相對於它的父物體的坐標而言( 父物體又套父物體的我還沒有研究),這個相對坐標是以父物體本身為坐標軸進行計算的,與世界坐標沒有必然聯系。而對於沒有父物體的物體,可以認為不存在本地坐標這種說法。另外有一點需要註意:當某個物體有父物體時,它的inspector欄transform中的position實際是localposition,即本地坐標。

那麽如何進行兩種坐標的互換呢?首先,本地坐標轉世界坐標已經有前輩提出了一種方法:點擊打開鏈接。其核心用到的方法就是transform.TransformPoint( )。

之後我考慮如何將世界坐標轉換為本地坐標(當然要相對某個“父”物體),沒找到相關函數。後來腦瓜子一拍:子物體展示在inspector界面的不就是本地坐標嘛!所以有了如下的實現方式:在需要轉換的世界坐標處建立一個空gameobject,將它的parent設置為你需要轉換為對應本地坐標的“父”物體。然後空gameobject.transform.localPosition即為所求。

等等,為什麽是localPosition而不是position呢?因為transform定義了這兩個參數,分別代表它的本地坐標和世界坐標。

所以。。。。。。如果你想要獲取一個子物體M的世界坐標,直接M.transform.position就搞定了!!!!!!

當然,如果你只有一個本地坐標想轉換成世界坐標,又懶得為此創建一個空gameobject,那就用前文提到的前輩的方法吧~~

Unity學習筆記—本地坐標轉世界坐標