弹簧骨骼
使用 Spring Bones 为可穿戴物添加动态物理效果
什么是 Spring Bones?
Spring Bones(也称为 jiggle bones 或 physics bones)是添加到可穿戴物上的额外骨骼,它们会根据 Avatar 的移动和重力动态运动,而不是由动画片段驱动。它们通过让头发、耳环、披风、腰带、马尾以及其他悬挂配饰自然地摆动、弹跳和回弹,为这些元素注入生命,使 Avatar 在行走、奔跑或转身时看起来更生动。
Spring Bones 是 不是 基础 Avatar 骨架的一部分。它们是在 Blender(或任何 3D 软件)中添加到 Avatar 基础骨架上的附加骨骼,其物理行为会在上传后于 Builder 中配置。
此实现遵循 VRM Spring Bone 标准,这是一种在 VRM 和 MMD 等格式中广泛采用的 Avatar 物理约定。

Spring Bones 的工作原理
一个 弹簧链 是一组共同模拟物理效果的骨骼,且至少需要两个骨骼:实际的弹簧骨骼和一个末端骨骼。单独的一个弹簧骨骼不会产生任何运动——模拟需要弹簧骨骼头部来驱动物理,而末端骨骼的头部则定义几何端点。更长的链条(3 个及以上骨骼)会带来更平滑、更自然的运动,非常适合更长的头发或披风。
父弹簧骨骼 — 链中的第一个骨骼。它拥有物理配置(刚度、重力、阻力等)。通过在
springbone出现在骨骼名称中的任意位置(不区分大小写)来识别。子弹簧骨骼 — 它是层级中前一个骨骼的子级。它继承父级的物理参数,并构成链条。
末端弹簧骨骼 — 链中的最后一个骨骼。它定义链条的几何端点,但不受模拟影响,也不会变形任何网格。
Spring Bones 的链条,或层级,应当是 线性的,这意味着每个骨骼只能有一个子骨骼。拥有两个或更多子骨骼的骨骼可能会出现意外行为。


层级结构
要让 Spring Bones 正常工作,它们必须作为 Avatar 原始骨骼中的某一个的子级。例如,对于头发和耳环,层级最上方的骨骼应当父级到 Avatar_Head。对于围巾,将链条父级到 Avatar_Neck 是个不错的想法。对于裙子,也许 Avatar_Hips 或 Avatar_LeftUpLeg/Avatar_RightUpLeg 会很合适。
需要注意这个层级结构是如何工作的。
Hair_springBone_1 (父弹簧骨骼):这是链条最上方的骨骼,它拥有物理配置
Hair_springBone_2 (子弹簧骨骼):这是层级中前一个骨骼的子级,并继承该配置。
Hair_springBone_end (末端弹簧骨骼):它是链条的最后一个骨骼,只作为端点使用。
命名约定
所有 Spring Bones 都必须 包含子串 springbone (不区分大小写)在其名称中。该子串可以出现在任何位置:
SpringBone_hair_left
hair_springbone_l
springbone_earring.R
为了让工作流程更有条理,建议使用以下格式: BodyPart/WearableName_springBone
示例: Hair_springBone_1, Earring_springBone.L 等等……只要遵循 Blender(或你偏好的软件)关于左右侧的命名约定,就可以自由使用最适合你的格式。
限制
每个可穿戴物必须遵守以下 Spring Bone 限制:
最大 6 每个可穿戴物的 spring chains 数量
最大 12 总 spring bones 数(所有链中骨骼总和)
最大链深度为 6 个骨骼
在 Blender 中创建 Spring Bones
Spring Bones 是你在 Blender 中为基础 Avatar 骨架创建的附加骨骼。物理参数会在 Builder 中稍后配置——你现在只需要设置骨骼层级。
要创建新骨骼,请选中 avatar Armature,然后在 Edit Mode中确保光标位于你想创建骨骼的位置,然后按 Shift+A。另一种方法是通过复制现有骨骼,按 Shift+D。一旦有了链条中的第一个骨骼,按 E 进行挤出并创建链条的其余部分。

需要注意的是,弹簧链不必连接到骨架父级,因此你可以将其放在网格上的任何位置。不过,弹簧链 必须 保持连接,不能偏移任何弹簧骨骼。
创建好骨骼后,按照上面的命名约定重命名它们,并确保将链条父级到正确的骨骼。虚线会显示链条的父级。如果没有虚线,说明该链条没有父级。在 Edit Mode中,先选中子骨骼,再选中父骨骼,然后按 Ctrl+P > 保持偏移.

要重命名骨骼,请在 Edit Mode 或 Pose Mode 中选中它,前往 Bone Properties 选项卡,并按照命名约定重命名。对链条中的所有骨骼都这样做。


