如何沿局部 x、y、z 轴平移? (戈多)
How to translate along local x, y, z axis? (Godot)
我是一名业余开发者,开始在 Godot 3 中开发一款简单的第三人称 3D 游戏。我设置了一些控件,允许 KinematicBody(名为 Player)根据 WASD 输入沿 x 轴和 z 轴移动。我还有一个 Camera 作为 Player 的子项,因此相机跟在后面并相对于 Player 旋转。
然而,当 Camera 旋转时,向前按仍会沿全局 z 轴移动 Player!我会想象当玩家旋转并且你向前按时,玩家应该远离相机。
是否有内置的方法可以根据玩家的旋转沿 x 或 z 轴移动?即向前按沿局部负 z 轴平移,使其局部向前移动。
我已经阅读了 Transform()
和 Basis()
的文档,似乎相关但不太清楚;或者至少超出我的 skill/understanding.
我做了一些研究,这是我发现的:
出于性能和技术原因,Godot(和大多数其他 3D 应用程序)不使用所谓的欧拉角进行旋转(可以通过编辑器中的旋转 3D gizmo 可视化)。相反,它使用基础向量变换。
相反,假设您制作了一个 2D 对象并给它 2 个相隔 90 度且长度相同的向量;一个在 x 轴上,一个在 y 轴上。这些是对象的 "local" x 和 y 坐标。当旋转对象时,它不是旋转对象本身,而是改变向量端点的坐标,使它们相隔 90 度并且长度相同,从而导致其局部 x 和 y 变为 "rotate"。有点像如果你用手做一个 'L',把它放在 table 上,然后来回旋转。旋转不存储在你手的角度,它存储在你指尖的位置。
3D 中也会发生同样的事情,但会沿 z 轴添加第三个向量。然而,最重要的是,您可以引用这些向量并通过执行 transform.basis.[x,y,z]
来使用它们。在你的情况下,你已经有类似的东西:
movement = Vector3(0,0,0)
if Input.is_action_pressed("ui_up"):
movement.z -= 1
但是,不是沿着任意向量移动,而是应该将基础 z 向量添加到移动向量中:
movement = Vector3(0,0,0)
if Input.is_action_pressed("ui_up"):
movement -= transform.basis.z.normalized()
我将向量归一化以消除任何缩放。要了解有关添加矢量和其他矢量数学的更多信息,请参阅 this。
有关更广泛的信息,请参阅 this。
我是一名业余开发者,开始在 Godot 3 中开发一款简单的第三人称 3D 游戏。我设置了一些控件,允许 KinematicBody(名为 Player)根据 WASD 输入沿 x 轴和 z 轴移动。我还有一个 Camera 作为 Player 的子项,因此相机跟在后面并相对于 Player 旋转。
然而,当 Camera 旋转时,向前按仍会沿全局 z 轴移动 Player!我会想象当玩家旋转并且你向前按时,玩家应该远离相机。
是否有内置的方法可以根据玩家的旋转沿 x 或 z 轴移动?即向前按沿局部负 z 轴平移,使其局部向前移动。
我已经阅读了 Transform()
和 Basis()
的文档,似乎相关但不太清楚;或者至少超出我的 skill/understanding.
我做了一些研究,这是我发现的:
出于性能和技术原因,Godot(和大多数其他 3D 应用程序)不使用所谓的欧拉角进行旋转(可以通过编辑器中的旋转 3D gizmo 可视化)。相反,它使用基础向量变换。
相反,假设您制作了一个 2D 对象并给它 2 个相隔 90 度且长度相同的向量;一个在 x 轴上,一个在 y 轴上。这些是对象的 "local" x 和 y 坐标。当旋转对象时,它不是旋转对象本身,而是改变向量端点的坐标,使它们相隔 90 度并且长度相同,从而导致其局部 x 和 y 变为 "rotate"。有点像如果你用手做一个 'L',把它放在 table 上,然后来回旋转。旋转不存储在你手的角度,它存储在你指尖的位置。
3D 中也会发生同样的事情,但会沿 z 轴添加第三个向量。然而,最重要的是,您可以引用这些向量并通过执行 transform.basis.[x,y,z]
来使用它们。在你的情况下,你已经有类似的东西:
movement = Vector3(0,0,0)
if Input.is_action_pressed("ui_up"):
movement.z -= 1
但是,不是沿着任意向量移动,而是应该将基础 z 向量添加到移动向量中:
movement = Vector3(0,0,0)
if Input.is_action_pressed("ui_up"):
movement -= transform.basis.z.normalized()
我将向量归一化以消除任何缩放。要了解有关添加矢量和其他矢量数学的更多信息,请参阅 this。
有关更广泛的信息,请参阅 this。