2012年

3月

07日

C#でBullet Physicsを使いたい

去年の8月辺りに参考書を買ってそのまま放置されてましたが・・・ようやく勉強を始めました。結構面白いです。

そもそも物理演算の勉強をしようと思ったのは、開発中のプログラムに物理演算データが伴うものが結構あったから。BlenderだったりMMDだったりColladaだったり。Bullet Physicsを選んだ理由もこれらに搭載されてる物理エンジンがBullet Physicsだったからです。Physxとも迷いましたが、結局友人達の勧めで「Bullet Physics」を選択しました。

 

勉強を始める前に双方について調べてみました。

 

Bullet PhysicsはRadeonでお馴染みのAMD社が推奨している物理エンジンで、完全にオープンソースでなので結構利用されてるようです。

 

PhysxはコチラもGPUでお馴染みのNVIDIA社からリリースされている物理エンジンで当然GFourceとは相性はいいらしく、他社のグラフィックボードで演算するとうまく動かなかったりするようです。こちらはPCゲーム開発では無料ですが、TVゲーム開発だと有料らしいです。

 

Bullet Physics 公式ページ

NVIDIA Physx公式ページ

で、どのように使うことになるのかを考えてみた。

 

まずBlenderのPMDインポーター。MMDのモデルデータ内の剛体やらジョイントをBlenderへ渡すことが必要だが、これはBulletの仕様を理解すれば解決すると思う。なので目下のところBulletの勉強を続けることで大丈夫そうです。同理由でGTAViewer、MMDfromColladaのCollada(.dae)ファイルの物理データ出力も解決。

 

後は描画周り。GTAViewerとMMDfromColladaで読み込んだモデルの物理演算結果を確認できるようにしたいのでこれらにはBulletを組み込む作業が必要です。

 

ところでGTAViewerとMMDfromColladaは共にC#.Netで組んでいるのですが、Bullet PhysicsはC++でコーディングされてるのでこのままだと使えません。

 

当初はC++/CLIで自作のラッパークラスライブラリを作ろうかと思っていたのですが、ソース量の多さに絶望してやめました。

 

自作ライブラリは諦めてC#用のBulletライブラリを探したところ幾つか見つけました。

 

BulletX XNADev.ru(Bullet for XNA Physics Library)

XNA用のBullet Physicsライブラリ。残念なことにXNA2.0向け。 

 

MMDX(MikuMikuDance for XNA/SlimDX)

XNA、SlimDXでMMDを読み込むライブラリ。作者のウィルフレムさんが移植したBullet Physics(VC#プロジェクト)が入っている。XNAやSlimDXに依存せずに使えるようになっているようだ。オープンソースなのでBulletのプロジェクトだけを取り出して使うことが可能だが、移植してない機能が幾つかあるらしい。

 

ちなみに、このBulletはラッパークラスではなくC#で一からコーディングしてあるから驚きました。あの大量のコードを・・・本当にすごいですね。

 

BulletSharp

名前のとおりC#版Bullet Physics。こちらはXNA、SlimDXだけでなく「OpenTK」、「SharpDX」「Axiom」、「Mogre」と幾つか知らないものが出てきたが幅広く対応している。

 

例えばBulletのbtVector3クラスの代わりにXNAやSlimDXの場合Vector3に置き換えられているのでそれぞれに依存したライブラリになっている。

 

OpenGLにも対応しているのはありがたいけど、Tao Frameworkも採用してほしかったな・・・

以上、上記の3つを見つけた。私はこの中で「BulletSharp」を使うつもりです。GTAViewerにはXNA版を、MMDFromCollada DirectX版にはSlimDX版を使う。

 

MMDFromCollada OpenGL版はこの際なのでOpenTKへ移植するつもりです。今まで行列演算等にSlimDXを使っていたのですが、OpenTKだとその必要も無いようです。これでDirectXに影響されず、OpenGLだけのプログラムを組むことが出来ます。ただ画像読み込みに関する機能はないようなのでそこだけTao FrameworkのDevILライブラリを使おうと思います。

 

あとSharpDXも気になります。なんでも必要最低限のランタイムだけあれば動作し、しかもSlimDXより高速らしいです。軽く触ってみましたがクラス、関数、列挙体の仕様、名前等はSlimDXと殆ど変わりなく、関数のパラメータの受け渡しが若干異なるくらいです。時間があればこちらも本格的に触ってみたいですね。

 

まぁ目下はBullet Physicsのお勉強ですね。勉強が終わり次第BulletSharpに触っていこうと思います。

 

参考文庫:物理エンジン Bulletプログラミング (I・O BOOKS)

コメントをお書きください

コメント: 1
  • #1

    u=15668 (土曜日, 20 4月 2013 09:34)

    I just shared this upon Facebook! My pals will really want it!