Godot使用GDScript实现Armature骨骼指向另一骨骼的方法咨询
Godot Armature骨骼指向目标骨骼的Transform直接设置方案
核心实现逻辑
骨骼的pose变换是相对于父骨骼的局部空间坐标,不需要依赖Spatial节点的look_at方法,直接调用Transform自带的looking_at方法即可构造对齐旋转,无需通过rotated方法累加旋转。
具体实现步骤
- 第一步:获取两个骨骼的全局位置与当前骨骼的父空间逆变换
# 替换为实际的骨骼名称 var current_bone_idx: int = skeleton.find_bone("当前骨骼名称") var target_bone_idx: int = skeleton.find_bone("目标骨骼名称") var parent_bone_idx: int = skeleton.get_bone_parent(current_bone_idx) # 获取全局变换 var current_global: Transform3D = skeleton.get_bone_global_pose(current_bone_idx) var target_global_pos: Vector3 = skeleton.get_bone_global_pose(target_bone_idx).origin # 计算父骨骼的全局逆变换,无父骨骼则用单位矩阵 var parent_global_inv: Transform3D = Transform3D.IDENTITY if parent_bone_idx != -1: parent_global_inv = skeleton.get_bone_global_pose(parent_bone_idx).affine_inverse() - 第二步:将坐标转换到当前骨骼的父局部空间,构造对齐变换
# 转换到父局部空间 var current_local_pos: Vector3 = parent_global_inv * current_global.origin var target_local_pos: Vector3 = parent_global_inv * target_global_pos # 直接构造指向目标的变换,up向量可根据需求调整 var desired_pose: Transform3D = Transform3D.IDENTITY.translated(current_local_pos).looking_at(target_local_pos, Vector3.UP) # 可选:如果骨骼默认前向不是Godot标准的-Z轴,可调整Basis偏移 # 示例:骨骼前向为+Y时,添加90度X轴旋转偏移 # desired_pose.basis = desired_pose.basis * Basis(Vector3.RIGHT, deg_to_rad(90)) - 第三步:将计算好的变换赋值给骨骼
skeleton.set_bone_pose(current_bone_idx, desired_pose)
注意事项
- 若需要和现有动画叠加,可在
_physics_process中执行上述逻辑,或在动画树的自定义脚本中处理,避免被动画轨道覆盖。 - 出现旋转翻转问题时,可调整
looking_at的第二个up参数,适配骨骼的朝向约束。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

