Godot 3D 坐标系独立运动

Godot 3D coordinate system independent movement

提问人:Neironari 提问时间:11/6/2023 更新时间:11/7/2023 访问量:51

问:

我看过很多 3d fps 运动的例子。它们都使用全局 X 和 Z 全局坐标来行走/冲刺,并使用 Y 坐标进行跌倒/跳跃。我有下一个问题:我可以创建局部坐标系,该坐标系将以相同的方式使用根对象坐标,但相对于全局坐标?例如,如果我将根对象围绕 Z 轴旋转 90 度,我的控制器将使用 Z 轴和 Y 轴进行步行/冲刺,使用 X 轴进行跌倒/跳跃?

坐标 Godot GDScript Godot4

评论

0赞 no more sigsegv 11/6/2023
除非你修改属性,否则你将在父级的局部坐标系中变换你的对象。global_transformNode3D
0赞 Neironari 11/6/2023
但事实并非如此。我的控制器在 Z 轴上旋转了 -90 度,无论如何它都下降了 Y。找到 Godot3 的 global_transform.basis.xform 解决方案
0赞 no more sigsegv 11/6/2023
如果这是一个 ,它将落向项目设置中指定的重力矢量。如果是 (godot3.x) 或 (godot4.x),您将自己实现重力效应,如果您跌向局部坐标系的 -y,您将体验到您现在所经历的。你可以通过不让你的角色成为你正在旋转的 “关卡 ”或 “世界 ”的子节点来避免这种情况。否则,您将需要取消旋转角色并更新其全局变换,使其相对于屏幕直立并朝 {0, -1, 0} 方向下降。RigidBody3DKinematicBody3DCharacterBody3D

答:

2赞 Theraot 11/7/2023 #1

是的, 你可以的。


关于变换, Godot 3 的方法已被运算符取代.因此,您将变换相乘以组成它们,或者将变换和向量相乘以变换它。xform*


我不确定您到底想如何控制它,但这里有一些注意事项:

  • 项目设置中有一个默认的重力,您可能需要更改该重力。但是你可以通过用 s 覆盖它来获得动态重力。如果您需要读取施加在身体所在位置的重力,请使用:。Area3DPhysicsServer3D.body_get_direct_state(get_rid()).total_gravity
  • 在全局基础上有一个定义,用于决定什么是地板、墙壁或天花板。因此,您可能希望动态更改它。CharacterBody3Dup_direction
  • 除了初学者代码之外,通常使控件相对于 .例如,“right”不会朝向全局正 X,而是朝向 的正 X。如果需要对 的引用,可以使用 获取它。Camera3DCamera3DCamera3Dget_viewport().get_camera_3d()
  • 的 是全球基础。velocityCharacterBody3D