ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Godot 骨骼空间修正器 BoneSpaceAdjuster3D 详解:让皮肤缩放与子骨骼位置完美同步

Godot 骨骼空间修正器 BoneSpaceAdjuster3D 详解:让皮肤缩放与子骨骼位置完美同步 文档教程游戏开发【免费下载链接】godot-docsGodot Engine official documentation项目地址https://gitcode.com/GitHub_Trending/go/godot-docs点击查看免费下载导读BoneSpaceAdjuster3D是 Godot 引擎中用于处理骨骼皮肤缩放skin scale与子骨骼关节位置同步的专用SkeletonModifier3D修正器它接收一个缩放值并将其转换为子骨骼的位置偏移。本文基于 Godot 官方文档仓库中该类的完整参考文档classes/class_bonespaceadjuster3d.rst系统讲解其继承关系、属性、全部方法、典型使用场景与底层原理帮助你掌握通过Skeleton3D.set_bone_skin_scale()调整骨骼视觉厚度而不破坏骨骼链关节位置的完整实战方案。阅读完成后你将能够在自己的角色骨骼系统中正确配置与驱动BoneSpaceAdjuster3D。一、为什么需要 BoneSpaceAdjuster3D皮肤缩放与骨骼位置的关系在骨骼动画系统中Skeleton3D的每一根骨头都定义了从父关节到子关节的变换关系。Godot 提供了一个特殊的缩放能力——皮肤缩放skin scaleSkeleton3D.set_bone_skin_scale(bone_idx, skin_scale)将指定骨骼的皮肤缩放设为skin_scaleVector3其官方说明明确指出该缩放不会影响骨骼的子骨骼它主要用于修改皮肤的可视厚度visual thickness见 classes/class_skeleton3d.rst 中set_bone_skin_scale方法描述。对应地Skeleton3D.get_bone_skin_scale(bone_idx)返回指定骨骼的皮肤缩放值见 classes/class_skeleton3d.rst 中get_bone_skin_scale方法描述。这里存在一个关键矛盾皮肤被缩放变粗或变细后骨骼本身既不被缩放也不会被重新定位于是子骨骼的关节原点仍然停留在缩放前的坐标上。当你想用皮肤缩放拉长或加粗某段肢体或者某根骨骼拥有多个子骨骼时子骨骼的位置就会与变形后的皮肤脱节。BoneSpaceAdjuster3D正是为解决这一脱节而生的它输入一个缩放值并将其转换为子骨骼的位置Inputs a scale and converts it to the position of a child bone。二、类层次与继承关系BoneSpaceAdjuster3D的完整继承链为BoneSpaceAdjuster3D SkeletonModifier3D Node3D Node Object它属于 Godot 4.3 引入的Skeleton Modifier骨骼修正器体系。其基类SkeletonModifier3D的职责是通过父节点自动获取目标Skeleton3D当场景中存在AnimationMixer时修正总是在动画播放完成之后执行因此可以用它实现自定义 IK 求解器、约束或骨骼物理见 classes/class_skeletonmodifier3d.rst 的 Description。在同族修正器中它拥有两个关键的内置属性详见下文active默认true控制修正器是否参与处理influence默认1.0控制修正的影响力Skeleton3D会基于该值对修正结果做混合因此修正器内部必须始终输出 100% 的结果、不自行插值。从引擎的实现角度看BoneSpaceAdjuster3D与BoneConstraint3D、BoneTwistDisperser3D、IKModifier3D、SpringBoneSimulator3D、RetargetModifier3D等十余个修正器共同继承自SkeletonModifier3D是一套用于在动画播放后统一改写骨骼姿态的机制。三、属性详解BoneSpaceAdjuster3D只暴露两个属性但它们决定了修正器全自动处理还是按骨骼手动配置两种工作模式。3.1 setting_sizeintThe number of settings in the modifier.即修正器中设置项的数量。每个设置项对应一根需要处理的骨骼并通过索引index访问。当你通过set_bone()/set_bone_name()/set_bone_scale()等方法逐项配置骨骼时setting_size会随之增长使用clear_setting()清空后它归零。典型使用方式是用一个循环遍历0到setting_size - 1的所有索引。3.2 use_bone_skin_scale_for_all_bonesbool默认trueIftrue, this modifier processes all bones for whichSkeleton3D.get_bone_skin_scale()is notVector3(1, 1, 1). Iffalse, this modifier allows you to configure whether to process bone skin scaling individually in the settings.这是整个类最核心的开关对应 setterset_use_bone_skin_scale_for_all_bones()与查询方法are_all_bones_using_bone_skin_scale()true默认自动扫描整个骨架凡是get_bone_skin_scale()返回值不等于Vector3(1, 1, 1)的骨骼都会被处理。Vector3(1, 1, 1)是无缩放的语义因此默认情况下你只需要用set_bone_skin_scale()设置哪些骨骼需要皮肤缩放修正器就会自动补齐这些骨骼的子骨骼位置无需任何额外配置——这是最省事的接入方式。false进入手动模式。修正器不再自动扫描而是要求你通过设置项逐根指定骨骼及其缩放来源对每个索引index用set_bone()/set_bone_name()指定目标骨骼再用set_use_bone_skin_scale(index, enabled)决定该骨骼是使用Skeleton3D的skin_scale属性true还是使用自定义缩放值false此时配合set_bone_scale()。属性速查表属性类型默认值说明setting_sizeint—设置项数量随set_bone*方法自动增长use_bone_skin_scale_for_all_bonesbooltrue自动处理所有get_bone_skin_scale()≠(1,1,1)的骨骼四、方法详解该类共 9 个公开方法全部围绕按索引管理设置项设计。所有方法中的index均指设置项索引而非骨骼索引取值范围为0 index setting_size。4.1 设置项的配置方法写操作方法签名说明set_bone(index: int, bone: int)用骨骼索引设置第index个设置项对应的目标骨骼set_bone_name(index: int, bone_name: StringName)用骨骼名称设置第index个设置项对应的目标骨骼对名称比索引更稳定的骨骼链更安全set_use_bone_skin_scale(index: int, enabled: bool)设置第index个设置项是否使用Skeleton3D对应骨骼的skin_scale属性set_bone_scale(index: int, scale: Vector3)当is_using_bone_skin_scale()返回false时手动设置第index个设置项的缩放值。注意官方明确建议scale值不要为零recommended to be non-zero零值会导致子骨骼位置退化为原点、破坏骨架结构clear_setting()清空所有设置项setting_size归零4.2 设置项的查询方法读操作均为 const方法签名说明get_bone(index: int) - int返回第index个设置项所缩放的骨骼索引get_bone_name(index: int) - StringName返回第index个设置项所缩放的骨骼名称get_bone_scale(index: int) - Vector3返回第index个设置项的缩放值is_using_bone_skin_scale(index: int) - bool返回第index个设置项是否使用了Skeleton3D对应骨骼的skin_scale属性4.3 典型调用流程# 手动模式配置示例use_bone_skin_scale_for_all_bones false var adjuster : BoneSpaceAdjuster3D.new() # 设置项 0使用骨骼 3 的 skin_scale 属性 adjuster.set_bone(0, 3) adjuster.set_use_bone_skin_scale(0, true) # 设置项 1对骨骼 5 手动指定一个非零缩放 adjuster.set_bone(0 1, 5) adjuster.set_use_bone_skin_scale(1, false) adjuster.set_bone_scale(1, Vector3(2.0, 2.0, 1.0)) # 读取回查 print(adjuster.setting_size) # 2 print(adjuster.get_bone(1)) # 5 print(adjuster.is_using_bone_skin_scale(1)) # false print(adjuster.get_bone_scale(1)) # (2, 2, 1)五、实战场景与配置步骤5.1 场景一自动模式——最简单接入当你只想让某根骨骼变粗/变细同时让它的子骨骼跟上时不需要写任何 GDScript 配置在场景树中为Skeleton3D添加一个BoneSpaceAdjuster3D子节点修正器通过父节点自动找到目标骨架保持use_bone_skin_scale_for_all_bones true默认值运行时对目标骨骼调用skeleton.set_bone_skin_scale(bone_idx, Vector3(1.5, 1.5, 1.5))修正器自动扫描到该骨骼的get_bone_skin_scale()不为(1,1,1)随即把它的子骨骼位置重新定位到缩放后的皮肤表面。5.2 场景二调整骨骼长度 / 多子骨骼骨骼官方描述明确指出该修正器适用于两类特殊情形想用set_bone_skin_scale()调整骨骼长度例如沿骨骼轴向拉伸一段肢体时骨骼拥有多个子骨骼时一个父骨骼分叉出多个子骨骼皮肤缩放后每个子关节都必须重新定位。这两种情形下子骨骼的跟随不能靠Skeleton3D自身完成因为皮肤缩放不作用于子骨骼必须由BoneSpaceAdjuster3D把缩放换算为子骨骼的位置偏移。5.3 场景三手动逐根控制当骨架复杂、只想处理其中少数骨骼、或想用自定义缩放值而非skin_scale属性时将use_bone_skin_scale_for_all_bones设为false按第四节流程逐项配置即可。六、底层机制与配套知识点6.1 修正器处理时机作为SkeletonModifier3D的子类BoneSpaceAdjuster3D的改写发生在AnimationMixer播放完成之后、每帧骨骼姿态输出之前。这意味着它的修正结果会覆盖动画/IK 设置的骨骼姿态且会被基类自动混合influence因此不要在修正逻辑内部再手动应用influence插值见 classes/class_skeletonmodifier3d.rst 中_process_modification_with_delta的说明。6.2 与 RetargetModifier3D 的配合若你的角色使用骨骼重定向retarget需注意RetargetModifier3D的copy_bone_skin_scale属性默认true会把源骨架的get_bone_skin_scale()复制到子骨架的映射骨骼上见 classes/class_retargetmodifier3d.rst。这意味着重定向场景下皮肤缩放会被自动传递子骨架上的BoneSpaceAdjuster3D也会随之生效若你想在子骨架上手动用set_bone_skin_scale()覆盖必须先把copy_bone_skin_scale设为false否则即使源骨架未设置皮肤缩放子骨架映射骨骼也会被写入(1,1,1)而覆盖你的手动值。6.3 已知限制官方文档同时给出两条重要提示见 classes/class_skeleton3d.rst 中set_bone_skin_scale的描述皮肤缩放可能会破坏部分依赖骨骼长度的 SkeletonModifier 类如 SpringBoneSimulator、IKModifier3D的 gizmo 显示皮肤缩放本身不改变骨骼姿态因此BoneSpaceAdjuster3D只是同步关节位置并不会让骨骼旋转/平移本身产生缩放。七、总结BoneSpaceAdjuster3D是 Godot 骨骼系统中皮肤缩放后关节同步问题的标准答案自动模式默认下零配置生效只需配合Skeleton3D.set_bone_skin_scale()使用手动模式下通过set_bone/set_bone_name/set_bone_scale/set_use_bone_skin_scale/clear_setting五组读写方法实现逐骨骼精细控制与RetargetModifier3D.copy_bone_skin_scale联动时注意覆盖语义使用set_bone_scale()手动指定缩放时务必保持非零值。结合官方参考文档 classes/class_bonespaceadjuster3d.rst、基类 classes/class_skeletonmodifier3d.rst 以及配套的 classes/class_skeleton3d.rst、classes/class_retargetmodifier3d.rst你可以完整掌握从皮肤缩放到子骨骼跟随的整条链路为角色肢体增粗、骨骼拉伸等定制化骨骼效果提供稳定可靠的技术支撑。赞分享文档教程游戏开发【免费下载链接】godot-docsGodot Engine official documentation项目地址https://gitcode.com/GitHub_Trending/go/godot-docs点击查看免费下载相关推荐Godot 4 骨骼瞄准修改器 AimModifier3D 完全指南让骨骼平滑注视参考骨骼Godot 4 骨骼瞄准修改器 AimModifier3D 完全指南让骨骼平滑注视参考骨骼 AimModifier3D 是 Godot 4.7 引入的骨骼修改文档教程游戏开发Slide高级设置与个性化配置打造专属Reddit浏览环境的完整指南Slide高级设置与个性化配置打造专属Reddit浏览环境的完整指南 Slide是一款开源无广告的Android Reddit浏览器通过丰富的高级设置选项文档教程游戏开发Balena Etcher终极指南三步解决操作系统镜像烧录难题Balena Etcher终极指南三步解决操作系统镜像烧录难题 你是否曾经因为制作启动盘失败而浪费数小时是否担心误操作损坏系统硬盘Balena Etche桌面应用开发工具智能硬件上一篇OceanBase数据库审计日志分析工具开源与商业工具对比下一篇PostHog 前端 QA 测试用例设计指南从 diff 到可执行浏览器验证计划创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表