- 追加された行はこの色です。
- 削除された行はこの色です。
*はじめに [#q51840fc]
*はじめに [#m7e9958e]
#contents
このページではプログラミングのちょいテクについて掲載しています。
物理エンジン「Bullet」の利用方法についてのメモです
現在掲載している他にも注意しておきたい点がありましたらどんどん編集していってください。
*Bulletについて [#c7a1dd0a]
**Bulletとは [#t0ff3cac]
*クラスの設計について [#kb8d32e1]
**必ず気をつけること [#u6412e53]
- 継承されることを前提としたクラスでは「必ずデストラクタをvirtualにすること」
オープンソースの物理エンジンです。~
Zlibライセンス~
FKと同じ右手座標系を用いています。~
*文字列について [#y5923ee7]
**stringから数値型への変換 [#gd380f3b]
- 文字列から数値型への変換には、整数型なら atoi()、実数型なら atof()を使うとよいが、これらはC標準関数なので引数として const char * を取る。string型の文字列を数値型に変換したい場合は string::c_str()を使って得た const char * を引数に渡すようにする。
std::string piStr = "3.14";
double piValue;
//
piValue = atof(piStr.c_str());
string::c_str()で得たポインタはその場で参照すること。ポインタを保持して使い回すと、ポインタを取得してからstringのインスタンスが消滅したり、内容が変更された際には無効なポインタになる。
公式HP
- http://bulletphysics.org/wordpress/
日本語マニュアル
- http://bulletjpn.web.fc2.com
*vector配列について [#c906ccfa]
vector配列とは「可変長配列」のことであり、C++ではSTLによって提供されているコンテナの一種である。作成時に大きさを確定させる必要がなく、好きなタイミングで好きなサイズに変更したり、末尾に新たな要素を付け足していくこともできる。砕けた言い方をするなら「すごい配列」であり、それ以外の扱いは通常の配列とほぼ同様である。
詳細は[[勉強会資料:http://www.teu.ac.jp/aqua/GS/text/PDF/Container.pdf]]を参照すること。
**お得メモ [#jbb6c159]
- メンバ関数の呼び出しは少々コストがかかるため、繰り返し処理で呼び出すのはできるだけ避けたい。
- for文の条件式は毎ループ評価されるため、条件にsize()を直接使用すると処理時間がかかる。
for(int i=0; i<hoge.size(); i++)
{
〜;
}
とするよりも、
int hogeSize = hoge.size();
for(int i=0; i<hogeSize; i++)
{
〜;
}
の方が好ましい。
**利用準備 [#mf9409a3]
Bullet配布ページ~
- http://bullet.googlecode.com~
CMake配布ページ~
- http://cmake.org/~
ソースコードの配布なのでビルドの必要あり~
Cmakeを使う必要あり?~
Cmake→VisualStudio用のソリューションファイル→VSでコンパイル~
**プロジェクトの設定 [#e50a41b8]
利用したい機能の種類によって設定が変わります~
-すべての機能を利用する場合
--インクルードするヘッダファイル~
btBulletDynamicsCommomn.h~
--インクルードパス~
Bullet/srcフォルダ~
--リンクするライブラリ~
BulletDynamics,BulletCollision,LinearMath~
~
-コリジョン判定のみ利用する場合
--インクルードするヘッダファイル~
btBulletCollisionCommon.h~
--インクルードパス~
Bullet/srcフォルダ~
--リンクするライブラリ~
BulletCollision,LinearMath~
~
~
~
-最近傍点計算のみ利用する場合
--Demos/ConvexHullDistanceを参照~
*Tips [#p2ff2162]
**物理エンジンを利用する利点と欠点 [#w134118d]
-利点
--自分で実装するよりも高速なことが多い
--様々な機能がそれなりに揃っている
--衝突判定や力積計算のコードを書く必要がなくなる
-欠点
--ライブラリの利用法を学ぶ必要がある
--ライブラリの使用法を間違えたことによる分かりづらいエラーが出ることがある
--論文を書くときに内部での処理方法がわからないことがある
--痒いところに手が届かないことがある。自力での拡張が必要なことがある
**実際に利用した感想 [#x676da7b]
-衝突判定を書かなくていいのですごく楽
-でも論文書くときには摩擦,垂直抗力の式が分からなくてぐぬぬぬぬ
-点群同士の衝突など,正直に書くと総当り方式になるところをちゃんと高速化してくれる
-でもGPGPUは専用の実装使わないとダメっぽい(GPGPU計算の布とかクラスがある)
-パラメータの設定の仕方がわかりにくいことがある(摩擦とか)
-パラメータの取得の仕方もわかりにくい事がある(重さとか)
-ブラックボックスは困るけど実装の容易さと速度は◎
**大体の構造 [#i6a71418]
-btDiscreteDinamicsWorld~
Bulletでの物理現象を扱う世界そのもの。~
ここに「登録された」物体の物理挙動が計算される。~
インスタンス生成時に、衝突判定に使うルールなどを設定する必要がある。~
BroadPhaseは衝突が起こりうる組み合わせかを大雑把に計算。~
Dispatcherは正確な衝突判定(衝突位置やめり込みの深さ等)を計算している。~
-btRigidBody~
Bulletでの剛体。~
物体の重量や座標、形状などを持っている~
-btCollisionShape~
当たり判定の形状データ。~
大きく分けて凸形状と凹形状がある。~
動く物体は凸形状の組み合わせで表現する必要がある。~
*メモ [#m83949b4]
**Worldの種類 [#i1e5b7da]
**btTransForm [#a019d198]
-basis
3*3行列
-origin
位置ベクトル
-rotation
クォータニオン
**CollisionShapeの種類 [#aa578cc8]
-移動可
プリミティブ形状~
btBoxShape, btSphereShape, btCapsuleShape,btCylinderShape,btConeShape~
凸形状~
btConvexHullShape~
(ポリゴンメッシュからの生成も可能。ただし頂点数には注意)~
複合体~
btCompoundShape~
(複数の凸形状を内包。凹型形状も再現可能)~
btGimpactTriangleMeshShape~
-移動不可
平面~
btStaticPlaneShape~
無限平面(半無限平面?)~
ハイトフィールド~
btHeightfieldTerrainShape~
メッシュ形状(不動。スケール変更可)~
btScaledBvhTriangleMeshShape~
メッシュ形状(不動)~
btBvhTriangleMeshShape~