3d - 如何沿局部 x、y、z 轴平移?(戈多)
问题描述
我是一名业余开发人员,在 Godot 3 中开始了一个简单的第三人称 3D 游戏。我设置了一些控件,允许 KinematicBody(名为 Player)根据 WASD 输入沿 x 和 z 轴移动。我还有一个相机作为玩家的孩子,所以相机跟在后面并相对于玩家旋转。
然而,当相机旋转时,向前按下仍然会沿着全局 z 轴移动玩家!我想当玩家旋转并且你向前按下时,玩家应该远离相机。
是否有一种内置的方式来沿基于播放器旋转的 x 或 z 轴移动?即,向前按沿局部负 z 轴平移,使其局部向前移动。
我已经阅读了Transform()
and的文档Basis()
,它似乎相关但很不清楚;或至少超出我的技能/理解。
解决方案
我做了一些研究,这就是我发现的:
由于性能和技术原因,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()
我对向量进行归一化以消除任何缩放。要了解有关添加向量和其他向量数学的更多信息,请参阅此。有关更广泛的信息,请参阅此。
推荐阅读
- rust - 有没有更好的方法来编写返回迭代器的方法?
- machine-learning - SVM 模型将概率分数大于 0.1(默认阈值 0.5)的实例预测为正例
- elasticsearch - Elastic-search 聚合 top 3 常见结果
- laravel - 通过laravel连接oracle数据库的问题
- python - 为什么我的代码似乎切换到 GET 方法而不是继续执行 POST 脚本
- c# - 使用 System.text.json 选择部分 json
- excel - Power Query 将表类型数据加载到单个 Excel 工作表
- dialogflow-cx - DialogFlow CX 中的多个意图
- sql-server - 子查询和 NOT NULL
- mysql - SQL - 慢速 SQL 查询