Transform.Forward 和 Vector3.Forward 有什么区别

    xiaoxiao2025-05-29  7

     

    Vector3.forward 只是一个定值,它只是Vector3(0,0,1) 的缩写, 它的值是 世界坐标系中 Z 轴的指向, 值是不会改变的。

    Transform.forward 表示一个向量,即当前物体的物体坐标系的z轴在世界坐标系上的指向。

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


    Spcae.World


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

    下面两个 Cube 的物体坐标和世界坐标相同时

    现在下面两个Cube 的物体坐标与世界坐标不相等了, 它们都旋转了 30度

    现在红色的Cube 即使旋转了30 度, 但是它是 按 Vector3.forward 来移动的,所以它是按世界坐标轴的Z 轴进行移动的, 因为图中的Z轴是在正前方, 所以红色的Cube 往前移动。现在黑色的Cube 也使旋转了30 度, 但是它是 按 transform.forward 来移动的,所以它是按自身的物体坐标系的Z轴移动的。

    Spcae.Self


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

    下面两个 Cube 的物体坐标和世界坐标相同时

    现在下面两个Cube 的物体坐标与世界坐标不相等了, 它们都旋转了 30度

    当使用 transform.Translate时第二个参数是 Space.Self时。Transform.forward的移动方向移动了60度。

    原因是 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°旋转方向移动。

     

    最新回复(0)