SharpDX + BulletSharp
物理演算をやりたい。
物理エンジンを選ぶ
いろいろ調べたけれど、今回は .NET 用ラッパーがある Bullet を選びました。
bulletsharp - BulletSharp is a .NET wrapper for the Bullet physics library. - Google Project Hosting
こちら、参考にしました。
3D物理エンジンの比較 ( ソフトウェア ) - Star☆Dust〜ゲームとか萌えるAIとか作りたい〜 - Yahoo!ブログ
3D物理エンジンの比較2 ( ソフトウェア ) - Star☆Dust〜ゲームとか萌えるAIとか作りたい〜 - Yahoo!ブログ
Bullet を使う
Bullet の使い方は、以下の書籍から習いました。
Amazon.co.jp: Learning Game Physics with Bullet Physics and OpenGL 電子書籍: Chris Dickinson: Kindleストア
サンプルソースコード付きでページ数の少ない本で、とりあえず初めて見る目的で読む分には都合が良いと思いました。
公式のサンプルはどうもミニマムじゃないので分かりにくい。
3 章まで読んだ内容で、コリジョンを処理するプログラムを作成しました。
BulletSharp for SharpDX を使うとビルドエラーが起きる
Bullet を使うよりも、BulletSharp を正しく使える環境を用意することに時間がかかりました。
nuget から SharpDX を導入している環境で BulletSharp for SharpDX のアセンブリを参照して実装を行うと、ビルド時にエラーが出ました。
Error 1 The type 'SharpDX.Vector3' is defined in an assembly that is not referenced. You must add a reference to assembly 'SharpDX, Version=2.6.3.0, Culture=neutral, PublicKeyToken=null'.
SharpDX がアカンといわれる。参照しているはずなのに。
nuget から SharpDX を導入した場合、以下の SharpDX.dll が参照されていました。
packages\SharpDX.2.6.3\build\..\Bin\DirectX11-Signed-net40\SharpDX.dll
これは、"SharpDX, Version=2.6.3.0, Culture=neutral, PublicKeyToken=b4dcf0f35e5521f1" な DLL です。
PublicKeyToken が null ではない。
どうも、BulletSharp は、PublicKeyToken=null な SharpDX しか受け付けないようなビルドが行われているっぽい?
そこで、nuget から SharpDX を導入した時に一緒に落ちてきている以下の Unsigned な DLL を参照するように変更します。
packages\SharpDX.2.6.3\build\..\Bin\DirectX11-net40\SharpDX.dll
これで正しくビルドが通りました。