凸包可視爲碰撞集合體的早小包圍體。這裏介紹兩種算法
1.Andrew算法
對於一個點集,首先選擇點集中最靠左的兩個點,產生當前凸包的第一條邊。然後開始向右擴展,(分上下兩條路向右擴展,這裏先只介紹上半部分)
如果考察的下一個頂點位於邊集當前邊的右側,則該點暫定爲凸包上的頂點,並加入到邊集中,如果下一個點位於當前邊的左側,則該店位於凸包的外部,並處於錯誤狀態,此時剔除邊集中的最後一個頂點,並開始下一個頂點,直到出現位於邊集中當前邊右側的頂點。
2.Quickhull算法
Andrew算法在2D空間內工作良好,但是在3D空間內並不適用。
快包算法是先獲取頂點集的包圍和,一般情況下可以確定4個端點,分別位於包圍盒的四條邊上。作爲斷點,上述4個點位於凸包並構成了首次逼近。進一步考察在當前凸包外部的頂點,對於現在獲得的四邊形,計算邊外部距離最遠的頂點(如果存在),則此點必定是凸包上的頂點,那麼此時邊的兩個頂點和這一個新的頂點構成了一個三角形。然後形成一個新的凸包,如此迭代下去,直到所有的頂點都在凸包內。
包圍體被稱爲BV
BV期望特徵
低耗費的相交測試
實現緊密擬合
計算耗費較少
易於旋轉和變換
內存佔用較少
包圍體的常用類型如下:
其中 軸對齊AABB比較常用
我們在做兩個物體的相交測試的時候,可以把兩個物體都變換到世界空間座標。或者把其中一個變換到另一個物體的局部空間座標。(這其中大有不同,)
如上圖 b圖和c圖的判斷結果一個是相交 一個是不相交
AABB的構造除了暴力遍歷頂點取最大最小之外,還可以用爬山法,從當前頂點移動常數個頂點,得到最大/最小範圍。
不過需要數據的預處理如下圖所示
對於AABB旋轉之後,物體的BV通常需要重新計算,最簡單的方法是利用一個新的AABB包圍旋轉後的AABB。
通常計算旋轉後的AABB,只需要計算旋轉之前的頂點在世界座標軸上的投影間隔範圍 經過 矩陣M變換後的範圍。
範圍計算方法和解釋如下: