.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。我建议您改为使用 Transform
的 origin
。
如果你有一个 Transform
并且你想要另一个在其他方面相同但位于 (0, 0, 0)
的,你可以这样做:
var new_transform = Transform(transform.basis, Vector.ZERO)
或者将 Vector.ZERO
替换为您想要提供新变换的任何原点。
我还要提醒你,get_bone_global_pose
和set_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
,结果应该是骨骼被放置在世界的原点。 保留其旋转和缩放。
我正在使用 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。我建议您改为使用 Transform
的 origin
。
如果你有一个 Transform
并且你想要另一个在其他方面相同但位于 (0, 0, 0)
的,你可以这样做:
var new_transform = Transform(transform.basis, Vector.ZERO)
或者将 Vector.ZERO
替换为您想要提供新变换的任何原点。
我还要提醒你,get_bone_global_pose
和set_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
,结果应该是骨骼被放置在世界的原点。 保留其旋转和缩放。