はじめに
BulletXは、MMDX作者の方がXNA用にポーティングされたC#オンリーの実装です。
長年使わせていただいていましたが、動きがぽよんぽよんしている問題があり、どうにかしたいと思っていました。
試しにBulletSharpにしてみたのですが、何かまずかったのか、かくかくな物理になりましたので、却下。
そこで、対抗馬でありC#の実装がありサンプルも素晴らしかったPhysXを使えないかともやもやしていたところ、ひょんなことからLeapMotionを手に入れ、一気にモチベーションアップしたので、置き換えてみることにしました。
BulletからPhysX
サンプルが素晴らしかったPhysX.Netの2.8を使います。
https://github.com/stilldesign/PhysX.Net
目的はMMDXの物理エンジンを置き換えることなので、MMDXで使っていない機能は不要です。
MMDXでは、モデルのジョイントの実装にGeneric6DofSpringConstraintを使っているのですが、PhysXでも同じのがあるので、やった、簡単だ、と思ったのが間違いでした。
設定できるパラメータが全然違います。
BulletではジョイントにXYZ方向の最大値最小値の制限を設定できるのですが、PhysXではTwistMotionだけにHigh/Lowが設定できて、他はValueだけ。
PhysXはマイナーなのか、ググってもまともな情報はなし。
公式の方の仕様もなし。MSDNを見習ってほしいものです。
唯一の日本語書籍と思われる某先生の本もさらってみたのですが、肝心なところが書いていません。
MMD for Unityを参考にする
途方に暮れていたところ、UnityがPhysXを使っているという情報をゲットしました。
残念ながらUnityの本には特に書いてなかったのですが、Unityなら動いているMMDの実装があるではないですか。
さっそく失礼して拝見してみたところ、ありました。やりました。
他のパラメータも同様に参考にさせてもらいましたが、PhysXのバージョンが違うのか、ところどころパラメータが違います。
ジョイントがゆっくり外れたり、ジョイントの端が空間に固定されたり、springやdampingなどの設定がおかしかったり、まだまだいろいろありますが、とりあえず、少しずつ動くようになってきました。
まずはここまで。
ソースコード:
https://github.com/yhirano-/STFW/tree/master/SLPhysics