スキニングモデルの動きを物理対応にしてみる in Silverlight 5 Beta + XNA


Silverlight 5 Beta + XNA互換API」環境下での3Dスキニングモデルの表示プログラム(XModelビューア)を進展させてみました。

主な新機能

  • モデルの一部を力学的運動させることができるようになりました。(画像では判別できないとは思いますが)
  • 設計時モデルの一部のパラメータを簡易編集できるようにしました。

物理運動への対応

 以前より、XModelでの物理の導入は検討していました。これまでは、制作環境下での設定ツールの不在などの問題により停滞していました。

 現在では、各ツールやライブラリのおかげにより、状況が良くなってきて、検討を進めやすくなってきました。

  • 外部のツールやライブラリ
    • MMDとPMDEditorでの物理サポート
    • PMDExportの登場
    • MMDXのBullet PhysicsのC#移植 → 改変版「Bullet.Silverlight」(仮)
  • 自前
    • 自作「MotionCaptor」内
      • PMD形式の読み込み処理
      • PMDからXModelへのインポート
    • PMD版モデル「Lulie」の物理設定 : 以前にある程度調整済み

現在の暫定ワークフロー

  • Metasequoia / Keynoteによるモデル「Lulie」
    • XModelExporter→(XModel: 幾何+材質+骨格+運動)
    • PMDExport→(PMD: 幾何+材質+骨格)→PMDEditor→(PMD: 幾何+材質+骨格+剛体+拘束)→MotionCaptor→(XModel: 幾何+材質+骨格+剛体+拘束)
  • 2つXModelファイルを切り貼り→(XModel: 幾何+材質+骨格+運動+剛体+拘束)

Bullet.Silverlight(仮)

 XNAや.NET対応の3D物理エンジンについては、それほど選択肢があるわけではありません。比較的新しい動きとして、ウィルフレムさんのMMDXプロジェクトの一環で、改めてXNA用に「Bullet Physics」が移植されています。今回は、こちらを利用しました。「stackallocキーワード」に対する代替処理などに、努力が窺えます。
 Bullet.Silverlight(仮)では、「MMDX-v1.61a-src」の「BulletX」をベースにして、Silverlight対応のために、「unsafeキーワード」の排除などの改変しています。

デバッグ行程

 このモデルでの剛体と拘束の設定状態は、まだ調整が必要な様子です。

 今回のデバッグでは、「特定部位が動いたり動かなかったりする問題」が後の方まで残りました。その理由が、剛体のスリープ機能の影響であると特定するのに時間を要しました。モデルデータの変換方法の調整や、Bullet.Silverlightの改変の具合を見ながら、乱数処理や非同期処理になっている可能性を探っていたためです。

 なお、前回の謎は謎のままです。特に理由が見当たらないため、リリースビルドにできない問題は残っています。デバッグビルドに最適化オプションをつけても再現しないようです。

GUI

 GUIの配置を調整しています。スクロールやGridSplitterが期待通りに動くレイアウトにはまだ迷っています。
 アイテム数が多くなる頂点や面に対するGUI要素については、即時に全要素を作ると構築が遅くなります。これについては、リストをそのままリストボックスやコンボボックスのItemsSourceプロパティに渡す方法が簡単で効果的でした。