Col*_*shi 4 position gdscript godot
我有一个问题 - 如何获取和设置 Godot 中对象的位置?我找不到任何教程,所以我需要帮助。
Node因此,根据 s 的定位规则,我们可以分为三种: Control、Node2D、 和Spatial。既然你提到了3D,我就谈谈Spatial这个答案。
您可以在为什么有些节点使用“position”而另一些节点使用“rect_position”上找到Node2D和之间的差异?。我也稍微谈一下那里。ControlSpatial
空间
Spatial放置的方式是由他们的Transform。这类似于Node2D他们的放置方式Transform2D。
您可能期望Spatial有一个“位置”属性,方法Node2D有一个。然而他们没有。相反,他们有财产translation。因此,您可以获取或设置它,例如:
translation = Vector3(1.0, 2.0, 3.0)
Run Code Online (Sandbox Code Playgroud)
但是,没有“global_translation”。我将了解如何解决这个问题。
Godot 4 注:在Godot 4 中Spatial已被重命名为Node3D,并且它们确实已position改为translation。虽然没有“global_position”。
我是说Spatial节点是由它们放置的Transform。ATransform有两部分:
Basis叫basis. 您可以将其概念化为一组三个Vector3定义 的坐标系的轴Spatial,或作为一个 3 x 3 矩阵。Vector3叫origin. 您可以将其概念化为 的坐标系的原点位置(啊哈!)Spatial,或者将其概念化为增强 3 x 3 矩阵以向变换添加平移的向量。因此,您可以通过设置节点的来放置Spatial节点(相当于设置)。例如:originTransformtranslation
transform.orign = Vector3(1.0, 2.0, 3.0)
Run Code Online (Sandbox Code Playgroud)
值得注意的是, aSpatial有一个transform相对于其父级的属性,而 aglobal_transform我们会说它是相对于世界的。如果您组合(相乘,如“矩阵乘法”)transform从场景树的根到您的 的所有Spatial,您将计算出它的global_transform。
您可以直接获取或设置origin的global_transform。例如:
global_transform.orign = Vector3(1.0, 2.0, 3.0)
Run Code Online (Sandbox Code Playgroud)
这相当于缺少的“global_translation”/“global_position”。
刚体
我还想指出,直接修改 a 的变换RigidBody可能是不可取的。更准确地说,Godot 使用的物理引擎可能想要移动RigidBody,然后你最终会与物理引擎对抗。
照这样说。如果您需要传送 a RigidBody,您可以向物理引擎请求它,如下所示:
PhysicsServer.body_set_state(
get_rid(),
PhysicsServer.BODY_STATE_TRANSFORM,
Transform.IDENTITY.translated(Vector3(1.0, 2.0, 3.0))
)
Run Code Online (Sandbox Code Playgroud)
是的,无论其mode. 事实上,根据我的经验,这种方法比切换模式更好。