Continuous Collision Detection (CCD)
概述
持續碰撞偵測是用於快速移動的物理實體碰撞其他物理碰撞器,而非穿透它們。
針對CCD演算法,有兩個常見的方法,推測式 及 基於掃掠。Quantum執行一個 推測式持續碰撞偵測,這是因為其無狀態物理引擎的效能考量。推測式CCD方法更適合平行,同時也能很好地處理角運動;前者是效能所需,後者是許多遊戲遊玩案例所必需。
推測式CCD演算法根據實體的PhyiscsBody
元件線性Velocity
及AngularVelocity
,增加實體在廣階段使用的最小周框方塊。其稱為 推測式,因為它「推測」實體可能碰撞該區域中任何其他物理物件,並且饋送所有這些候選者到求解。這個推測確保在解決碰撞時考量所有聯絡限制條件,因此防止穿透。
設定
設定CCD時需要兩個簡單的步驟;兩者都可以在編輯階段和/或運行階段完成。
請注意: 考量到CCD對模擬的效能影響,CCD功能基於 實體 而 非全域 來被啟用!
編輯階段
第1步:勾選Simulation Config
資產的Physics
節中的Allow CCD
布林值。
第2步:在實體原型$的PhysicsBody
元件上的Config
中啟用Use Continuous Collision Detected
旗標。
運行階段
如果只有在遊戲的特定情況或時刻需要CCD,則可以動態地切換CCD及使用它的實體的開與關。
第1步:在目前的遊戲狀態的PhysicsSceneSettings
中切換AllowCCD
屬性。PhysicsSceneSettings
是幀的一部分,並且以SimulationConfig
資產中的物理值來初始化。重要事項: 請 勿 在運行階段修改SimulationConfig
資產,這是非確定性並且將導致取消同步!
C#
frame.PhysicsSceneSettings->CCDSettings.AllowCCD = true;
第2步:針對應該使用CCD的實體,在PhysicsBody
元件上切換UseContinuousCollisionDetection
屬性。
C#
var physicsBody = f.Get<PhysicsBody3D>(myEntityRef);
physicsBody.UseContinuousCollisionDetection = true;
設定
SimulationConfig
資產持有針對初始化物理引擎的預設值;包含與CCD相關的方面。在Continuous Collision Detection (CCD)
節中的預設值對於大多數遊戲而言都是最佳的,只有在出現邊緣案例時才應小心調整。
AllowCCD
:允許CCD被執行,前提是物理主體在其設定旗標上有已啟用的CCD。CCDLinearVelocityThreshold
:如果CCD被允許,它將在所有啟用它並且線性速度範圍高於此閾值的物理主體上被執行。CCDAngularVelocityThreshold
:如果CCD被允許,它將在所有啟用它並且角速度範圍高於此閾值的物理主體上被執行。CCDDistanceTolerance
:絕對距離值,低於該值時,接受CCD檢查的物理主體可視為接觸。MaxTimeOfImpactIterations
:計算兩個物理主體之間的影響時間時,CCD演算法執行的最大迭代數量。MaxRootFindingIterations
:當一個給定分離軸中的兩個物理主體之間的距離低於容許範圍時,當計算時間點時執行的最大迭代數量。
已知限制
雖然 推測式CCD 是完整的功能,仍然需要注意推測式方法的已知限制。
目前的演算法在常規物理碰撞解決方法上運行一個單一CCD迭代。換句話說,在偵測到並且解決一個CCD碰撞之後,針對該實體的剩餘差量時間被整合,無論CCD為何。因此在具有極快移動速度實體的高密度環境中,有可能發生穿透。
Back to top