一. 简单碰撞检测(一般针对粒子和球体对象)
1. 惩罚方案--基于弹力(胡克定律)
2. 冲量方案--基于动量守恒定理
二. 复杂碰撞检测--多边形网格相交测试
分为两个阶段:
1. 泛碰撞测试:将位于碰撞边界外部的对象各部分排除在外,剩余内容视为潜在碰撞集(PCS)。
1) 基于包围体(BV)如AABB、包围球进行测试。但这样得到的PCS内包含了大量的多边形,计算性能消耗大
2)采用包围体层次结构(BVH)。如下图,A和B两个网格对象均可以划分为两个子对象(类似于树)
然后,遍历两个BVH,并重复进行BV相交测试,最终得到潜在碰撞集PCS,如下图
2. 精细碰撞测试:在PCS内执行三角形-三角形测试。主要进行碰撞点和碰撞法线的计算。
如下图,计算三角形U和V的碰撞点和碰撞法线。(右图为结果)
1)碰撞点近似为相交的边pq的中点,因此首先计算点p和点q的位置信息。
点p可以通过三角形U的平面方程和V的两个点v1、v2计算,点q类似。
2)碰撞法线为三角形U和V的法线。
PS:进行三角形测试时,需要经过某些预测试和后处理操作。
比如,V的顶点全部位于U的半空间内,则无需进行上述计算过程。这就是预测试。
而当计算出p、q后,还要测试它们与U的位置关系,这是因为我们计算采用的平面是U所处的无限平面。这就是后处理。
碰撞检测后的数据传入碰撞处理模块,碰撞处理主要计算碰撞后对象的速度(线速度和角速度)