Sis puella magica!

いろいろ書く予定

Bullet+OpenGLに入門した

levelfour君の記事を読んで物理演算エンジンに興味を持ったのでBulletを学んでみることにした。
OSはUbuntu 13.04

Bulletのインストール

https://code.google.com/p/bullet/downloads/listからbullet-2.82-r2704.tgzをダウンロードして展開し、そのディレクトリに移動して

mkdir bullet-build
cd bullet-build
cmake ../ -G "Unix Makefiles"
make
#pacoで管理するため
sudo paco -lp 'bullet-2.82-r2704' 'make install'
DemosにHelloWorldしかない

DemosをコンパイルするにはmakeするときにOpenGLライブラリが必要らしい。
調べたところOpenGLライブラリはfreeglut3-dev libglew-devを入れておけば良さそう。なので

sudo apt-get install freeglut3-dev libglew-dev

改めてmakeするとDemos/AllBulletDemos/AllBulletDemoからいろいろなDemoで遊べた。

OpenGL入門

物理演算エンジンは初めて触るけど、Bulletで計算した結果をOpenGLで描画すればいいのだろうと思って、まずOpenGLに入門することにした。

自分はhttp://www.wakayama-u.ac.jp/~tokoi/opengl/libglut.htmlのサンプルプログラムを動かしながらOpenGLを学んだ。
記事自体は古いがWisdomSoft(旧)のOpenGLのページもたぶん参考になると思う。

Bullet

物理エンジンはまったくの初心者なので
物理エンジンの流れ - 雑念プログラマーの日記
で流れを理解した。

Bulletの初期化からシミュレーションまでのもう少し詳しい説明は
myb design :: blog :: cocos3d+Bulletで物理シミュレーション (実装編) #cocos2d_2011_adcal
がわかりやすかった。

HelloWorld

まず手始めにHelloWorldを動かしてみた。
このプログラムは球を自由落下させて高さ(y座標)を標準出力に表示するだけだが、Bulletの基本的なところが分かる(たぶん)。
ヘッダやライブラリのパスの指定にはpkg-configを使うといいらしい(pkg-configとか知らなかった)。
Makefile

hello: hello.cpp
	g++ `pkg-config --cflags bullet` $^ `pkg-config --libs bullet` -o $@

HelloWorld+OpenGL

次にHelloWorldに書き足して自由落下する球をOpenGLに描画させてみた。
OpenGLのライブラリを使うのでコンパイル時のオプションには-lglut -lGL -lGLUが必要になる。

反発係数の設定

元のプログラムは地面についた後に跳ね返ることなく、止まったままになるので、反発係数を設定することにした。
void btCollisionObject::setRestitution(btScalar rest)

初速度の設定

初速度もつけてみたいと思ったので調べた。
void btRigidBody::setLinearVelocity(const btVector3 &lin_vel)で速度ベクトルのset
void btRigidBody::setAngularVelocity(const btVector3 &ang_vel)で角速度のset

この他に、練習のため球を二つに増やし、高さを変えて鉛直に並べ、球同士をぶつけるプログラムに書き換えてみたりもした。

振り子

落下以外も作りたいので、次は振り子のようなものを作ることにした。
球の動きに制約条件を追加する。
HelloWorldから地面を取り除き、btHingeConstraintを作成してbtDynamicsWorld::addConstraintでDynamicsWorldに追加した。

描画が面倒

描画するコードをいちいち書くのが面倒だったので今後はDemos/OpenGLに入っているGlutDemoApplicationクラスを利用することにした。
キー入力に対する処理とかもkeyboardCallbackをオーバーライドするだけで変えられるし、物体の追加もinitPhysicsを書き換えるだけで簡単にできる。
コンパイル時はg++に-lbulletopenglsupportとDemo/OpenGLへのパスを指定する。