Car*_*009 2 3d game-development godot
我是一名业余开发人员,在 Godot 3 中开始一个简单的第三人称 3D 游戏。我设置了一些控件,允许 KinematicBody(名为 Player)根据 WASD 输入沿 x 和 z 轴移动。我还有一个相机作为播放器的子级,因此相机跟随在播放器后面并相对于播放器旋转。
然而,当相机旋转时,向前按仍然会沿着全局 z 轴移动玩家!我想当玩家旋转并且你向前按时,玩家应该远离摄像机。
是否有一种内置方法可以根据播放器的旋转沿 x 或 z 轴移动?即向前按会沿局部负 z 轴平移,使其局部向前移动。
Transform()我已阅读和的文档Basis(),它似乎相关,但相当不清楚;或者至少超出了我的技能/理解范围。
我做了一些研究,这就是我发现的:
出于性能和技术原因,Godot(以及大多数其他 3D 应用程序)不使用所谓的欧拉角进行旋转(可以通过编辑器中的旋转 3D 小控件进行可视化)。相反,它使用基础向量变换。
相反,想象一下您创建一个 2D 对象并为其提供 2 个相距 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()
我对向量进行归一化以消除任何缩放。要了解有关添加向量和其他向量数学的更多信息,请参阅此。有关更广泛的信息,请参阅此。