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'
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に追加した。