1. 程式人生 > >unity------------------------------transform.forward與Vector.forward的區別

unity------------------------------transform.forward與Vector.forward的區別

iss 需要 position 兩個 多人 war 會有 jsb scene

在unity3d中有2個forward,一個是vector3.forward和transform.forward,這兩個forward其實完全不一樣。他們之間的區別主要體現在在不同坐標系時的反映上。

我們分別對比一下 vector3和transform兩個向量的forward 在 self自身坐標系 和 world世界坐標系 中的表現,我們用transform.translate函數來驗證。。

註:自身坐標!=世界坐標 意味著兩個坐標系不重合。

self自身坐標系——space.self

vector3.forward

技術分享

transform.forward

技術分享

在這裏我就感到很困惑了,為什麽transform.forward轉自身坐標後會有如此詭異的結果。

技術分享

畫完上面的圖後終於明白了。

self自身坐標系的轉換是這樣的:

將想要轉換的向量跟相對於世界坐標軸整個移到目標坐標軸上。

技術分享

在transform.forward身上就是

技術分享

那麽這裏總結一下 vector3.forward和transform.forward的區別。

vector3.forward的值永遠等於(0,0,1)。

transform.forward的值則等於當前物體的自身坐標系z軸在世界坐標上指向,因此不一定等於(0,0,1),但是其magnitude長度是1。

這也就是為什麽,transform.forward 轉換為self自身坐標系時會有這種結果。

在world世界坐標系——space.world上的情況則完全相反。

因此,想要讓物體向前移動,在transform.translate()上和直接修改transform.position上,差別是挺大的。

transform.position 本身就是世界坐標。

1、transform.position+= vector3.forward

等於是在世界坐標的z軸前進。

2、transform.position+=transform.forward

等於是物體自身坐標系的z軸前進。

3、transform.translate(vector3.forward,space.self)

等於是自身坐標系的z軸前進。

效果等同於2。

4、transform.translate(transform.forward,space.self)

上面出現的奇葩結果就是這個用法引起的,建議不是特殊需要別用這個用法。

5、transform.translate(vector3.forward,space.world)

等於是讓物體沿著世界坐標的z軸前進。

效果等同於1。

6、transform.translate(transform.forward,space.world)

等於是讓物體沿著“物體自身坐標z軸在世界坐標上的方向”前進(等同與物體沿著自身z軸前進)。

效果等同於2。

技術分享

沒想到這篇小小的文章這麽多人看,搞得我詐屍回來補充點說明。

其實transform大家可以理解為 scene視圖裏面 每個gameobject身上的那三個箭頭,你也可以理解為transform就是自身坐標系。transform上每個箭頭就是對應transform.up transform.right transform.forward 這三個世界坐標向量,這三個向量絕對不是vector3.up vector3.forward vector3.right之流全是(0,1,0)(0,0,1)(1,0,0),不過magnitude都是1就是了,從圖裏看就知道了。

圖中 transform.forward=(0, 0.9, -0.5)

那麽 transform.translate(tranform.forward,space.self) 就是 往自身坐標系的(0, 0.9, -0.5) 這個方向走。

那麽用Transform的TransformPoint()轉換成世界坐標就是 (-0.7, 3.9, -25.8),也就是gameobject這個物體的實際移動方向是(-0.7, 3.9, -25.8)。

unity------------------------------transform.forward與Vector.forward的區別