上次说到了采用bucket sorting的方式进行空间的分割,然后在所在的局部区域中进行搜索。其中无论是全局的整体范围确定,还是局部的接触快速检测,都离不开包围盒子,也就是bounding box的概念,我们一般会用bounding box进行接触的初筛,然后再用精确的接触检测算法确定接触对,与接触发生的单元。一般来说在有限元接触分析中有3种包围盒子比较常见,分别是:
那么下面我就来分别介绍一下他们:
AABB(Axis-Aligned Bounding Box,轴对齐包围盒)
AABB是最简单的包围盒类型,其边与坐标轴平行,由物体在三维空间中的最小和最大坐标值(如 (x_min, y_min, z_min)
和 x_max, y_max, z_max
)定义。它通过投影到坐标轴快速判断物体间的空间关系。
遍历模型所有顶点,记录各轴方向的最大和最小值,构成包围盒的顶点。
通过判断两个AABB在各坐标轴上的投影是否重叠:若所有轴均重叠则碰撞,否则无碰撞。二维场景中只需检查X、Y轴投影,三维则增加Z轴。
此方法的优点就是他计算非常简单且高效,但是对于物体在空间中胡乱分布,方向各异的情况,会导致包围盒子过大,检测出很多其实并没有接触的地方,在一定程度上会降低在包围盒接触检测后续精确检测的效率(因为需要的精确检测相对会对一些)。这种由于其简单好用,我用的最多。
OBB是带有旋转的包围盒,参数包括中心点、长宽高和旋转角度。相比AABB,它能更紧密地贴合旋转后的物体形状。也就是他基本上是“跟着物体的方向”,更紧凑。
需计算物体的主方向(如通过协方差矩阵确定最优旋转角度),再沿主方向生成最小体积的包围盒。
采用分离轴定理(SAT),通过检查两OBB在所有可能分离轴上的投影是否重叠。需遍历15条潜在分离轴(三维场景)。
与上边的AABB对应其优点就是精度高,可以尽可能的在包围盒子检测这一个层级解决问题,但是他本身的计算量也不小,且更新起来计算也比较复杂,一般来说我不用这种,我宁愿用AABB然后把更细节的检测直接留给精确的接触检测算法,但是在CAD中用的还挺多。
k-DOPs通过k个固定方向的平面包围物体,形成凸多面体。例如6-DOPs即AABB,14-DOPs在AABB基础上增加对角线方向平面。
沿k个固定方向计算物体的极值点,生成紧凑的凸包。例如14-DOPs需计算14个方向的极值。
检查所有方向平面是否重叠。若所有方向均重叠则碰撞,否则无碰撞。可通过并行计算优化效率。
相对来说它等于是AABB和OBB中间的中庸者,在精度和效率上进行取舍,当想更精确检测的时候k就取大一点,当然这个时候计算复杂度也就高一些,但用户可以根据自己的需求自己调整。这种我用的也挺多。
个人来说比较倾向于用AABB与k-Dops,不过具体问题具体分析,朋友们可以根据自己的喜好自行选取,后续可以来一期直接上这三种代码的。