關於Vector3.forward和Transform.forward


在Unity中有兩個forward,一個是Transform.forward一個是Vector3.forward。

 

對於Vector3來說,它只是縮寫。沒有其它任何含義。

  • Vector3.forward ,(0,0,1)的縮寫。//transform.Translate()使
  • Vector3.right, (1,0,0)的縮寫。
  • Vector3.up , (0,1,0)的縮寫。

對於Transform.forward來說,它代表當前物體的物體坐標系的z軸在世界坐標系上的指向。(世界坐標系中的藍色軸)。

如果使用Transform.Translate。需要注意Vector3和Transform是不同的。

他們之間的區別主要體現在在不同坐標系時的反映上。

 

1.Spcae.World

transform.Translate(Vector3.forward * Time.deltaTime, Space.World);
transform.Translate(transform.forward * Time.deltaTime, Space.World);

當局部坐標=世界坐標時。

 

當局部坐標!=世界坐標時。(旋轉30度)

 

2.Spcae.Self

transform.Translate(Vector3.forward * Time.deltaTime, Space.Self);
transform.Translate(transform.forward * Time.deltaTime, Space.Self);

當局部坐標=世界坐標時。

當局部坐標!=世界坐標時。(旋轉30度)

所以你會發現,當使用transform.Translate時參數是Space.Self。Transform.forward的移動方向會很奇怪。。

原因是transform.Translate參數Space.Self需要一個局部坐標系的方向向量,但是transform.forward是世界坐標的方向向量。

所以除非必要,否則別用這句代碼:

transform.Translate(transform.forward * Time.deltaTime, Space.Self);

這會讓你物體的前進方向變的混亂。

應該用:

transform.Translate(transform.forward * Time.deltaTime, Space.World);//或者
transform.Translate(Vector3.forward * Time.deltaTime, Space.Self);

小問題:為什么旋轉30°時,transform.Translate(transform.forward * Time.deltaTime, Space.Self);,這句代碼會讓物體往60°的方向移動呢?

首先transform.forward是自動對物體旋轉值算出前進方向向量的變量。同時 transform.forward是當前物體的物體坐標系的z軸在世界坐標系上的指向。系統根據物理本身的局部坐標系計算出z軸在世界坐標系上的旋轉值是30°,但是你使用transform.Translate並且設置了Space.Self按照局部坐標移動,那么,transform.forward這個30°的世界坐標的旋轉又要根據物體的局部坐標系轉化成局部坐標,那么兩次30°+30°就是最后我們所看到物體往世界坐標的60°旋轉方向移動。

 

3.總結

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、

//等於是在世界坐標的z軸前進。
transform.position += vector3.forward 

2、

//等於是物體自身坐標系的z軸前進。
transform.position += transform.forward 

3、

//等於是物體自身坐標系的z軸前進。效果等同於2。
transform.Translate(vector3.forward * Time.deltaTime,Space.Self) ;

4、

//上面出現的奇葩結果就是這個用法引起的,建議不是特殊需要別用這個用法。
transform.Translate(transform.forward * Time.deltaTime,Space.Self) 

5、

//等於是在世界坐標的z軸前進。效果等同於1。
transform.Translate(vector3.forward * Time.deltaTime,Space.World)

6、

//等於是讓物體沿着“物體自身坐標z軸在世界坐標上的方向”前進(等於是物體自身坐標系的z軸前進)。效果等同於2。
transform.Translate(transform.forward * Time.deltaTime,Space.World)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM