☰
Godot BoneAttachment3D 节点详解:将子节点绑定到骨骼与覆盖骨骼姿态的完整指南
2026/10/4 11:10:40 网站建设 项目流程
  • 文档
  • 教程
  • 游戏开发

【免费下载链接】godot-docs

Godot Engine official documentation

项目地址:https://gitcode.com/GitHub_Trending/go/godot-docs
点击查看免费下载

导读

BoneAttachment3D 是 Godot 引擎中连接「骨骼动画世界」与「场景节点世界」的关键节点。本文基于 Godot 官方文档 class_boneattachment3d.rst 展开,完整讲解该节点的属性、方法与两种核心工作模式(跟随骨骼变换 / 覆盖骨骼姿态),并结合仓库内的 tscn 场景文件格式说明、软体斗篷实战教程与 4.3 迁移记录,为你呈现从场景编辑器操作到底层运行机制的完整视图。读完本文,你将掌握如何把武器、饰品、贴花等对象精准挂接到指定骨骼,如何让附着节点反向驱动骨骼姿态,以及如何处理外部骨骼与潜在的性能注意事项。

节点概览:继承关系与核心职责

BoneAttachment3D 的继承链为:

Node3D < Node < Object
  • Inherits(父类):Node3D,因此它天然具备三维变换(Transform3D)能力,可被平移、旋转、缩放,也可挂载任意子节点。
  • 继承者(Inherited By):从 class_node3d.rst 的继承关系表可以看到,BoneAttachment3D 是 Node3D 的直接子类,与 Camera3D、CollisionShape3D、Marker3D 等并列。

它的核心职责可以用一句话概括:在父级 Skeleton3D 中选择一根骨骼,并动态复制或覆盖该骨骼的三维变换。也就是说,BoneAttachment3D 节点本身不参与渲染,它是一个「中间节点」,专门用来描述「某个节点被父级到骨架的某根骨骼上」这一关系——这正是它在 tscn.rst 中被定义为intermediate node(中间节点)的原因。

工作原理:动态复制与姿态覆盖

官方文档将其工作模式描述为「dynamically copies or overrides(动态复制或覆盖)」:

  • 复制模式(跟随):BoneAttachment3D 节点实时将自身变换设置为所绑定骨骼的变换,任何挂载在其下的子节点都会随骨骼一起运动,例如角色手中挥舞的武器。
  • 覆盖模式(驱动):当override_pose开启时,附着节点可以反过来改变骨骼的位姿(pose),用于程序化驱动骨骼。

两种模式的切换完全由override_pose属性决定,下文逐一拆解所有属性与默认值。

属性详解

下表完整列出该节点的全部属性及其默认值(来自 class_boneattachment3d.rst):

类型属性默认值说明
intbone_idx-1所附着骨骼的索引
Stringbone_name""所附着骨骼的名称
NodePathexternal_skeleton(空)外部 Skeleton3D 节点的 NodePath
booloverride_posefalse是否覆盖骨骼姿态
PhysicsInterpolationModephysics_interpolation_mode2物理插值模式(覆盖自 Node 的默认值)
booluse_external_skeletonfalse是否使用外部 Skeleton3D 而非父节点

bone_idx 与 bone_name:双通道骨骼寻址

  • bone_idx(int,默认 -1):所附着骨骼的索引。配套的 setter/getter 为set_bone_idx(value)与get_bone_idx()。索引与骨骼名称是一一对应的,二者可以互换寻址。
  • bone_name(String,默认 ""):所附着骨骼的名称,配套set_bone_name(value)/get_bone_name()。

在场景文件中,这两个属性会同时写入。例如 tscn.rst 中展示的枪械骨骼挂接示例:

[node name="GunBone" type="BoneAttachment3D" parent="PlayerModel/Robot_Skeleton/Skeleton3D" index="5"] transform = Transform3D(0.333531, 0.128981, -0.933896, 0.567174, 0.763886, 0.308015, 0.753209, -0.632331, 0.181604, -0.323915, 1.07098, 0.0497144) bone_name = "hand.R" bone_idx = 55

可以看到,真实场景中既保留了骨骼名称hand.R,也写入了对应的索引55,二者协同定位骨骼,避免因重命名或骨架重组导致失配。

external_skeleton 与 use_external_skeleton:外部骨骼支持

默认情况下,BoneAttachment3D 会使用父节点作为 Skeleton3D。当需要把节点绑定到非父级的骨骼时:

  • use_external_skeleton(bool,默认 false):置为true后,节点放弃查找父级骨架,转而使用external_skeleton中指定的 Skeleton3D。
  • external_skeleton(NodePath):指向外部 Skeleton3D 节点的路径,配套set_external_skeleton(value)/get_external_skeleton()。

这一机制让「一个骨架的骨骼」可以驱动「场景树中任意位置」的附着节点,是实现跨节点骨骼绑定的关键开关。

override_pose:从「跟随」切换到「驱动」

  • false(默认):BoneAttachment3D 总是被设置为骨骼的变换,即纯跟随模式;
  • true:BoneAttachment3D 可以改变所附着骨骼的位姿,即驱动模式。

重要注意事项(官方文档原文强调):这种覆盖是在骨架更新过程中通过信号以「中断式(interruptively)」方式执行的,属于旧设计的遗留行为。当与SkeletonModifier3D同时使用时,可能引发非预期的行为。因此在需要程序化控制骨骼姿态、又希望与其他修改器链协作的场景下,官方更推荐使用 ModifierBoneTarget3D——该节点功能与 BoneAttachment3D 类似,但采用SkeletonModifier3D的更新循环,并设计为充当另一个 SkeletonModifier3D 的目标(详见 class_modifierbonetarget3d.rst)。

physics_interpolation_mode:物理插值

该节点将physics_interpolation_mode的默认值覆盖为2(继承自 Node 的属性被覆写)。其含义为:骨骼绑定场景下,节点变换跟随骨架在物理帧之间进行插值,避免高速骨骼运动时出现抖动。如需对单个附着节点精细控制插值策略,可修改该属性。

方法与回调

返回类型方法说明
Skeleton3Dget_skeleton()返回父级或外部 Skeleton3D 节点,若不存在则返回null
voidon_skeleton_update()骨架更新时自动调用;在非覆盖模式下,该函数负责更新节点位置以正确绑定骨骼
  • get_skeleton():统一返回当前生效的骨架(无论是父级还是外部),便于在代码中直接取得骨架引用。
  • on_skeleton_update():由 Skeleton3D 在更新时自动触发,是 BoneAttachment3D 保持自身与骨骼同步的核心回调。文档特别指出:该函数在「不覆盖骨骼姿态」时负责更新节点位置,使其正确绑定。

值得注意的是,on_skeleton_update是 Godot 4.3 的命名调整结果:在 upgrading_to_godot_4.3.rst 的迁移表中明确记录,on_bone_pose_update已被on_skeleton_update取代(GDScript 兼容,C# 二进制/源码级兼容),同时 Skeleton3D 的信号bone_pose_changed也替换为skeleton_updated。如果你从旧版本迁移代码,需要同步更新这两个标识符。

实战:把武器挂到骨骼上(编辑器操作)

在 Godot 编辑器中,将物体附着到骨骼的典型流程如下:

  1. 在场景树中,为角色模型创建Skeleton3D节点(模型导入时会自动生成)。
  2. 在 Skeleton3D 节点下添加一个BoneAttachment3D子节点。
  3. 在检查器(Inspector)中,将bone_name或bone_idx设置为目标骨骼(如hand.R)。
  4. 在 BoneAttachment3D 节点下添加武器、盾牌、饰品等子节点,其局部变换会叠加在骨骼变换之上。

关于枪口点(Muzzle)的经典做法:若需要「从枪口射出子弹」之类的玩法,可在 BoneAttachment3D 下再挂一个Marker3D标记点。正如 tscn.rst 中所示:

[node name="ShootFrom" type="Marker3D" parent="PlayerModel/Robot_Skeleton/Skeleton3D/GunBone"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.4, 0)

这个ShootFrom标记挂在GunBone(BoneAttachment3D)之下,通过脚本读取其全局变换即可获得每帧正确的枪口世界坐标,而无需手动跟踪骨骼位置。

实战进阶:软体布料绑定(SoftBody3D + BoneAttachment3D)

仓库的 软体斗篷教程 展示了 BoneAttachment3D 的真实用例——把一块软体布料挂在角色颈部骨骼上:

  1. 创建骨骼附着点:在 Skeleton3D 节点下添加一个 BoneAttachment3D,并在检查器中选中 Neck(颈部)骨骼。教程特别提示:暂时不要把 SoftBody3D 节点直接移入 BoneAttachment3D 之下,而是让软体的「固定点(pinned points)」跟踪该节点。
  2. 选择固定点:在 SoftBody3D 节点中选中上方的顶点,被选中的固定点在 3D 视口中以蓝色显示。
  3. 指定附着路径:在 SoftBody3D 检查器中展开 Collision(碰撞)区块下的 Attachments(附着物)部分,为每个固定关节的Spatial Attachment Path属性选择 BoneAttachment3D 节点。技巧:可以直接从场景树停靠面板把 BoneAttachment3D 节点拖放到该属性字段上,大幅提高赋值效率。若 Attachments 区块未出现,可先取消再重新选中 SoftBody3D 节点。
  4. 避免穿模:把场景根节点(如 CharacterBody3D 的 Player)加入 SoftBody3D 的Parent Collision Ignore属性,防止布料与角色自身碰撞而穿模。

最终运行场景,斗篷即可随颈部骨骼运动并被软体模拟驱动。这印证了 BoneAttachment3D 的核心价值:让任意场景节点(包括物理模拟节点)以骨骼为锚点获得动态变换。

底层运行细节与注意事项

  • 更新时序:非覆盖模式下,BoneAttachment3D 的变换由on_skeleton_update()在骨架更新循环中同步,因此其变换始终与骨骼保持一致,子节点无需每帧手动同步。
  • 覆盖模式的信号机制:覆盖模式通过信号在骨架更新过程中中断执行(旧设计遗留),与 SkeletonModifier3D 同时使用可能产生非预期结果。程序化驱动骨骼的现代替代方案是 ModifierBoneTarget3D,它融入 SkeletonModifier3D 的更新链,更适合与其他骨骼修改器协同。
  • 外部骨骼注意:使用use_external_skeleton = true时,请确保external_skeleton的 NodePath 有效,get_skeleton()在骨架不存在时返回null,代码中需做判空处理。
  • GLTF 导入关联:在 class_gltfskeleton.rst 中可以看到,GLTF 骨架类提供get_bone_attachment(idx)方法,用于从导入的 GLTF 骨架数据中获取对应的 BoneAttachment3D,说明该节点是引擎在模型导入流程中同步生成与管理的标准骨骼附属机制。

结语

BoneAttachment3D 是 Godot 3D 骨骼系统中「把场景节点与骨骼解耦又精准耦合」的桥接节点。通过bone_name/bone_idx寻址、override_pose切换跟随与驱动模式、use_external_skeleton跨节点绑定,它足以覆盖武器挂接、软体布料、程序化姿态控制等绝大多数骨骼附着场景。唯一需要留意的是覆盖模式的信号式执行局限——涉及复杂修改器链时,请优先考虑 ModifierBoneTarget3D。掌握这一节点,你的角色动画与物理交互工作流将更加灵活可控。

  • 文档
  • 教程
  • 游戏开发

【免费下载链接】godot-docs

Godot Engine official documentation

项目地址:https://gitcode.com/GitHub_Trending/go/godot-docs
点击查看免费下载
上一篇:KTransformers AMX/AVX加速:Intel CPU优化技术深度解析
下一篇:lsd性能优化指南:加快大型目录列表速度的10个技巧

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询