Continuous Collision Detection (CCD)
概述
連續碰撞檢測用於快速移動的物理實體與其他物理碰撞體碰撞,而非穿隧穿過它們。
CCD 演算法有兩種常見方法:「推測式」和「基於掃描式」。Quantum 實現了「推測式連續碰撞檢測」,這是因為其無狀態物理引擎與性能考量相關。推測式 CCD 方法更適合並行處理,同時能很好地處理角運動;前者是性能所需,後者在許多遊戲場景中必不可少。
推測式 CCD 演算法會根據實體的 PhysicsBody
元件的線性 Velocity
(速度)和 AngularVelocity
(角速度),增大在廣階段中使用的最小邊界框。它被稱為「推測式」,是因為它會「推測」該實體可能與該區域內的任何其他物理物件發生碰撞,並將所有這些候選物件送入求解器。這種推測確保在解算碰撞時考慮到所有接觸約束,從而防止隧穿。
設置
設置 CCD 需要兩個簡單步驟,這兩個步驟都可以在編輯時和 / 或運行時完成。
注意: 考慮到 CCD 對模擬的性能影響,CCD 功能是基於「每個實體」啟用的,而「不是全域」啟用的!
編輯時
步驟 1:在 Simulation Config
資產的 Physics
部分勾選 Allow CCD
布林值。

步驟 2:在實體原型的PhysicsBody
元件上的Config
中啟用Use Continuous Collision Detected
標誌。

運行時
如果 CCD 只在遊戲的特定情況或時刻需要,可以動態開啟和關閉 CCD 及使用它的實體。
步驟 1:切換當前遊戲狀態的 PhysicsSceneSettings
中的 AllowCCD
屬性,該屬性是幀的一部分,並使用 SimulationConfig 資產中的物理值初始化。重要提示: 不 要在運行時修改SimulationConfig
資產,這是不確定的,會導致不同步!
C#
frame.PhysicsSceneSettings->CCDSettings.AllowCCD = true;
步驟 2:在應該使用 CCD 的實體的PhysicsBody
元件上切換UseContinuousCollisionDetection
屬性。
C#
var physicsBody = f.Unsafe.GetPointer<PhysicsBody3D>(myEntityRef);
physicsBody->UseContinuousCollisionDetection = true;
配置
SimulationConfig
資產包含初始化物理引擎的默認值,包括與 CCD 相關的方面。在「Continuous Collision Detection (CCD)
」部分中的默認值對大多數遊戲來說都是最佳的,只有在出現邊緣情況時才應謹慎調整。
AllowCCD
:如果物理體在其配置標誌上啟用了 CCD,則允許執行 CCD。CCDLinearVelocityThreshold
:如果允許 CCD,它將在所有啟用了 CCD 且線速度大小高於此閾值的物理體上執行。CCDAngularVelocityThreshold
:如果允許 CCD,它將在所有啟用了 CCD 且角速度大小高於此閾值的物理體上執行。CCDDistanceTolerance
:在 CCD 檢查下,物理體之間的絕對距離值低於此值時,可以認為它們處於接觸狀態。MaxTimeOfImpactIterations
:CCD 演算法在計算兩個物理體之間的碰撞時間時執行的最大迭代次數。MaxRootFindingIterations
:在計算給定分離軸上兩個物理體之間的距離低於容差的時間點時執行的最大迭代次數。
已知限制
儘管「推測式 CCD」功能完備,但人們需要了解推測式方法的已知限制。
當前的演算法會與常規物理碰撞解析一起運行單個 CCD 迭代。換句話說,在檢測並解析 CCD 碰撞後,該實體的剩餘增量時間會被積分,而不管 CCD 如何。因此,在高度密集的環境中,對於極快移動的實體,有可能發生隧穿現象。
Back to top