什么是AABB?
AABB,指軸對齊包圍盒(Axis-aligned bounding boxes)。在3D空間中,AABB是一個長方體,在2D空間中是一個長方形。特征是面法線皆平行於坐標軸,即當物體旋轉時,AABB不會隨物體旋轉,也因此特性,AABB可以最快判斷兩物體是否重疊。
AABB表達
《實時碰撞檢測算法技術》一書中提到3種AABB的表達方式,這里僅舉其中最高效,要求存儲空間最少的一種——即存儲包圍盒的中心位置和包圍盒的半徑(即包圍盒邊緣到包圍盒中心距離的長度):
struct AABB {
Vector3 pos;
Vector3 r;
}
AABB間的碰撞檢測
AABB是否相交可作圖如下:
其中r為半徑,d為兩包圍盒中心的距離。
int AABBIntersection(AABB A, AABB B) {
for(int i=0, i<3, i++){
if(abs(A.pos-B.pos)>A.r+B.r) return 0;
}
return 1;
}
AABB和ray之間的碰撞檢測
在游戲中,經常會出現需要檢測從某一點發出的射線是否與物體相交。
具體邏輯與AABB間的的碰撞檢測相似,只是將其中一個AABB換成了射線。射線的結構如下:
struct Ray {
Vector3 pos;
Vector3 direction;
}
檢測射線與AABB碰撞方程:
int RayAABBIntersection(Ray R, AABB A) {
}