第一次看到这个AABB很是纠结,不懂这个是什么意思。后来知道这个是axis aligned bounding box的缩写,中文意思就是按坐标轴排列的包围盒。
wiki百科是有这么一段解释的:
包围体:
在计算机图形学与计算几何领域,一组物体的包围体就是将物体组合完全包容起来的一个封闭空间。将复杂物体封装在简单的包围体中,就可以提高几何运算的效率。通常简单的物体比较容易检查相互之间的重叠。
一组物体的包围体也是包含一个物体及周围相关环境的封闭空间,因此可以用它来表示一个非空、有限的单一物体。
包围体的使用
包围体经常用于加速一些特定的检验过程。
在光线跟踪中,包围体用于光线相交检验,在许多渲染算法中,它又用于视体的检验。如果光线或者视体与包围体没有交叉,那么就不会与包围体内的物体相交。通过这样的相交检验,就可以生成需要显示的物体列表。这里的显示表示需要渲染或者栅格化。
在碰撞检测中,如果两个包围体没有相交,那么所包含的物体也就不会碰撞。
由于包围体的几何形状较为简单,而物体通常是多边形或者简化为多边形近似的数据结构所组成,所以对于包围体的检验通常要比对于物体本身的检验速度更快。在其中任一种场合下,如果物体不可见的话,那么根据视体对每个多边形的检验都是无用的计算。不管物体表面是否真的可见,屏幕上的物体必须裁剪到屏幕能够显示的区域。
为了得到复杂物体的包围体,一种常用的方法是用场景图或者如OBB树这样更加专业的包围体层次工具对物体或者场景进行分解。这种做法的基本思想就是将场景组织成一个树状结构,根节点是整个场景,每个叶节点包括一个简单的局部。
包围盒是一个包容物体的立方体或者二维长方形。在动态仿真中,对于大致是立方体的物体需要相当高的相交检验精度时,包围盒就优于包围球或者包围柱。这样做的效果是很明显的,例如地面上停放的汽车这种一个物体放在另外一个物体上的场合:用包围球处理就会得到汽车与地面相交的结果,但是经过更加复杂的对于汽车模型的检验就会发现事实并非这样;包围盒立即就可以发现汽车与地面并不相交,这样就可以节省花费较大的检验。
在许多应用程序中,包围盒按照坐标系的坐标轴进行排列,这被称为按坐标轴排列的包围盒(AABB)。为了将 AABB 与通用的情况进行区分,有时将任意的包围盒称为定向包围盒(OBB)。AABB 检验物体的相交要比 OBB 更加简单,但是它的缺点是当模型旋转的时候无法随之旋转,而必须重新进行计算。
基本的相交检验
对于一些包围体来说,如 OBB 以及凸多面体,一个有效的检验方法是 Separating Axis Theorem。其思路是如果存在一个与物体不重叠的轴,那么物体就不相交。通常检验的轴 是包围体的基本轴(AABB 中的单位轴或者 OBB 中的三个基轴)。并且经常要随后检查这些轴的外积.
在 AABB 中,这个检验过程变成了一组简单的单位轴的重叠检验。一个 M、N 定义的 AABB 与另外一个 O、P 定义的 AABB 满足下面的条件时二者不相交: (Mx>Px) 或者 (Ox>Nx) 或者 (My>Py) 或者 (Oy>Ny) 或者 (Mz>Pz) 或者 (Oz>Nz)。
AABB 也可以投影到一个坐标轴,如果边长为 L 以 C 为中心,那么沿 N 轴投影之后得到:
r=0.5Lx|Nx|+0.5Ly|Ny|+0.5Lz|Nz|, 并且 b=C*N 或者 b=CxNx+CyNy+CzNz, 并且 m=b-r, n=b+r
其中 m 与 n 分别是最小与最大值。
在这方面 OBB 与之类似,但是 OBB 较为复杂。对于有如上 L 与 C 以及基轴 I、J、K 的 OBB 来说,有:
r=0.5Lx|N*I|+0.5Ly|N*J|+0.5Lz|N*K|
m=C*N-r且n=C*N+r
对于范围 m、n 以及 o、p 来说,如果 m > p 或者 o > n 那么它们就不相交。这样,通过将两个 OBB 的范围沿着每个 OBB 的 I、J、K 轴进行投影并且检验相交性,就可以得到物体的相交性。另外通过检验这些坐标轴的叉积 I0×I1、 I0×J1 等,就可确定物体并不相交。
这种通过坐标轴投影确定相交性的方法也可以用于凸多面体,但是要用多面体的法向量代替基轴、用每个顶点点积的最大值与最小值取代坐标轴。需要注意的是这个描述表示的是在世界坐标系中进行检验。