本节为Rigidbody的附加章节,主要是说明刚体连续的碰撞的第四种模式——Continuous Speculative模式,书上已经很多资料都没有过多描述这一个模式的,所以我特意总结了一番!
Continuous Speculative: 使用推测式连续碰撞检测,这是唯一的CDD模式,CDD模式能够确保快速的移动
的物体与物体进行碰撞,而不是穿过这样物体,Unity提供了两种CCD方法。
1.基于扫频的CCD
基于扫描的CCD使用时间影响(TOI)算法来计算潜在的碰撞,碰撞通过使用当前速度扫描其前向轨迹,查看对象
如果沿对象的移动方向存在接触,则算法计算影响的时间并将对象移动到该时间。
该算法可以执行从那时起的子步骤,在TOI之后计算速度然后重新扫描,代价是更多的CPU周期。
但是,由于此方法依赖于线性扫描,因此忽略了物体的角运动,当物体以高速旋转时,这会导致隧道效应。
例如,弹球机中的鳍状板固定在一端并绕固定点旋转。鳍状肢仅具有角运动而没有线性运动。
因此,很容易错过与弹球的碰撞:此方法的另一个问题是性能,如果你有大量的高速物体与CCD非常接近
由于额外的扫描,物理引擎中必须执行更多CCD子步骤,CCD开销会迅速增加。
2.投机的CCD
推测CCD的工作原理是根据物体的线性和角度运动增加物体的宽相轴对齐最小边界框(AABB)。该算法是推测性的
因为它在下一个物理步骤中选择所有潜在的接触,然后将所有接触点馈送到求解器中,这确保满足所有接触约束
以便对象不会穿过任何碰撞。下图显示了如果在路径中没有墙,则从t0移动的球体如何在t1处具有预期位置
通过用其目标姿势使AABB膨胀,推测算法获得具有n1和n2法线的两个接触。然后算法告诉求解器存储那些接触,
这样球体就不会穿过墙壁。
基于当前速度的充气AABB有助于检测沿着移动轨迹的所有潜在接触,这使得求解器能够防止隧穿,
推测CCD通常比基于扫描的方法更加节省性能,因为接触仅在碰撞检测阶段期间计算
而不是在求解和碰撞阶段期间计算,此外,由于推测CCD基于物体的线性和角度运动扩展了AABB
因此它找到了基于扫描的CCD可能遗漏的触点
但是,推测性CCD可能会导致重影碰撞,其中物体的运动受到投机接触点的影响。这是因为推测CCD基于最近点算法
收集所有潜在接触,因此接触法线不太准确。这通常可以使高速物体沿细分的碰撞特征滑动并跳起,
即使它们不应该,例如,在下图中,球体从t0开始并向右水平移动,在连续碰撞后t1处的预测位置
膨胀的AABB与方框b0和b1重叠,CCD在c0和c1处产生两个推测接触。因为推测CCD使用最近点算法生成接触,
所以c0具有非常倾斜的法线,这似乎是求解器的斜坡
这种非常倾斜的法线会导致t1在连续碰撞后向上跳跃,而不是直接向前移动
推测CCD也可能导致隧穿,因为仅在碰撞检测阶段计算推测接触。在接触求解期间,
如果一个物体从求解器获得太多能量,它可能在积分后最终在初始膨胀的AABB之外。
如果在AABB外面存在碰撞,则该对象将通过隧道。
例如,下图显示了一个球体在顺时针旋转时从t0向左移动。如果球体从撞击中获得太多能量,
,它可能最终在t1处退出膨胀的AABB(红色虚线矩形)。如果在AABB外面发生碰撞,如下面的蓝框所示,
球体可能最终通过它进行隧道掘进。这是因为求解器仅计算充气AABB内的触点,
并且在求解和积分阶段不执行碰撞检测。
以上就是对Continuous Speculative模式的全部描述,如有不当之处欢迎评论指出!