物理引擎的碰撞计算是物理引擎性能消耗的部分之一,物理引擎如何高效的做好物理碰撞计算与物理引擎内核如何标准的处理碰撞检测流程(pipeline),详细的步骤如下:
(1) BroadPhase 快速粗略碰撞检测。 通过这个步骤,快速的计算筛选出来可能产生碰撞的物理Entity碰撞对(Entity Collison Pair)。要实现这个设计目标我们可以从物体与场景入手,可以简化物体的形状来做碰撞检测,通过物理场景,快速的排除掉不可能发生碰撞的物体,从而替代简单的暴力搜索O(n^2)。每个物理Entity都有自己的包围盒,能包围住整个物理Entity的形状,当两个物理Entity的包围盒有重叠的时候,物理引擎会产生一个潜在可能的碰撞对,如图1.6-1
图1.6-1
找到这个碰撞对后,就会把物理碰撞对加入到物理世界的碰撞列表中,来进行下一步计算。
(2) NarrowPhase 精确的计算碰撞,生成碰信息。经过第一步的粗略计算,找出来了可能发生碰撞的物理Entity碰撞对。接下来就是要根据物理Shape形状与角度来精确的计算出来是否有真实的碰撞以及详细的碰撞点位置,表面法线信息等。注意不是所有的碰撞对都会产生碰撞,如上图1.6-1所示,BroadPhase阶段产生了碰撞,但是NarrowPhase阶段,却发现没有产生碰撞。
(3) Collision Respones阶段: 物理碰撞系统的最后一个阶段就是迭代计算出碰撞对每个物理Entity运动改变的影响。因为物理引擎中不允许两个物理Entity穿透。所以碰撞后就会改变物理Entity的运动状态。