我是一名业余开发人员,在Godot 3中开始了简单的第三人称3D游戏。我设置了一些控件,这些控件允许KinematicBody(名为Player)根据WASD输入沿x和z轴移动。我还有一个Camera作为Player的子代,因此Camera跟在后面并相对于Player旋转。
但是,当相机旋转时,向前按下仍会沿全局z轴移动播放器!我可以想象,当播放器旋转并向前按时,播放器应远离相机。
是否存在基于Player旋转的沿x轴或z轴移动的内置方法?即向前按压会沿局部负z轴平移,使其局部向前移动。
我已经阅读了Transform()
和Basis()
的文档,虽然看起来很相关,但还不清楚。或至少超出了我的技能/理解。
答案 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。