XcodeでBullet SDKを使う

物理シミュレーションをする上で物理エンジンを使いたいなと思い、Bulletを試してみることにした。

最初はPhysXと迷った。相当迷った。


Position Based Fluids Demonstration - YouTube

このPhysXの流体シミュレーションを見てすごく感動した。
けど、調べてみるとPhysXってライセンス云々が面倒くさそう。
Bulletは商用でも自由に使用できるみたいだし、Bulletを使うことにした。

(この流れだとBullet大したことないんじゃね的に見えるけど、Bulletも普通にすごかったです。Soft Body Simultationできるし)


Bulletのダウンロード

Downloads - bullet - Bullet is a professional free 3D Real-Time Multiphysics Library - Google Project Hosting
こちらから。UNIX用ということで上の方のtgzをダウンロードしました。
ちなみに、この記事執筆時点では、最新バージョンは2.82みたい。

Bulletのビルド

ダウンロードして展開すると、ソースコードが入ってます。
いつものようにmakeしよう。
ちなみに、Bulletではcmakeを採用しているので、入ってない人はbrewなどで入れよう。

 cd path/to/bullet
 mkdir bullet-build
 cd bullet-build
 cmake .. -G "Unix Makefiles" -DINSTALL_LIBS=ON -DBUILD_SHARED_LIBS=ON -DFRAMEWORK=ON \
   -DCMAKE_OSX_ARCHITECTURES='i386;x86_64' -DCMAKE_BUILD_TYPE=RelWithDebInfo \
   -DCMAKE_INSTALL_PREFIX=/Library/Frameworks -DCMAKE_INSTALL_NAME_DIR=/Library/Frameworks \
   -DBUILD_DEMOS:BOOL=OFF
 make -j4
 sudo make install

【参考】Installation - Physics Simulation Wiki

Xcodeプロジェクト側の設定

次は、XcodeのプロジェクトにBulletのFrameworkを紐づける。
プロジェクトは勝手に作ってもらうとして、既にプロジェクトはできている前提で話を進める。
Xcode左ペインのプロジェクト名をクリックするとプロジェクトの設定画面が出てくるので、Build Phasesを選択。

f:id:levelfour:20140205094741p:plain

真ん中のLink Binary With LibrariesというところにBulletのFrameworkを追加すべく左下の「+」をクリックしてFrameworkを検索するんだけど、出てこない。
それもそのはず、ここで検索できるFrameworkのデフォルトのパスは

/System/Library/Frameworks

のFrameworkだけだからだ。それでもって、ユーザーがインストールしたFrameworkは

/Library/Frameworks

に入ってる。今回のBulletもそのディレクトリを見てもらえばインストールされてることがわかる。
それで、サンプルのHello worldをビルドする上で必要になるFrameworkが

  1. BulletCollision.framework
  2. BulletDynamics.framework
  3. LinearMath.framework

の3つ。これらをさっきのディレクトリからドラッグしてきてLink Binary With Librariesの上にドロップ。
すると、上の画像のように追加される。
こうするとBulletが使えるようになる。

補足

Hello worldでは

#include <btBulletDynamicsCommon.h>

というヘッダをincludeしているのだけれど、これはインクルードパスが通っている場合。
今はインクルードパスを通さずにFrameworkだけ直に投入したので、

#include <BulletDynamics/btBulletDynamicsCommon.h>

としてやる必要がある。

【参考】Creating a project from scratch - Physics Simulation Wiki


Bulletを使えば、たぶんポリゴンの設定をしてやれば勝手に衝突軌道とか計算してくれるし、なによりオープンソースで学習用にもなるので、なかなかよさそう。