蒙皮网格
为此,请转到 对象模式,先选中网格,按 Shift 并选择骨架,然后按 Ctrl+P. 使用空分组 或 使用自动权重.

使用自动权重
顾名思义,使用这种方法时,Blender 会尝试通过为骨架中的每根骨骼创建顶点组并为每个组分配自动权重来自动设置蒙皮权重。这在某些情况下可能有效,但也可能需要一些调整。你可以通过点击 数据 选项卡中。
如果你确定某些骨骼不需要影响网格,你只需点击 锁定图标 来锁定你想要的分组,然后点击下拉菜单并 删除所有未锁定的分组 将它们从对象中移除。例如,如果你在处理头发,为脚和手创建分组毫无意义。在这种情况下,删除所有不是头部或弹簧骨骼的分组,就像下面的示例一样。还要确保删除弹簧链末端骨骼的分组。

使用空分组
在这种方法中,Blender 会为骨架中的每根骨骼创建所有顶点组,但默认权重为零。你需要在 Edit Mode 中手动分配权重,或者在 Weight Paint 模式下进行绘制。这样你可以更精确地控制每个组影响的内容,对硬表面或需要完全分配到特定组的对象尤其有帮助。无论如何,一旦分配好权重,就需要先在 Pose Mode 中测试,然后再在 Weight Paint 中微调。

绘制权重
要测试蒙皮后的网格,请选中骨架并转到 Pose Mode,设置一个关键帧,然后旋转骨骼创建另一个姿势并再设置一个关键帧。这样你就能检查网格在运动中的变形情况。设置好姿势后,返回到 对象模式,选中网格并转到 Weight Paint.

在 Weight Paint,在 Tools 选项卡中你会找到不同的画笔来调整蒙皮权重。选择你要编辑的顶点组(如果它们已锁定,只需解锁即可编辑影响)并使用画笔添加或移除影响。黑色表示零影响,而红色表示该组完全影响网格。启用 叠加显示 中的线框会让你更容易看清正在绘制的内容。

使用添加、减去或平滑画笔来获得想要的结果。也要测试不同的极端姿势,看看网格如何变形,以及是否还有顶点没有分配权重。如果你对结果满意,就可以导出了!
导出
导出前,请确保删除在测试姿势时创建的任何动画片段。进入 Pose Mode,选中所有骨骼 一个 并按 Ctrl+R,然后 Ctrl+S 最后按 Ctrl+G 以删除骨架上的任何变换。然后回到对象模式,将 Display Mode 从 View Layer 改为 Blender File,展开 Actions,右键并删除动画文件。

如果场景中还有其他对象,比如 avatar 网格,请在 Outliner 中点击眼睛图标关闭其可见性。然后,转到 文件 > 导出 > gltf 2.0 (.glb, .gltf)。在导出设置中,展开 Include,并在 限制为 切换 可见对象。点击导出,就可以将文件上传到 Builder 了!

在 Builder 中配置 Spring Bones
在上传包含 springbonespringbone 命名的骨骼后,Builder 会自动检测它们并显示 弹簧骨骼 配置面板。

