引言
在前面的一篇文章中讲述了如何通过模型的顶点来求的模型的包围球,并且还讲述了基本包围体除了包围球之外,还有AABB包围盒。在这一章,将讲述如何根据模型的坐标求得它的AABB盒。
表示方法
AABB盒的表示方法有很多,总结起来有如下的三种情况:
Max-min表示法:使用一个右上角和左下角的点来唯一的定义一个包围体
Center-radious表示法:我们用center点来表示中点,radious是一个数组,保存了包围盒在x方向,y方向,z方向上的半径。
Min-Width表示方法:我们用min来定义左下角的点,使用width来保存在x,y,z方向上的长度。
不同的方法,他们的碰撞检测算法也会有所不同,并且不同的表示方法也会适用在不同的情形下。所以,大家自己设计的时候,需要慎重考虑。
在本文中,将会使用的是Max-min表示方法,如下所示:
class AABB
{
....
public:
VECTOR3 max ;
VECTOR3 min ;
};
在这种表示方法之下,进行碰撞检测的代码如下所示:
bool AABB::isCollided(AABB* a)
{
if(max.x < a->min.x || min.x > a->max.x) return false ;
if(max.y < a->min.y || min.y > a->max.y) return false ;
if(max.z < a->min.z || min.z > a->min.z) return false ;
return true ;
}// end for isCollided
AABB盒构造
构造AABB盒的方法有很多种,有的很简单,有的很复杂,这里将介绍两种基本的构造方法,他们也非常的简单,容易掌握。
第一种是固定大小的AABB盒,这种AABB盒在构造完毕之后,不管被包围的物体怎么样的旋转,都不需要在进行重新构造了。
第二种是比较紧凑的一种,利用X,Y和Z轴向上最长和最远的点来构造一个AABB盒。