unity------------------------------transform.forward與Vector.forward的區別
在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的區別