在此面板中,你可以为每个弹簧根骨骼配置物理参数。Builder 中的 Avatar 预览会立即反映你的更改,因此你可以实时微调其行为。
参数参考
刚度力
范围
0 到 4
默认
2.0
控制骨骼尝试回到静止姿势的强度。这就是恢复力——可以把它看作弹簧的“"firmness"”。
0:骨骼将完全不会回到静止状态——它只会在重力下无力地垂着。
低值 (例如 0–1):骨骼较松散、下垂,自由摆动。适合长而飘逸的头发或轻量悬挂配饰。
高值 (例如 3–4):骨骼较硬,保持接近原始位置并快速回弹。适合短发或刚性配饰。
重力强度
范围
0 到 2
默认
0
控制每一帧作用于骨骼的重力大小。
0:没有重力效果——骨骼只受运动惯性和刚度影响。
低值 (例如 0.3–0.8):轻微的重力拉扯,适合大多数配饰。
高值 (例如 1.5–2.0):强重力拉扯,会让骨骼明显下垂。
重力方向
格式
X、Y、Z 向量
默认
X: 0, Y: -1, Z: 0 (向下)
设置世界空间中重力的方向。默认情况下,重力向下拉(Y = -1),模拟自然重力。
0
-1
0
向下(自然重力,默认)
0
1
0
向上(漂浮/超自然效果)
1
0
0
向左
-1
0
0
向右
0
0
1
向前
0
0
-1
向后
你可以组合轴向(例如, X: 0.5, Y: -0.5, Z: 0)来表示对角方向。这对于模拟类似风的效果或为超自然角色营造漂浮感很有用。
阻力
范围
0 – 1
默认
0.5
控制骨骼多快失去动量并稳定下来。可以把它看作空气阻力或阻尼。
低值 (例如 0–0.2):骨骼会自由摆动很长时间才稳定下来,就像摩擦很小的钟摆。
高值 (例如 0.7–1.0):骨骼在运动后几乎会立刻稳定下来,呈现沉重或被阻尼的感觉。
1:骨骼几乎不动——最大减速。
中心(可选)
格式
骨骼名称(下拉菜单)
默认
无
一个可选的参考骨骼,用于计算 Spring bone 相对于 Avatar 上某个点的运动,而不是相对于世界空间。这可以防止当 Avatar 四处移动(行走、奔跑)时,弹簧链摆动过度。
没有中心骨骼时,弹簧会在世界空间中计算惯性——Avatar 每走一步,骨骼都会像整个世界在移动一样作出反应,导致行走时摆动过度。
有中心骨骼时,模拟会使用该骨骼的空间作为参考坐标系,因此只有 Avatar 的 局部 运动(转头、身体弯曲)才会触发弹簧反应。
根据可穿戴物所在身体部位选择中心骨骼:
头部(头发、耳环、头冠)
Avatar_Head
上半身(披风、项链)
Avatar_Spine
下半身(腰带、裙装配饰)
Avatar_Hips
常见用例与推荐值
以下是建议的起始值。可利用 Builder 的实时预览按需调整。
长发 / 马尾
1.0 – 2.0
0.3 – 0.8
0, -1, 0
0.3 – 0.5
Avatar_Head
链中的骨骼越多 = 运动越平滑
短发
3.0 – 4.0
0 – 0.3
0, -1, 0
0.4 – 0.6
Avatar_Head
更高的刚度会让头发更贴近头部
耳环
0.5 – 1.5
0.5 – 1.0
0, -1, 0
0.4 – 0.6
Avatar_Head
短链(2–3 根骨骼),较低刚度以便更好地垂坠
披风 / 斗篷
1.0 – 2.0
0.5 – 1.0
0, -1, 0
0.3 – 0.5
Avatar_Spine
使用多条平行链来增加宽度
腰带 / 悬挂饰物
1.5 – 2.5
0.3 – 0.8
0, -1, 0
0.5 – 0.7
Avatar_Hips
较高的阻力适合更重的物体
漂浮 / 幽灵效果
1.0 – 2.0
0.5 – 1.0
0, 1, 0
0.3 – 0.5
Avatar_Spine
使用向上重力营造超自然外观
限制
使用 spring bones 时请记住以下限制:
没有碰撞体:Spring bones 不会与 Avatar 的身体或其他骨骼发生碰撞。在极端姿势下,链条可能穿过身体网格。未来版本可能会加入碰撞体支持。
无跨可穿戴物交互:每个可穿戴物的弹簧链都是独立的。不同可穿戴物之间的链条不会相互影响。
没有全局风:场景级别没有风力。你可以通过调整每个可穿戴物的
gravityDir为对角方向。远处 Avatar 的性能表现:为节省性能,距离本地玩家较远的 Avatar 会禁用 spring bone 模拟。附近的 Avatar 会正常显示 spring bone 物理效果。
兼容替代客户端:带有 spring bones 的可穿戴物与替代客户端以及较旧版本的 Explorer 向后兼容,但 spring bone 元素会保持静止。在某些情况下,可能会有轻微的视觉问题。
技术参考
Spring bone 物理使用两个协同工作的独立组件:
该
.glb文件 只包含骨骼名称(带有springbone标记)及其层级。模型文件中不存储任何物理参数。可穿戴物的物品元数据 (
wearable.data.springBones)以 JSON 形式携带所有物理参数。
当你在 Builder 中配置参数时,它们会被保存到可穿戴物的物品元数据中—— .glb 文件不会因参数编辑而被修改。
你无需直接操作这种格式——Builder 会负责读写它。本节仅供参考。
.glb 节点层级(示例)
模型文件只包含骨骼名称和父子关系:
物品元数据(wearable.data.springBones)
物理参数存储在可穿戴物的元数据中,并以 GLB 内容哈希作为键:
models以 GLB 内容哈希为键。男女版本共用相同的.glb会只有一个条目。每个骨骼条目都使用来自
.glb模型文件的精确节点名称(区分大小写)。末端骨骼(例如,
springbone_earring_r_tip)不需要元数据条目——它们只充当几何端点。
元数据参数
刚度
浮点数
2.0
朝向静止姿势的恢复力。范围:0–4。
gravityPower
浮点数
0
重力大小。范围:0–2。
gravityDir
vec3
[0, -1, 0]
世界空间中的重力方向。
drag
浮点数
0.5
阻尼/减速系数。范围:0–1。
isRoot
布尔值
—
此节点是否为弹簧链的根节点。需要为 true 根骨骼使用。
center
字符串
—
可选。用于相对惯性计算的参考骨骼名称。
最后更新于