You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 14:54:01