LoginSignup
1

More than 5 years have passed since last update.

[XNA][PhysX] BulletXをPhysXに置き換える(DOING)

Posted at

はじめに

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1