Bullet 2.76 Physics Japanese Manual
2010/11/24更新

Bullet 2.76 Physics SDK マニュアル

5. Bullet衝突判定


衝突判定

衝突判定モジュールではそのアルゴリズムと最近傍点(距離とめり込み)確認用の空間データ構造を、レイおよび凸面スイープテストと同様に提供します。主要データ構造は下記の通りです。

 

 

ブロードフェーズ衝突判定では、軸並行境界ボックス(AABB)の重なりによる高速な組み合わせ選定を行うための空間データ構造を提供します。下記のような空間データ構造が利用可能です。

 

 

このブロードフェーズ衝突判定では、ペアキャッシュに対して、重なっているオブジェクトの追加/削除を行います。利用者はこのペアキャッシュの種類を選択することができます。

衝突ディスパッチャは各ペアに対して、そのオブジェクトの種類によって衝突アルゴリズムを決定し、接点演算衝突アルゴリズムを実行します。

 


衝突形状

Bulletは様々な衝突形状をサポートしており、自身でも追加することが可能です。最適なパフォーマンスと品質を保つためには、各目的に沿った衝突形状を選択することが重要です。下図を見て、適切な形状を選択してください。

 

[図]

 

凸形状プリミティブ

ほとんどのプリミティブは、自身のローカル座標の中心を軸とした形状をしています。

 

btBoxShape: 長方形。各辺の長さの半分を指定して定義します。
btSphereShape: 球体。半径を指定して定義します。
btCapsuleShape: Y軸まわりのカプセル形状。btCapsuleShapeX/Zも利用できます。
btCylinderShape:Y軸まわりの円柱。btCylinderShapeX/Zも利用できます。
btConeShape: Y軸まわりの円錐。btConeShapeX/Zも利用できます。
btMultiSphereShape: 複数の球体で構成される凸構造体です。カプセル形状(2つの球体)や他の凸形状を生成する場合に使います。


複合形状

btCompoundShapeクラスでは、複数の凸形状を組み合わせて使うことができます。これは子形状と呼ばれる凸形状の部品からできている凹形状です。各子形状はローカル変換行列を持っており、btCompoundShapeに関連付けされています。

 

凸構造形状

Bulletは凸形状三角形メッシュを表現することが可能です。btConvexHullShapeを生成し、頂点配列を渡すのが最も簡単なやり方です。非常に多くの頂点を持つメッシュを直接 btConvexHullShapeとして使用する場合は、頂点数を減らすよう努力してください。

 

凹面三角形メッシュ

静的なワールド環境において、静的な三角形メッシュを表現する場合は、btBvhTriangleMeshShape を使ってください。この衝突形状はbtTriangleMeshもしくはbtStridingMeshInterfaceにより、内部に空間データ構造を構築します。実行時にツリーを構築する代わりに、バイナリツリーをシリアライズしてディスクに保存することも可能です。btOptimizedBvhツリー空間データ構造を保存/読み込みする方法については、Demos/ConcaveDemoをご覧ください。同じ三角形メッシュに対して大きさが異なる複数のインスタンスを使用する場合は、btScaledBvhTrianglMeshShapdeを使って複数回btBvhTriangleMeshShapeインスタンスを生成してください。


凸形状分解

理想を言えば、凸形状メッシュは静的な物体だけに使用すべきです。もしくは、メッシュをbtConvexHullShapeに渡して凸構造を使用すべきです。もし単一の凸形状で十分な精度を確保できない場合は、複数の凸形状を集めてbtCompoundShapeとして使用できます。凸形状分解機能により、凹メッシュをいくつかの凸形状に分解することができます。凸形状へ自動分解する方法については、Demos/ConvexDecompositionDemoをご覧ください。


高さフィールド

Bulletは特殊な2Dの凹面地形をサポートしています。これはbtHeightfieldTerrainShapeを使います。
この使い方については Demos/TerrainDemoをご覧ください。

 

btStaticPlaneShape

名前の示す通り、btStaticPlaneShapeは無限平面もしくは半空間を表します。この形状は動かすことができません。この形状は主にデモに使われます。


衝突形状のスケーリング

衝突形状はローカルスケーリングが可能です。btCollisionShapde::setScaling(vector3)を使用してください。各軸が均一ではないスケーリングは、btBoxShape、btMultiSphereShape、btConvexShape、btTriangleMeshShapeで可能です。すべての軸に同じ値を適用する均一スケーリングは、btSphereShapeで可能です。均一ではないスケーリングが適用された球体は、btMultiSphereShapeを使って、1つの球体で作成可能です。後述の通り、btScaledBvhTraiangleMeshShape は各軸に対して異なるスケール値を指定してインスタンス化することが可能です。btUniformScalingShapeは凸形状を異なるスケール値でインスタンス化することができるため、メモリを節約することができます。


衝突マージン

Bulletは小さな衝突マージンを衝突形状に適用し、衝突判定のパフォーマンスと信頼性を向上させています。このデフォルト衝突マージンは変更すべきではありませんし、もし変更するとしても正の値を使用してください。ゼロマージンは問題があります。デフォルトではこの衝突マージンは0.04に設定されており、単位がメートルの場合、4センチメートルに相当します(推奨)。

 

衝突形状によっては、このマージンは異なる意味を持ちます。一般的には衝突マージンはオブジェクトが拡大されたようになります。これは小さな隙間を作り出すことになります。これを補うために、いくつかの形状では実際のサイズからマージンを引いています。例えば、btBoxShapeは1辺の半分の長さから衝突マージンを引いています。btSphereShapeでは、半径全体が衝突マージンとなるため、隙間は発生しません。球体の衝突マージンをオーバーライドしないようにしてください。凸構造、円柱、円錐は、オブジェクトを拡大するために衝突マージンを加算しており、グラフィックメッシュと衝突サイズを一致させている限り、隙間が発生します。凸構造オブジェクトは、オブジェクトを縮小することによりマージンによる隙間を除去するメソッドが提供されています。
高度な使用方法についてはDemos/BspDemoをご覧ください。


衝突マトリックス

各形状のペアによって、Bulletはディスパッチャを使ってそれに見合った衝突アルゴリズムを適用します。デフォルトで適用されるアルゴリズムマトリックスは以下の通りです。凸形状は凸多面体、円柱、円錐、カプセル、その他GJK互換のプリミティブで表現されていることに注意してください。GJKはGilbert, Johnson, Keerthiの略であり、凸形状の距離を計算するアルゴリズムです。EPAと組み合わせることにより、めり込みの深さを計算することができます。EPAはExpanding Polythope Algorithmの略で、Gino van den Bergenにより考案されました。BulletはGJKとEPAを独自に実装しています。

 

[図]


独自の衝突形状とアルゴリズムの登録

ユーザーはbtDispatcher::registerCollisionAlgorithmを使って、独自の衝突判定アルゴリズムを登録してこの衝突マトリックスを上書きすることができます。球体と球体の衝突判定アルゴリズムを登録した例がDemos/UserCollisionAlgorithmにありますので、ご覧ください。

inserted by FC2 system