連続衝突検知(CCD)
概要
Continous Collision Detection(連続衝突検出)は、高速で移動する物理エンティティが、他の物理コリダーを通過するのではなく、衝突させるために使用されます。
CCDアルゴリズムには、_speculative_とsweep basedという2つの一般的なアプローチがあります。Quantumでは、ステートレス物理エンジンに関連するパフォーマンスを考慮して、投機的な連続衝突検出を実装しています。投機的なCCDアプローチは、並列処理に適していると同時に、角度のある動きをうまく扱うことができます。前者はパフォーマンスのために必要であり、後者は多くのゲームプレイのシナリオで必要です。
投機的CCDアルゴリズムでは、PhysicsBodyコンポーネントの直線的なVelocity
とAngularVelocity
に基づいて、エンティティのブロードフェーズで使用される最小バウンディングボックスを増加させます。これが_speculative_と呼ばれるのは、エンティティがその領域にある他の物理オブジェクトのどれかと衝突する可能性を「推測」し、これらの候補をすべてソルバーに供給するからです。この推測により、衝突を解決する際にすべての接触の制約が考慮され、トンネリングを防ぐことができます。
設定
CCDの設定には2つの簡単なステップが必要です。どちらも編集時、またはランタイムに行うことができます。
注意: CCDがシミュレーションに与えるパフォーマンスへの影響を考慮して、CCD機能はエンティティごとに有効であり、グローバルには有効ではありません。
Edit-Time
ステップ1: Simulation Config
アセットのPhysics
セクションで、Allow CCD
ブーリアンをチェックします。
ステップ 2: Entity Prototype$ の PhysicsBody
コンポーネントにある Config
で、Use Continuous Collision Detected
フラグを有効にします。
ランタイム
ゲーム中の特定の状況や瞬間にのみCCDが必要な場合、CCDとそれを使用するエンティティを動的にオン/オフすることができます。
ステップ1:現在のゲームステートのPhysicsSceneSettings
でAllowCCD
プロパティをトグルします。PhysicsSceneSettings
はフレームの一部で、SimulationConfig
アセットにあるPhysicsの値で初期化されます。__重要:__ランタイムに SimulationConfig
アセットを変更してはいけません。これは不確定であり、非同期になります。
C#
frame.PhysicsSceneSettings->CCDSettings.AllowCCD = true;
ステップ 2: CCDを使用するエンティティのPhysicsBody
コンポーネントのUseContinuousCollisionDetection
プロパティをトグルします。
C#
var physicsBody = f.Get<PhysicsBody3D>(myEntityRef);
physicsBody.UseContinuousCollisionDetection = true;
コンフィグ
SimulationConfig
アセットには物理エンジンを初期化するためのデフォルト値が入っており、CCDに関連する部分も含まれています。Contininuous Collision Detection (CCD)
セクションにあるデフォルト値は、ほとんどのゲームに最適で、特殊なケースが発生した場合にのみ、注意して調整する必要があります。
AllowCCD
: 物理ボディのコンフィグフラグでCCDが有効になっている場合、CCDの実行を許可します。CCDLinearVelocityThreshold
: CCDが許可されている場合、CCDが有効になっていて、このしきい値以上のリニアベロシティの大きさを持つすべての物理ボディに対して実行されます。CCDAngularVelocityThreshold
: CCDが許可されている場合、それが有効になっていて、このしきい値以上の角速度の大きさを持っている全ての物理ボディに対して実行されます。CCDDistanceTolerance
: CCDチェックの対象となるPhysics Bodiesが接触していると考えられる絶対的な距離値。MaxTimeOfImpactIterations
:2つの物理ボディ間の衝突時間を計算する際にCCDアルゴリズムが実行する反復の最大数。MaxRootFindingIterations
: 与えられた分離軸における2つの物理ボディ間の距離が許容値以下になる時点を計算する際に実行される最大の反復回数。
既知の制限事項
speculative CCDは機能的には完成されているが、投機的アプローチの既知の限界に注意する必要がある。
現在のアルゴリズムでは、通常の物理学的な衝突解決と並行して、1回のCCDの反復を行っています。つまり、CCDの衝突が検出されて解決された後、そのエンティティの残りのデルタタイムはCCDに関係なく統合されます。そのため、非常に高速で移動するエンティティが存在する高密度な環境では、トンネル現象が発生する可能性があります。
Back to top