如何沿局部x,y,z轴平移? (Godot)

时间:2018-07-17 02:39:32

标签: 3d game-development godot

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

但是,当相机旋转时,向前按下仍会沿全局z轴移动播放器!我可以想象,当播放器旋转并向前按时,播放器应远离相机。

是否存在基于Player旋转的沿x轴或z轴移动的内置方法?即向前按压会沿局部负z轴平移,使其局部向前移动。

我已经阅读了Transform()Basis()的文档,虽然看起来很相关,但还不清楚。或至少超出了我的技能/理解。

1 个答案:

答案 0 :(得分:2)

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

Godot(以及大多数其他3D应用程序)出于性能和技术原因,不使用所谓的Euler角度进行旋转(可以通过编辑器中的3D旋转Gizmo对其进行可视化)。取而代之的是,它使用基础向量转换。

相反,假设您制作了一个2D对象,并为其提供了两个相距90度且长度相同的矢量;一个在x轴上,另一个在y轴上。这些是对象的“局部” x和y坐标。当旋转对象时,它不改变对象本身,而是以使向量的端点保持90度和相同的长度的方式更改向量端点的坐标,从而使向量的局部x和y“旋转”。就像您用手制作“ L”形,将其放在桌子上,然后前后旋转。旋转不存储在您的手角中,而是存储在指尖的位置中。

在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