ammo-mmd-physics-hacks
Installation
SKILL.md
WebGL MMD Physics (Ammo.js) 终极调优黑皮书
症状
- [拉扯炸模] 拖拽/位移模型时,衣服和头发滞后拉长,被扯成面条或尖刺。
- [旋转撕裂] 快速旋转模型(滚筒洗衣机效用)时,衣服因极大离心力瞬间炸裂错位。
- [投石机效应] 加载 VMD 极速舞蹈动作时,衣服像被抛石机甩出一样瞬间崩坏乱飞。
- [平躺坍塌] 角色平躺或倒立时,受限于原版向外的单向关节约束,衣服向内发生挤死震荡。
- [卡死冻结] 衣服/头发较多(高密度骨骼)时,浏览器瞬间卡死长达数秒,帧率狂跌。
根本原因与解决方案
1. Mode 2 空间锚点撕裂与归位失效
- 问题: 原先为了防止 Mode 2 被
setWorldTransform暴力对齐拉扯起刺,曾将其强制降级为 Mode 1。但 Mode 2 对应的刚体(如头发根部)本身没有弹簧连接身体!降级后其失去了固定锚点,只会被重力拉扯落下,动作结束后永远无法归位。 - 解决方案: 撤销降级,正确实现 Mode 2 运动学同步。不仅不能降级,反而应依靠 Ammo.js 最标准的
setCenterOfMassTransform并同步 Motion State,来执行无撕裂的中心重置。并附加body.setActivationState(4)彻底关闭休眠,防止动作静止时刚体被算法冻住回不去。
2. 人体碰撞防撞层的“幽灵穿透”
- 问题: 虽然通过
scale保留了最大的身躯护盾,但在高速舞蹈下,衣服依然会无伤穿插人体。原因是负责同步骨骼躯干 (Mode 0) 的_setTransformFromBone错误使用了setWorldTransform(),这在物理引擎中等同于“每一帧都在瞬移重置”,使得躯干刚体由于无连续运动状态而在 Bullet 内部毫无撞击动量反馈。 - 解决方案: 运动学状态同步 (MotionState Sync)。删掉纯粹的
setWorldTransform,改为专职喂食body.getMotionState().setWorldTransform()。Bullet 会在底层的stepSimulation中根据上一帧对比自动求导算出极其精确的高速内向动能并激活弹道击退反馈!彻底打破幽灵穿模。