我是一名业余开发人员,正在Godot 3中启动一款简单的第三人称3D游戏。我设置了一些控件,允许KinematicBody(名为Player(根据WASD输入沿x和z轴移动。我还有一个相机作为播放器的子级,所以相机跟随在后面并相对于播放器旋转。
但是,当摄影机旋转时,向前按仍会沿全局z轴移动播放机!我可以想象,当玩家旋转,你向前按压时,玩家应该远离相机。
是否有基于播放器旋转的内置方式沿x或z轴移动?即,向前按压沿局部负z轴平移,使其局部向前移动。
我已经阅读了Transform()
和Basis()
的文档,它似乎有关联,但非常不清楚;或者至少超出了我的能力/理解。
我做了一些研究,这就是我发现的:
Godot(和大多数其他3D应用程序(由于性能和技术原因,不使用所谓的欧拉角进行旋转(可以通过编辑器中的旋转3D gizmo进行可视化(。相反,它使用基向量变换。
相反,想象你制作一个二维对象,并给它两个相距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向量添加到movment向量中:movement = Vector3(0,0,0)
if Input.is_action_pressed("ui_up"):
movement -= transform.basis.z.normalized()
我对向量进行归一化以消除任何缩放。要了解有关添加矢量和其他矢量数学的更多信息,请参阅此。有关更多详细信息,请参阅。