Bullet 物理引擎 — MMD 模型里的刚体与碰撞
一句话解释
MMD 里看到的头发随头部运动自动摇摆、裙子随步伐飘动、耳坠晃来晃去——全靠 Bullet 物理引擎。它在后台模拟真实物理,让模型的这些部件"活起来"。
Bullet 物理引擎
MMD 5.00(2009 年)引入 Bullet Physics 2.75 后,角色的头发、裙摆、配饰等需要动态效果的部位,不再需要手动 K 帧动画——物理引擎自动根据模型运动和重力计算出自然的摆动效果。
Bullet 是一个开源的物理模拟引擎,Blender、许多 3A 游戏也在使用它。
两种刚体类型
MMD 的物理系统基于刚体(Rigid Body)和关节约束(Constraint):
动力学刚体(Dynamic Rigid Body)
- 会被物理引擎主动模拟的刚体
- 典型用途:头发、裙摆、耳坠、手链
- 有碰撞体积,会和其他刚体/世界碰撞
- 受重力影响,有质量和弹性系数
- 不关心骨骼位置——自己在物理空间里运动
这就是为什么你动头的时候头发会飘:头发的动力学刚体在重力和碰撞作用下跟随头部运动方向做自然摆动,而不是"被骨骼拽着走"。
运动学刚体(Kinematic Rigid Body)
- 完全跟随绑定的骨骼的刚体
- 典型用途:角色的躯干、头、手臂、腿——被骨骼"驱动",本身不做物理计算
- 也有碰撞体积,但只是用来阻挡其他动力学刚体
- 不受重力影响
两者的分工
| 动力学 | 运动学 | |
|---|---|---|
| 跟随骨骼? | 不跟随(引擎模拟位置) | 完全跟随 |
| 受重力? | 是 | 否 |
| 碰撞响应 | 主动参与 | 被动阻挡 |
| 典型部位 | 头发、裙摆、配饰 | 身体、四肢 |
一个完整的模型里,身体各部位是运动学刚体(跟随骨骼),头发/裙摆/配饰是动力学刚体(物理模拟)。当身体运动时,动力学刚体因为碰撞和重力被带动起来。
刚体如何绑定骨骼
PMX 模型的刚体设置由模型作者在 PMX Editor 里完成,用户通常不需要手动创建刚体。
绑定关系:
骨骼(Bone) ← 刚体(Rigid Body) ← 关节约束(Constraint)
─────────────────────────────────────────────────────────────
头 Bone → 头运动学刚体 → 与脖子刚体相连
头发骨骼(多根) → 每根头发是动力学刚体 → 相邻头发刚体之间有铰链约束
→ 头顶运动学刚体阻挡
身体骨骼 → 身体运动学刚体 → 阻挡头发/裙摆
裙摆骨骼(多根) → 每片裙摆动力学刚体 → 相邻裙摆之间有约束
→ 腿部运动学刚体阻挡
约束类型
约束(Constraint)决定两个刚体之间的运动关系:
| 类型 | 效果 | 用途 |
|---|---|---|
| 固定(Fixed) | 两个刚体绑定成一体 | 刚体和根骨骼 |
| 铰链(Hinge) | 只能绕一个轴旋转 | 头发丝之间、裙摆片之间 |
| 球形(Spherical) | 可以绕任意轴旋转 | 更灵活的连接 |
| 弹簧 | 带弹性的铰链/球形 | 柔软的布料效果 |
物理开关
全局物理开关
播放控制条上有一个物理开关:
- 开:头发裙摆动起来
- 关:头发裙摆固定在默认姿势(适合手动 K 帧时参考对比)
单模型物理开关
每个模型在列表里可以单独开/关物理——多模型场景里可以让某些模型不开物理以提高性能。
部分物理(物理演算オフセット)
部分版本支持"物理偏移"——只让选中的骨骼开启物理,其他关闭。这在某些特殊动作里有用。
物理碰撞与穿模
最常见的物理问题就是穿模——头发穿过身体、裙子穿过腿、配饰飘进模型内部。
穿模的根源
- 刚体体积太大:头发刚体太大和身体刚体重叠,物理引擎算不过来
- 碰撞组设置不当:不该碰撞的刚体在同一碰撞组里
- 关节约束太松:动力学刚体的约束弹簧强度不够
- 物理步进频率太低:高速运动时物理引擎模拟跟不上
调优方向(进阶)
用 PMX Editor 打开模型,调整刚体属性:
- 缩小碰撞体积
- 把不该碰撞的刚体分到不同碰撞组
- 增大关节约束的弹簧系数
- 增加物理步进频率(MMD 全局设置)
大多数社区模型已经配好了物理,新手不要轻易去改——改坏了头发会飞上天或粘在头上不动。只有真的遇到严重穿模再去调。
物理 Baking(烘焙)
当你需要精确控制物理效果(比如做一帧帧都要匹配的动作),或者把数据导出到其他软件时,可以把物理模拟的结果烘焙成关键帧——让物理从"动态计算"变成"预设动画"。
操作在 MMD 的动作菜单里,选「物理演算 → 烘焙到关键帧」。
性能考量
物理模拟是 MMD 性能消耗的大头之一:
- 1 个普通角色模型:动力学刚体 50-200 个,无压力
- 3 个角色模型 + 全物理:可能开始掉帧
- 多模型 + 物理 + 重特效:低端显卡可能扛不住
优化方向:
- 不用的模型关物理
- 复杂场景先关掉物理预览,渲染时再开
- 把物理结果烘焙成关键帧(一次性计算好,后续不再模拟)
Bullet 版本
MMD 用的是 Bullet 2.75(非常老的版本,2013 年发布)。新版 Bullet 有更好的性能和更准确的模拟,但 MMD 没有跟进更新。社区分支 MikuMikuMoving 用了更新的 Bullet 版本,物理效果明显改善。