Bullet 2.76 Physics SDK マニュアル
14. ヒント
非常に小さな、また非常に大きな衝突形状は使わないようにしてください
最小の動的オブジェクトのサイズは、0.1単位ほどとしてください。デフォルトの重力は9.8であり、単位はメートルです。従って、10センチメートル以下のオブジェクトは作らないでください。動的オブジェクトの最大サイズは、5単位(5メートル)ほどを推奨します。
各オブジェクトの質量の差が大きくならないようにしてください
非常に重いオブジェクトが非常に軽いオブジェクトの上に乗ると、シミュレーションの挙動が非常に不安定になります。質量は1ぐらいが推奨されます。戦車と非常に軽い物体との間で精密なシミュレーションをすること自体、現実的ではありません。
複数の静的な三角形メッシュを1つにまとめましょう
たくさんの小さな btBvhTriangleMeshShapeはブロードフェーズ衝突判定の処理がうまく働きません。これらは1つにまとめるようにしてください。
デフォルトの内部固定タイムステップを使ってください
Bulletは内部固定タイムステップである 60Hz(1/60秒)に最適化されています。
シミュレーションを安全かつ安定させるために、Bulletは自動的にタイムステップを固定シミュレーションサブステップに分割します。このサブステップ数の最大値は、stepSimulationの2番目の引数で指定します。タイムステップが内部サブステップよりも小さい場合、Bulletは動作を補間します。
サブステップの最大数(stepSimulationの第2引数)をゼロとすることで、この機能を無効化することができます。内部タイムステップとサブステップを無効にすると、実際のタイムステップでシミュレーションが行われます。これは推奨されません。
btConeTwistConstraintによるダミー人形
ダミー人形は btHingeConstraintもしくはbtConeTwistLimit、またはその両方を使って、膝やひじ、腕を組み立てるといいでしょう。
衝突マージンをゼロにしないでください
衝突判定処理には、パフォーマンスおよび安定性向上のため、ある程度のマージンが必要です。このギャップが目立つようであれば、グラフィック描画側で調整してください。
凸形状メッシュの頂点数は100以下にしてください
パフォーマンスの観点からも、btConvexHullShape の頂点数は100以下にしてください。頂点数が多いと、不安定な挙動の原因となります。btShapeHullユーティリティを使って、凸形状を簡略化してください。
三角形メッシュに巨大な三角形もしくは縮退三角形を持たせないでください
三角形の大きさを、10単位/メートル以下ぐらいにしておいてください。各辺の比率差が大きい、または面積ゼロの縮退三角形は避けてください。
高度なトピック
三角形の摩擦/反発係数
デフォルトでは、摩擦係数は剛体のみに働きます。より細かく、形状ごと、三角形ごとに摩擦を働かせることも可能です。Demos/ConcaveDemoをご覧ください。このデモでは三角形ごとに摩擦係数を設定しています。やり方としては、CF_CUSTOM_MATERIAL_CALLBACKを剛体の衝突フラグに設定し、グローバルマテリアルコールバックに登録します。メッシュの各三角形を識別するために、triangleIdとpartIdをマテリアルコールバックに渡します。これはStridingMeshInterfaceのtraiangleId/partIdと一致します。
簡単な方法としては、btMultimaterialTriangleMeshShapeを使うやり方があります。この使い方はDemos/MultiMaterialDemoをご覧ください。
カスタム拘束条件ソルバ
BulletはデフォルトでbtSequentialImpulseConstraintSolverを使います。他のものを使いたい場合は、btDynamicsWorldのコンストラクタにその拘束条件ソルバを渡してください。Extras/quickstepを使えば、ODEのソルバと比べることもできます。
カスタム摩擦モデル
特定のオブジェクトタイプに対して独自の摩擦モデルを適用したい場合、拘束条件ソルバに摩擦関数を登録することができます。この機能はキャッシュしやすい拘束条件ソルバの設定と互換性がありません。
Demos/CcdPhysicsDemo.cppの#define USER_DEFINED_FRICTION_MODELをご覧ください。