mikumikudance 中文文档 下载 App

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)可以绕任意轴旋转更灵活的连接
弹簧带弹性的铰链/球形柔软的布料效果

物理开关

全局物理开关

播放控制条上有一个物理开关:

单模型物理开关

每个模型在列表里可以单独开/关物理——多模型场景里可以让某些模型不开物理以提高性能。

部分物理(物理演算オフセット)

部分版本支持"物理偏移"——只让选中的骨骼开启物理,其他关闭。这在某些特殊动作里有用。

物理碰撞与穿模

最常见的物理问题就是穿模——头发穿过身体、裙子穿过腿、配饰飘进模型内部。

穿模的根源

  1. 刚体体积太大:头发刚体太大和身体刚体重叠,物理引擎算不过来
  2. 碰撞组设置不当:不该碰撞的刚体在同一碰撞组里
  3. 关节约束太松:动力学刚体的约束弹簧强度不够
  4. 物理步进频率太低:高速运动时物理引擎模拟跟不上

调优方向(进阶)

用 PMX Editor 打开模型,调整刚体属性:

大多数社区模型已经配好了物理,新手不要轻易去改——改坏了头发会飞上天或粘在头上不动。只有真的遇到严重穿模再去调。

物理 Baking(烘焙)

当你需要精确控制物理效果(比如做一帧帧都要匹配的动作),或者把数据导出到其他软件时,可以把物理模拟的结果烘焙成关键帧——让物理从"动态计算"变成"预设动画"。

操作在 MMD 的动作菜单里,选「物理演算 → 烘焙到关键帧」。

性能考量

物理模拟是 MMD 性能消耗的大头之一:

优化方向:

Bullet 版本

MMD 用的是 Bullet 2.75(非常老的版本,2013 年发布)。新版 Bullet 有更好的性能和更准确的模拟,但 MMD 没有跟进更新。社区分支 MikuMikuMoving 用了更新的 Bullet 版本,物理效果明显改善。