首页 > 解决方案 > 如何沿局部 x、y、z 轴平移?(戈多)

问题描述

我是一名业余开发人员,在 Godot 3 中开始了一个简单的第三人称 3D 游戏。我设置了一些控件,允许 KinematicBody(名为 Player)根据 WASD 输入沿 x 和 z 轴移动。我还有一个相机作为玩家的孩子,所以相机跟在后面并相对于玩家旋转。

然而,当相机旋转时,向前按下仍然会沿着全局 z 轴移动玩家!我想当玩家旋转并且你向前按下时,玩家应该远离相机。

是否有一种内置的方式来沿基于播放器旋转的 x 或 z 轴移动?即,向前按沿局部负 z 轴平移,使其局部向前移动。

我已经阅读了Transform()and的文档Basis(),它似乎相关但很不清楚;或至少超出我的技能/理解。

标签: 3dgame-developmentgodot

解决方案


我做了一些研究,这就是我发现的:

由于性能和技术原因,Godot(和大多数其他 3D 应用程序)不使用所谓的欧拉角进行旋转(可以通过编辑器中的旋转 3D gizmo 可视化)。相反,它使用基础向量变换。

相反,假设你制作了一个 2D 对象,并给它 2 个相隔 90 度且长度相同的向量;一个在 x 轴上,一个在 y 轴上。这些是对象的“本地”x 和 y 坐标。旋转对象时,它不是旋转对象本身,而是更改向量端点的坐标,使它们保持 90 度分开且长度相同,从而导致其局部 x 和 y “旋转”。有点像如果你用手做一个“L”,把它放在桌子上,然后来回旋转。旋转不存储在你手的角度,它存储在你指尖的位置

同样的事情发生在 3D 中,但沿 z 轴添加了第三个向量。然而,最重要的是,您可以引用这些向量并通过 do 来使用它们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()
我对向量进行归一化以消除任何缩放。要了解有关添加向量和其他向量数学的更多信息,请参阅。有关更广泛的信息,请参阅


推荐阅读