連続的衝突判定 (CCD)
概要
連続的衝突判定(Continuous Collision Detection:CCD)によって、高速な物理エンティティが他の物理コライダーに衝突せずに通り抜けてしまう現象を防ぐことができます。
CCDアルゴリズムには「推測ベース(Speculative)」と「スイープベース(Sweep Based)」の2つの一般的アプローチがあります。Quantumはパフォーマンスを考慮して、ステートレスな物理エンジンに「推測ベースの連続的衝突判定」を実装しています。推測ベースのCCDアプローチは、角運動の並列処理に適していて、パフォーマンスに優れ、多くのゲームプレイに不可欠です。
推測ベースのCCDアルゴリズムは、エンティティのPhysicsBodyコンポーネントのVelocityとAngularVelocityに基づいて、ブロードフェーズ中に使用される最小バウンディングボックスを増加させます。これが「推測」と呼ばれるのは、エンティティがそのエリア内で他の物理オブジェクトと衝突する可能性を推測して、これらすべての候補をソルバーに渡すためです。この推測によって、すべての接触制約条件が考慮され、衝突解決時に通り抜けを防ぎます。
セットアップ
CCDを設定するには、2つの簡単なステップが必要です。どちらも編集時/実行時の両方で実行できます。
注意: CCDがシミュレーションに与えるパフォーマンスへの影響を考慮し、機能はグローバルではなくエンティティ単位で有効化されます!
編集時
ステップ1:Simulation ConfigアセットのPhysicsセクションのAllow CCDをチェックします。
ステップ2:エンティティプロトタイプのPhysicsBodyコンポーネントのConfigでUse Continuous Collision Detectedフラグを有効にします。
実行時
特定の状況やゲームの一瞬だけCCDが必要な場合、CCDやそれを使用するエンティティのオン/オフを動的に切り替えることができます。
ステップ1:現在のゲームステートのPhysicsSceneSettingsでAllowCCDプロパティを切り替えます。これはフレームの一部で、SimulationConigアセットの値で初期化されます。 重要: 実行時にSimulationConfigアセットは変更しないでください。これは非決定論的であり、同期ズレを引き起こします!
C#
frame.PhysicsSceneSettings->CCDSettings.AllowCCD = true;
ステップ2:CCDを使用したエンティティのPhysicsBodyコンポーネントのUseContinuousCollisionDetectionプロパティを切り替えます。
C#
var physicsBody = f.Unsafe.GetPointer<PhysicsBody3D>(myEntityRef);
physicsBody->UseContinuousCollisionDetection = true;
Config
SimulationConfigアセットは、物理エンジンを初期化するためのデフォルト値を保持していて、そこにCCD関連の要素も含まれます。Continuous Collision Detection (CCD)セクションのデフォルト値は、ほとんどのゲームで最適であり、エッジケースが発生した場合のみ注意深く調整してください。
AllowCCD:PhysicsBodyのConfigフラグでCCDを有効にしている場合、CCDの実行を許可します。CCDLinearVelocityThreshold:CCDが許可されている場合、CCDが有効かつ速度がこのしきい値より大きいすべてのPhysicsBodyでCCDが実行されます。CCDAngularVelocityThreshold:CCDが許可されている場合、CCDが有効かつ角速度がこのしきい値より大きいすべてのPhysicsBodyでCCDが実行されます。CCDDistanceTolerance:CCDが有効なPhysicsBodyが接触しているとみなされる距離の絶対値です。MaxTimeOfImpactIterations:2つのPhysicsBody間の衝突時間を計算する際に、CCDアルゴリズムを実行する最大反復回数です。MaxRootFindingIterations:特定軸における2つのPhysicsBody間の距離が許容範囲未満になる時間を計算する際に、実行される最大反復回数です。
既知の制限
推測ベースのCCDの機能は完成していますが、このアプローチの既知の制限には注意が必要です。
現在のアルゴリズムは、通常の物理衝突判定と並行して単一のCCD反復を実行します。言い換えると、CCDの衝突が検知され解決された後、エンティティの残りのデルタ時間がCCDに関係なく計算されます。そのため、非常に高速で移動するエンティティが密集している環境では、通り抜けが発生する可能性があります。
Back to top