推测式 碰撞当物理引擎检测到两个游戏对象的碰撞体接触或重叠时,就会发生碰撞,前提是至少其中一个游戏对象具有刚体组件并且正在运动。 更多信息
参见 术语表 检测是 **连续推测** 模式下的 CCD 算法。
推测式 碰撞检测由 Unity 自动执行的过程,用于确定具有刚体和碰撞体组件的移动游戏对象是否与其他任何碰撞体接触。 更多信息
参见 术语表 的计算量比 基于扫描的碰撞检测 少。它也适用于由于线性运动(例如,球体沿直线运动)和旋转运动(例如,弹球弹簧在枢轴上旋转时与球体碰撞)而发生的碰撞。
但是,**连续推测** 也可能不太准确;除了漏掉碰撞之外,还会发生“假碰撞”,即算法错误地预测碰撞并迫使 碰撞体用于处理对象物理碰撞的不可见形状。碰撞体不需要与对象的网格完全相同的形状 - 粗略的近似通常更有效,并且在游戏玩法中难以区分。 更多信息
参见 术语表 偏离路线。
推测式 CCD 通过根据对象线性和角运动来增加对象的广相轴对齐最小包围盒 (AABB) 来工作。该算法是推测性的,因为它在下一个物理步骤期间选择所有潜在接触并将其馈送到求解器,求解器确保所有接触约束得到满足,从而使 刚体允许游戏对象受到模拟重力和其它力的影响的组件。 更多信息
参见 术语表 不会穿透任何碰撞。
基于当前速度的膨胀 AABB 有助于检测沿移动轨迹的所有潜在接触,这使求解器能够防止漏掉碰撞(“穿透”)。
推测式 CCD 通常比基于扫描的 CCD 资源密集程度低,因为它只在碰撞检测阶段计算,而不在求解和积分阶段计算。此外,推测式 CCD 可以找到基于扫描的 CCD 可能漏掉的接触,因为推测式 CCD 根据对象的线性和角运动扩展广相 AABB。
但是,推测式 CCD 会导致假碰撞(或“幽灵碰撞”),即对象的运动会受到推测接触点的影响,而实际上不应该受到影响。这是因为推测式 CCD 使用最近点算法收集所有潜在接触,因此接触法线不太准确。这通常会导致高速物体沿网格化的碰撞特征滑动和跳跃,即使它们不应该这样做。例如,在下图中,球体从 **t0** 开始,水平向右运动,在积分后预测位置为 **t1**。膨胀的 AABB 与盒子 **b0** 和 **b1** 重叠,CCD 在 **c0** 和 **c1** 处产生了两个推测接触。由于推测式 CCD 使用最近点算法生成接触,因此 **c0** 具有一个非常倾斜的法线,求解器将其视为斜坡。
这种倾斜的法线导致 **t1** 在积分后向上跳跃,而不是笔直向前移动。
推测式 CCD 还会导致漏掉碰撞,因为推测接触只在碰撞检测阶段计算。在接触求解期间,如果对象从求解器获得过多的能量,它可能会在积分后最终位于初始膨胀的 AABB 之外。如果 AABB 外部有碰撞,则对象会直接穿透。
例如,在下图中,球体从 **t0** 向左移动,而棍子顺时针旋转。如果球体从冲击中获得过多的能量,它可能会最终退出膨胀的 AABB(红色虚线矩形)并到达 **t1**。如果 AABB 外部有碰撞,如蓝色框所示,则球体可能会最终错过碰撞并直接穿透它。这是因为求解器只计算膨胀的 AABB 内部的接触,并且在求解和积分阶段不执行碰撞检测。