.translated 函数在 Godot 中不起作用/改变骨骼位置的最佳方法

.translated function not working in Godot / best way to change position of bone

我正在使用 Gdscript 在 Godot 中开发一个程序,在尝试使用 Transform.translated(Vector3) 函数时我 运行 遇到了问题。我的代码应该通过 t运行 将骨骼移动到 (0,0,0),使其按当前坐标移动,但带有负号。示例:(1,2,3) 将由 (-1,-2,-3) 指定为 t运行,因此它最终会在 (0,0,0) 处结束。出于某种原因,当我这样做时,骨骼的结束位置不是 (0,0,0),而是其他坐标。在 Godot 文档中,它说 .t运行slated 函数“相对于 t运行sform 的基向量”,所以也许这就是原因?此外,如果有比使用 Transform.translated(Vector3) 函数更好的方法来更改骨骼位置,那也会有所帮助。谢谢!

我的代码:

            bonePose = skel.get_bone_global_pose(bone)
            var globalBonePose = skel.to_global(bonePose.origin)
            translateVector = -globalBonePose
            var newPose = bonePose.translated(translateVector)
            skel.set_bone_pose(bone, newPose)

代码输出/结果:

bonePose(骨骼的原始位置)在(-0.82,0.49,0.50)左右

t运行slateVector(骨骼将被 t运行 指定的数量)大约是 (0.82,-0.49,-0.50)

newPose(骨骼的最终位置——应该是[0,0,0])在(0.82,-0.66,-0.46)左右。即使我调用 skel.to_global(newPose.origin) 查看全局坐标,它也是 (-0.76,0.44,0.42),而不是 (0,0,0)

在 Godot 中,一个 Transform 由一个 basis(一个 Basis)和一个 origin(一个 Vector3)组成。其中 origin 处理转换的翻译部分,Basis 处理其余部分。

A Basis 是定义坐标系的向量集。有一个定义 x 轴的向量,另一个定义 y 轴,另一个定义 z 轴。这就是 Godot 编码旋转和缩放变换的方式。

当文档说“相对于变换的基础向量”时,这意味着 Basis 将应用于您传入的向量。因此,在您的情况下,您将获得本地 [= =72=]的骨头。这意味着如果骨骼被旋转或缩放(或类似的东西),那将影响平移。

如果您不想处理旋转、缩放,et.al。我建议您改为使用 Transformorigin

如果你有一个 Transform 并且你想要另一个在其他方面相同但位于 (0, 0, 0) 的,你可以这样做:

var new_transform = Transform(transform.basis, Vector.ZERO)

或者将 Vector.ZERO 替换为您想要提供新变换的任何原点。


我还要提醒你,get_bone_global_poseset_bone_pose操作的不是同一个东西。一方面 set_bone_pose 是相对于父骨骼的,另一方面 get_bone_global_pose 是相对于 Skeleton 的。因此,我建议您改用 set_bone_global_pose_override


您需要的最后一块是 Spatial.to_global 的反面。因为设置姿势如下…

bonePose = skel.get_bone_global_pose(bone)
var newPose = Transform(bonePose.basis, Vector.ZERO)
skel.set_bone_global_pose_override(bone, newPose, 1.0)

… 将它放在 Skeleton.

的原点

嗯,Spatial.to_global 的反义词是 Spatial.to_local,你可以这样使用它:

bonePose = skel.get_bone_global_pose(bone)
var newPose = Transform(bonePose.basis, skel.to_local(Vector.ZERO))
skel.set_bone_global_pose_override(bone, newPose, 1.0)

这里skel.to_local(Vector.ZERO)应该给出相对于Skeleton的世界原点。鉴于 set_bone_global_pose_override 想要 Transform 相对于 Skeleton,结果应该是骨骼被放置在世界的原点。 保留其旋转和缩放。