我做了一些研究,这就是我发现的:
由于性能和技术原因,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()
我对向量进行归一化以消除任何缩放。要了解有关添加向量和其他向量数学的更多信息,请参阅此。有关更广泛的信息,请参阅此。