ダウンロード


下記の場所からライブラリをダインロードできます。


Linuxの場合は、tgzファイルをダウンロードします。


コンパイルしてみる


コンパイルにはcmakeが必要です。あらかじめ、apt-getにてインストールしておきます。

% tar xzf bullet-2.78-r2387.tgz
% cd bullet-2.78
% cmake . -G "Unix Makefiles"
オプションは、任意に付けてください。

私の場合は、以下としました。
% cmake ./ -DUSE_DOUBLE_PRECISION=ON -DBUILD_DEMOS=ON -DBUILD_SHARED_LIBS=ON
OpenCLの開発環境は入れていなければデモのコンパイル途中でエラーになるかもしれません。
デモをコンパイルする必要がなければ-DBUILD_DEMOS=OFFとします。
それと、-DUSE_DOUBLE_PRECISION=ONとするとsrc\LinearMath\btScalar.hで定義されるbtScalar型はfloatからdouble型になります。
double型は精度はよくなりますが、速度はどうしても遅くなります。
実行速度を重視するゲーム目的ならばfloatでも問題ないでしょう。

インストール場所を指定する場合は、
% cmake ./ -Dbullet_include_dir=/usr/local/include/bullet 
   -Dbullet_include_dirs=/usr/local/include/bullet 
   -Dbullet_library_dirs=/usr/local/lib
のようにします。ただし上記はデフォルトです。

コンパイルです。"-jN"を付けることで並列にコンパイルし速度が上がります。Nは並列処理数です。
% make -j4

デモを実行するだけならば、次のインストールはしなくても良いです。とばしてください。
% sudo make install
インストール先は、下記の通りです。
/usr/local/lib/pkgconfig/bullet.pc
/usr/local/include/bullet
/usr/local/lib/libMiniCL.a
/usr/local/lib/libBulletMultiThreaded.a
/usr/local/lib/libBulletSoftBodySolvers_OpenCL_Mini.a
/usr/local/lib/libBulletSoftBodySolvers_CPU.a
/usr/local/lib/libBulletSoftBody.a
/usr/local/lib/libBulletCollision.a
/usr/local/lib/libLinearMath.a


テスト用Demoを試してみる


Bulletデモは Bullet/Demosディレクトリにあります。

% cd bullet-2.78/Demos/BasicDemo
% ./AppBasicDemo



メモ


DBUILD_SHARED_LIBS=OFFでの落とし穴


なぜか、-DBUILD_SHARED_LIBS=OFF (デフォルト)でコンパイルしてインストールしたら、こんなエラーが出てしまいました。
ちょっと折れてしまいそうなエラーです。。。
/usr/local/lib/libBulletDynamics.a(btTypedConstraint.o): In function `btRigidBody::~btRigidBody()':
btTypedConstraint.cpp:(.text._ZN11btRigidBodyD2Ev[_ZN11btRigidBodyD5Ev]+0x69): undefined reference to `btCollisionObject::~btCollisionObject()'
btTypedConstraint.cpp:(.text._ZN11btRigidBodyD2Ev[_ZN11btRigidBodyD5Ev]+0x51): undefined reference to `btCollisionObject::~btCollisionObject()'
/usr/local/lib/libBulletDynamics.a(btTypedConstraint.o): In function `btRigidBody::~btRigidBody()':
btTypedConstraint.cpp:(.text._ZN11btRigidBodyD0Ev[_ZN11btRigidBodyD5Ev]+0x4c): undefined reference to `btCollisionObject::~btCollisionObject()'
btTypedConstraint.cpp:(.text._ZN11btRigidBodyD0Ev[_ZN11btRigidBodyD5Ev]+0x71): undefined reference to `btCollisionObject::~btCollisionObject()'
/usr/local/lib/libBulletDynamics.a(btRigidBody.o): In function `btRigidBody::serialize(void*, btSerializer*) const':
btRigidBody.cpp:(.text+0x11d): undefined reference to `btCollisionObject::serialize(void*, btSerializer*) const'
/usr/local/lib/libBulletDynamics.a(btRigidBody.o): In function `btRigidBody::btRigidBody(double, btMotionState*, btCollisionShape*, btVector3 const&)':
btRigidBody.cpp:(.text+0x2d8e): undefined reference to `btCollisionObject::btCollisionObject()'
btRigidBody.cpp:(.text+0x2ee0): undefined reference to `btCollisionObject::~btCollisionObject()'
/usr/local/lib/libBulletDynamics.a(btRigidBody.o): In function `btRigidBody::btRigidBody(btRigidBody::btRigidBodyConstructionInfo const&)':
btRigidBody.cpp:(.text+0x2efe): undefined reference to `btCollisionObject::btCollisionObject()'
btRigidBody.cpp:(.text+0x2f57): undefined reference to `btCollisionObject::~btCollisionObject()'
/usr/local/lib/libBulletDynamics.a(btRigidBody.o):(.rodata._ZTI11btRigidBody[typeinfo for btRigidBody]+0x8): undefined reference to `typeinfo for btCollisionObject'

なんだろう、なんだろうと色々やってたら原因はライブラリの順番にありました。
-lBulletCollision -lBulletDynamics -lLinearMath      // 上記のリンクエラー
としたら、ダメで、
-lBulletDynamics -lBulletCollision -lLinearMath      // OK
としたら、OKでした。
おそらく、ライブラリがライブラリを参照しているのでしょう。ややこしや。

タグ:

Bullet
最終更新:2011年07月31日 20:51
添付ファイル