AABB包围盒碰撞的理解

时间:2023-01-20 15:16:48

此篇文章参考于:http://blog.csdn.net/u012419410/article/details/41911025

AABB包围盒,是一个适用于不精确碰撞的游戏技术。因为它并不像OBB那样可以旋转,一旦物体发生旋转,碰撞范围就会变大,但是他的有点就在于,计算简单,速度快。

AABB包围盒碰撞的理解


先看一下简单的原理
AABB包围盒碰撞的理解

   在上图中,分别做物体A与物体B在X,Y轴方向的投影,物体A的Y轴方向最大点坐标为Y1,最小点坐标Y2,X轴方向最小点坐标X1,最大点坐标X2,物体B同理。

        图中红色区域为物体A与物体B投影的重叠部分。


        可以看出,AABB碰撞检测具有如下规则:

        物体A与物体B分别沿两个坐标轴做投影,只有在两个坐标轴都发生重叠的情况下,两个物体才意味着发生了碰撞。

        

        所以,在程序中做二维游戏的AABB碰撞检测时,只需验证物体A与物体B是否满足如下条件:  

        (1)物体A的Y轴方向最小值大于物体B的Y轴方向最大值;  AminY>BmaxY

        (2)物体A的X轴方向最小值大于物体B的X轴方向最大值;  AminX>BmaxX

        (3)物体B的Y轴方向最小值大于物体A的Y轴方向最大值; BminY>AmaxY

        (4)物体B的X轴方向最小值大于物体A的X轴方向最大值;  BminX>AmaxX

        若满足上述条件,则证明物体A与物体B并未发生重合,反之,则证明物体A与物体B重合。

AABB包围盒碰撞的理解

        上图中是重合了



代码中最主要的呢就是先给物体外面加个框,之后获得这个框的最大顶点和最小顶点,如果是3D的 Z轴的都要算上
 
 
//判断两个包围盒是否碰撞
bool AABB :: intersects ( const AABB & aabb ) const
{
//就是各轴 互相是否包含,(aabb 包含 当前包围盒)|| (当前的包围盒 包含 aabb)
return (( _min . x >= aabb . _min . x && _min . x <= aabb . _max . x ) || ( aabb . _min . x >= _min . x && aabb . _min . x <= _max . x )) &&
(( _min . y >= aabb . _min . y && _min . y <= aabb . _max . y ) || ( aabb . _min . y >= _min . y && aabb . _min . y <= _max . y )) &&
(( _min . z >= aabb . _min . z && _min . z <= aabb . _max . z ) || ( aabb . _min . z >= _min . z && aabb . _min . z <= _max . z ));
}