【实时碰撞检测算法Summary】凸包检测和AABB解释
凸包可视为碰撞集合体的早小包围体。这里介绍两种算法
1.Andrew算法
对于一个点集,首先选择点集中最靠左的两个点,产生当前凸包的第一条边。然后开始向右扩展,(分上下两条路向右扩展,这里先只介绍上半部分)
如果考察的下一个顶点位于边集当前边的右侧,则该点暂定为凸包上的顶点,并加入到边集中,如果下一个点位于当前边的左侧,则该店位于凸包的外部,并处于错误状态,此时剔除边集中的最后一个顶点,并开始下一个顶点,直到出现位于边集中当前边右侧的顶点。
2.Quickhull算法
Andrew算法在2D空间内工作良好,但是在3D空间内并不适用。
快包算法是先获取顶点集的包围和,一般情况下可以确定4个端点,分别位于包围盒的四条边上。作为断点,上述4个点位于凸包并构成了首次逼近。进一步考察在当前凸包外部的顶点,对于现在获得的四边形,计算边外部距离最远的顶点(如果存在),则此点必定是凸包上的顶点,那么此时边的两个顶点和这一个新的顶点构成了一个三角形。然后形成一个新的凸包,如此迭代下去,直到所有的顶点都在凸包内。
包围体被称为BV
BV期望特征
低耗费的相交测试
实现紧密拟合
计算耗费较少
易于旋转和变换
内存占用较少
包围体的常用类型如下:
其中 轴对齐AABB比较常用
我们在做两个物体的相交测试的时候,可以把两个物体都变换到世界空间坐标。或者把其中一个变换到另一个物体的局部空间坐标。(这其中大有不同,)
如上图 b图和c图的判断结果一个是相交 一个是不相交
AABB的构造除了暴力遍历顶点取最大最小之外,还可以用爬山法,从当前顶点移动常数个顶点,得到最大/最小范围。
不过需要数据的预处理如下图所示
对于AABB旋转之后,物体的BV通常需要重新计算,最简单的方法是利用一个新的AABB包围旋转后的AABB。
通常计算旋转后的AABB,只需要计算旋转之前的顶点在世界坐标轴上的投影间隔范围 经过 矩阵M变换后的范围。
范围计算方法和解释如下: