godot - 如何在 Godot GDscript 中获取骨骼的全局世界坐标

标签 godot gdscript

我正在使用 GDscript 在 Godot 中编写一个程序,旨在改变骨架中多个骨骼的位置。骨骼通过我希望骨骼移动到的点减去骨骼的当前位置计算得出的值进行转换。 translateValue = endPoint - currentPoint 但是,所有值都必须在世界坐标或全局位置中,代码才能工作。 Godot 有多种方法来检索骨骼转换以访问位置,例如:skeleton.get_bone_pose()、skeleton.get_bone_global_pose、skeleton.get_bone_rest。我尝试使用 skeleton.get_bone_global_pose 但它没有给出全局位置并且似乎仍然与某物相关。还有 to_global() 方法,但我不完全确定它的作用。有人可以解释这些方法之间的区别以及如何获得全局地位吗?谢谢!

最佳答案

我将从这些方法开始:

  • get_bone_rest
  • get_bone_custom_pose
  • get_bone_pose

首先,get_bone_rest 为您提供骨骼相对于其父骨骼的默认变换。然后按上述顺序堆叠其他变换。


然后我们有:

  • get_bone_global_pose

此方法为您提供骨骼的最终变换。它是相对于 Skeleton 而言的。也就是说,此变换已经包含前面提到的从父骨骼到子骨骼的变换。

因此,将其结果转换为世界空间就是构成骨架的变换:

$Skeleton.global_transform * $Skeleton.get_bone_global_pose(bone_index)

我们有:

  • get_bone_global_pose_no_override

顾名思义,get_bone_global_pose_no_override 忽略任何全局姿势覆盖。没错,你可以覆盖全局姿势。为此,请使用 set_bone_global_pose_override。另请参阅 clear_bones_global_pose_override。当然,这些都是与 Skeleton 相关的。


Spatial.to_global(vector3) 方法与Skeleton 无关。它将向量从您调用它的节点的局部空间转换为世界空间。这也可能有用:

$Skeleton.to_global($Skeleton.get_bone_global_pose(bone_index).origin)

关于godot - 如何在 Godot GDscript 中获取骨骼的全局世界坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68386221/

相关文章:

lifecycle - 我在 _ready() 之后缺少生命周期初始化方法

collision-detection - 如何检测 Godot 中的碰撞?

godot - 如何设置退出 Godot 应用程序的 esc 键?

android - 在 godot 中按住屏幕触摸

serialization - 戈多/Gdscript : Why is str2var not working on classes with _init method?

input - 运动对象未检测到任何碰撞 - Godot

testing - 如何在 Godot 引擎中编写测试

graphics - 在 Godot 中添加视差层偏移 Sprite

godot - 在 Area2D 中覆盖 KinematicBody2D 运动?

godot - 输入 "Any"的正确方法