此篇文章参考于:http://blog.csdn.net/u012419410/article/details/41911025
AABB包围盒,是一个适用于不精确碰撞的游戏技术。因为它并不像OBB那样可以旋转,一旦物体发生旋转,碰撞范围就会变大,但是他的有点就在于,计算简单,速度快。
先看一下简单的原理
在上图中,分别做物体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重合。
上图中是重合了
代码中最主要的呢就是先给物体外面加个框,之后获得这个框的最大顶点和最小顶点,如果是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
));
}