* “土豆”指的是偶像大师百万现场剧场时光(ミリシタ/MLTD)
这篇文章讲一下土豆的物理。物理我没完全做好,但是至少做到了可以接受的程度。一些改进的想法我放到了代码注释中,有兴趣的人可以尝试实现一下。
在每个身体和头的模型里,都有一个名为 xxx_sway
的 TextAsset
。它里面就描述了这个模型的物理,包括 SwayManager
、SwayCollider
和 SwayBone
。我对 Unity 导入模型之后生成的 GameObject
不是很熟悉,所以不能下结论说土豆用的是什么样的物理系统。所以请忘记我在视频简介里说的“土豆用的不是 Unity 自带的物理系统”的话。不过,考虑到类似的工具是存在的,所以万代可能是自己做了一套。
上面不是关键的问题。关键的问题是,怎么把它转换成尽量和 MMD 兼容的东西?
MMD 使用的物理引擎是 Bullet,所以 PMX 支持三种碰撞体类型,分别是盒(box)、球(sphere)和胶囊(capsule)。还好,在土豆的物理数据中,大多数都是属于这三种类型的。如果忽略里面的一些参数,直接转换过去还是比较简单的。(不过我没做旋转的变换,所以胶囊都是沿着X/Y/Z轴方向的,如果是给 MMD 用的话,也就是做成 TDA 式,物理信息就是错误的。以后有空再说吧。)转换的同时要识别一下这些刚体属于哪个组,加上合适的非碰撞标志。还要注意的是,土豆的刚体的路径指的是其父关节。比如路径为 MODEL_00/BODY_SCALE/BASE/KOSHI/skrt_GP/skrt_F0
的 SwayBone
,对应的骨骼就是 MODEL_00/BODY_SCALE/BASE/KOSHI/skrt_GP/skrt_F0
(下一级是 MODEL_00/BODY_SCALE/BASE/KOSHI/skrt_GP/skrt_F0/skrt_F1
)。这个刚体就该加在 skrt_F0
和 skrt_F1
之间。我一开始直接将刚体放在了对应名称的关节上,结果整个模型都软得不行,甚至会变成一滩水。这是典型的新手错误。
除了刚体,还需要加入一些铰链。铰链我就只在直接连接的刚体之间加了,比如头发的逐级连接。不过如果参考一些 MMD 的模型的话,应该在两根头发的同级刚体之间再加铰链。这跟我们上学期做的布料模型比较相似——当时我们只是加了结构弹簧,但实际上还有抗扭转弹簧(交叉位置的线性弹簧)和抗折叠弹簧(相邻三节点的角弹簧)。不过目前的简易方案已经能取得较为满意的效果,所以我就没去研究稍微复杂的铰链阵列了。