如何解决.translated 函数在 Godot 中不起作用/改变骨骼位置的最佳方法
我正在使用 Gdscript 在 Godot 中开发一个程序,但在尝试使用 Transform.translated(Vector3)
函数时遇到了问题。我的代码应该通过将骨骼移动到(0,0)的当前坐标但带有负号来移动它。示例: (1,2,3) 将被 (-1,-2,-3) 转换,因此最终会变为 (0,0)。出于某种原因,当我这样做时,骨骼的结束位置不是 (0,0),而是其他一些坐标。在 Godot 文档中,它说 .translated 函数“相对于变换的基向量”,所以也许这就是为什么?此外,如果有比使用 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) 左右
translateVector(骨骼将被平移的量)大约是 (0.82,-0.49,-0.50)
newPose(骨骼的最终位置——应该是 [0,0])大约是 (0.82,-0.66,-0.46)。即使我调用 skel.to_global(newPose.origin)
来查看全局坐标,它也是 (-0.76,0.44,0.42),而不是 (0,0)
解决方法
在 Godot 中,Transform
由 basis
(Basis
)和 origin
(Vector3
)组成。其中 origin
处理转换的翻译部分,而 Basis
处理其余部分。
A Basis
是定义坐标系的向量集。有一个向量定义了 x
轴,另一个定义了 y
轴,另一个定义了 z
轴。这就是 Godot 编码旋转和缩放变换的方式。
当文档说“相对于变换的基向量”时,这意味着 Basis
将应用于您传入的向量。因此,在您的情况下,您将获得对局部空间的翻译骨。这意味着如果骨骼被旋转或缩放(或类似的东西),这将影响平移。
如果您不想处理旋转、缩放等问题。我建议您改用 origin
的 Transform
。
如果您有一个 Transform
并且您想要另一个在其他方面相同但位于 (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,1.0)
此处 skel.to_local(Vector.ZERO)
应给出相对于 Skeleton
的世界起源。考虑到 set_bone_global_pose_override
想要一个相对于 Transform
的 Skeleton
,结果应该是骨骼被放置在世界的原点。 保留其旋转和缩放。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。