1. 程式人生 > >Unity3D的世界座標與區域性座標轉化

Unity3D的世界座標與區域性座標轉化

Unity3D中分世界座標(World Space)和區域性座標。而Transform元件上所顯示Position,Rotation,Scale均為區域性座標。

本文均為個人理解,有誤希望大神能指出得以學習。

區域性座標是一種相對座標,相對層級檢視(Hierarchy)中的任意物件,而Transform元件上儲存的是相對自身的父物件的值。

在C#中可以通過Transform例項化的物件來訪問物件本身的Position,Rotation,Scale。這裡所訪問的Position,Rotation變數是世界座標系下的值。 

        transform.position;
        transform.rotation;
        transform.localScale;

若想獲取與元件上的本地座標則應訪問transform.localPosition; transform.localRotation;

有時需求世界座標或者區域性座標,然而無法很便利的直接訪問的情況下,Unity提供一個便利的API可以在物件的世界座標和區域性座標間相互轉化。需要注意的是區域性座標是相對一個物件來說的,因此世界座標轉成區域性座標需要給定相對物件的transform,例如從世界座標轉成相對父物件的區域性座標如下:

        transform.TransformPoint(transform.localPosition);
        //區域性座標轉世界座標
        transform.parent.InverseTransformPoint(transform.position);
        //世界座標轉區域性座標

有的小夥伴可能不是很理解既然可以直接訪問世界座標和區域性座標為什麼還要進行座標轉換,這裡舉一個例子,例如要使一個物件始終向自己的前方移動(或者說沿著區域性座標系移動),如果想通過修改Position的值來模擬物體的移動,那麼需要使用transform.forward獲取物體在世界座標中的前方,因此實現方法是:

    transform.position + transform.forward * speed;

這樣就可以通過修改Position來模擬物體向自己的前方移動了,但是這樣計算出來的Vector3是世界座標的值,如果特殊情況下我們需要獲得向前方移動後的區域性座標結果,那麼就需要使用這個API將計算的結果從世界座標轉換成區域性座標了。