1. AABB包圍盒
在遊戲中,爲了簡化物體之間的碰撞檢測運算,通常會對物體創建一個規則的幾何外形將其包圍。
其中,AABB(axis-aligned bounding box)包圍盒被稱爲軸對其包圍盒。
二維場景中的AABB包圍盒具備特點:(注:由於Cocos2d-x是基於Opengl ES的,所以下圖中的所有座標系均採用右手直角座標系)
(1) 表現形式爲四邊形,即用四邊形包圍物體。
(2) 四邊形的每一條邊,都會與座標系的軸垂直。
如圖 1-1 所示:
圖1-1
三維場景中的AABB包圍盒特點:
(1) 表現形式爲六面體。
(2) 六面體中的每條邊都平行於一個座標平面。
如圖 1-2 所示:
圖 1-2(圖片來源百度)
在圖1-2中,爲了更明顯的展示AABB包圍盒的特點,在最右側展示了一個OBB(Oriented Bounding Box)包圍盒,也稱作有向包圍盒。
可以看出,AABB包圍盒與OBB包圍盒的最直接的區別就是,AABB包圍盒是不可以旋轉的,而OBB包圍盒是可以旋轉的,也就是有向的。
2. 二維場景中的AABB碰撞檢測原理
首先來看一張二維場景中的物體碰撞圖:
圖 2-1
在圖 2-1中,分別做物體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軸方向最大值;
(2)物體A的X軸方向最小值大於物體B的X軸方向最大值;
(3)物體B的Y軸方向最小值大於物體A的Y軸方向最大值;
(4)物體B的X軸方向最小值大於物體A的X軸方向最大值;
若滿足上述條件,則證明物體A與物體B並未發生重合,反之,則證明物體A與物體B重合。
3. 三維場景中的AABB碰撞檢測原理
首先,再來看一下圖2-1中的二維物體A和物體B的包圍盒,可以發現實際上判斷物體A與物體B是否發生重合只需要知道兩個信息:
(1) 物體A的最小點的信息,即圖2-1中A的左下角點;以及物體A的最大點的信息,即圖2-1中A的右上角點。
(2) 物體B的最小點的信息,物體B的最大點的信息。
也就是說在二維場景的碰撞檢測中,每個物體的頂點座標信息都可以由兩個座標來確定,即兩個座標就可以標識一個物體了,所以兩個物體的碰撞檢測只需要獲得到四個點座標就可以了。
之前在圖1-2中已經看到,三維場景中物體的AABB包圍盒是一個六面體,其座標系對於二維座標系來講只是多了一個Z軸,所以實際上在三維場景中物體的AABB碰撞檢測依然可以採用四個點信息的判定來實現。即從物體A的八個頂點與物體B的八個頂點分別選出兩個最大與最小的頂點進行對比。三維物體的AABB包圍盒的八個頂點依舊可以用兩個頂點來標識,如圖 3-1 所示:
圖3-1
只要確定了圖中黑色點部分的座標,就可以確定八個頂點的全部信息了。