推测性碰撞检测是适用于连续推测 (Continuous Speculative) 模式的 CCD 算法。
推测性碰撞检测的计算要求比基于扫掠的碰撞检测更低。它还适用于因线性运动(例如,球沿直线移动)和旋转运动(例如,弹球机上的弹球杆绕轴心旋转时与球碰撞)而发生的碰撞。
但是,连续推测也可能会不太准确;除了缺失碰撞之外,还可能发生“虚假碰撞”,即算法错误地预测碰撞并迫使碰撞体偏离轨迹。
推测性 CCD 的工作原理是基于对象的线性运动和角运动增大一个对象的粗筛阶段轴对齐最小包围盒 (AABB)。该算法是一种推测性的算法,因为会选取下一物理步骤中的所有潜在触点,然后将它们送入解算器,求解器会确保所有的接触约束都得到满足,从而使刚体不会穿过任何碰撞体。
基于当前速度并扩大的 AABB 有助于检测沿运动轨迹的所有潜在触点,使解算器能够防止发生缺失碰撞(“穿隧”)。
推测性 CCD 占用的资源通常少于基于扫掠的 CCD,因为它只在碰撞检测阶段(而不在求解和积分阶段)进行计算。此外,由于推测性 CCD 根据对象的线性运动和角运动来扩展粗筛阶段 AABB,因此它能发现基于扫掠的 CCD 可能遗漏的触点。
但是,推测性 CCD 可能会导致虚假碰撞(或称“幽灵碰撞”);在这种碰撞中,对象的运动受到推测性触点的影响,而这是不应发生的。这是因为推测性 CCD 根据最近点算法收集所有潜在触点,所以触点法线不太准确。这通常会使高速对象沿着细分的碰撞特征滑动并跳起来,即使本不应发生这种情况。例如,下图中的球体从 t0 开始向右水平移动,积分后的预测位置为 t1。扩大后的 AABB 与框形 b0 和 b1 重叠,而 CCD 在 c0 和 c1 产生两个推测性触点。由于推测性 CCD 使用最近点算法来生成触点,c0 具有非常倾斜的法线,因此解算器会将其认定为斜坡。
这种倾斜的法线导致 t1 在积分后向上跳动,而不是笔直向前移动:
。
推测性 CCD 还可能导致发生缺失碰撞,因为只会在碰撞检测阶段计算推测性触点。在触点求解过程中,如果一个对象从解算器获得太多能量,在积分后,其最终位置可能会在初始扩大的 AABB 之外。如果在紧邻 AABB 的外部发生碰撞,对象会从右边穿出。
例如,下图中的球体从 t0 向左移动,而球杆顺时针旋转。如果球体从撞击中获得太多能量,最终可能离开扩大的 AABB(红点矩形),落在 t1 处。如果在紧邻 AABB 的外部发生碰撞(如下面的蓝色框所示),球体最终可能会缺失碰撞并从右边穿出。这是因为解算器只计算扩大的 AABB 的内部触点,在求解和积分阶段不会执行碰撞检测。