*はじめに [#m7e9958e] #contents 物理エンジン「Bullet」の利用方法についてのメモです *Bulletについて [#c7a1dd0a] **Bulletとは [#t0ff3cac] オープンソースの物理エンジンです。~ Zlibライセンス~ FKと同じ右手座標系を用いています。~ 公式HP - http://bulletphysics.org/wordpress/ 日本語マニュアル - http://bulletjpn.web.fc2.com **利用準備 [#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~