Sphere and AABB 包圍盒碰撞檢測應用

2021-07-09 05:25:36 字數 1051 閱讀 9142

在遊戲開發中,經常會用到碰撞檢測的技術。而在其中,關於sphere(球體)和aabb(軸向包圍盒)的碰撞尤為常見。今天就來記錄下,如何進行這兩個基本幾何體的碰撞檢測。

進行sphere和aabb包圍體的碰撞,實際上就是以下的兩個步驟:

1.在aabb盒上,找到距離sphere的圓心距離最近的點 p(closetpttoaabb)

2.計算出這個點p與sphere的圓心q之間的距離,為了節省開銷,可保留平方,即距離的平方值(d2)

3.比較距離的平方值d2與sphere的半徑平方值r2,如果d2 <= r2,則說明,這個點在sphere中,即發生了碰撞,反之則沒有發生碰撞。

思路十分的簡單,剩下的問題就是如何求aabb盒上距離sphere的圓心最近的點是哪乙個?

我們在表示aabb盒的時候,一般使用的都是min-max這樣的表示方法。而aabb又是軸向平行的,所以,討論乙個2d平面上的情況,就可以推廣到3d空間中去。

來看下,下面的圖:

對於空間中的任何乙個點p,要求在aabb盒b上距離p點最近的點,實際上就是將p點的座標改裁剪到在aabb盒上去。比如上圖左邊的圖,p點座標裁剪完成之後,就是aabb盒上的q點,也就是說,如果p點的x座標小於aabb盒的min座標的x座標,那麼就對應的q點座標就是min的x座標。

所以,求最近點的**如下:

[cpp]view plain

copy

"font-family:microsoft yahei;"

>

void

clostpttoaabb(aabb a, point p, point&q)  

再有了最近點之後,只要求sphere的圓心和q點的距離,然後與sphere的半徑進行比較即可。

好了,**很簡單,為此我給出了乙個demo例項,下面是demo的截圖:

AABB包圍盒 OBB包圍盒 包圍球的比較

1 aabb 包圍盒 aabb 包圍盒是與座標軸對齊的包圍盒,簡單性好,緊密性較差 尤其對斜對角方向放置的瘦長形物件,採用aabb,將留下很大的邊角空隙,導致大量沒必要的包圍盒相交測試 當物體旋轉之後需對aabb 進行同樣的旋轉並更新 當物體變形之後只需對變形了的基本幾何元素對應的包圍盒重新計算 然...

AABB包圍盒 OBB包圍盒 包圍球的比較

1 aabb 包圍盒 aabb 包圍盒是與座標軸對齊的包圍盒,簡單性好,緊密性較差 尤其對斜對角方向放置的瘦長形物件,採用aabb,將留下非常大的邊角空隙,導致大量不是必需的包圍盒相交測試 當物體旋轉之後需對aabb 進行相同的旋轉並更新 當物體變形之後僅僅需對變形了的基本幾何元素相應的包圍盒又一次...

包圍球與包圍盒的碰撞檢測

碰撞檢測演算法的引申問題 盒子和盒子的碰撞,或者球和球的碰撞已經有太多的討 章,這裡不說 這裡只說盒子和球的碰撞 二維情況 問題描述 平面任意的矩形和乙個圓是否相交的判定 分析 圓和矩形相交發生情況下,球心在什麼區域呢?區域的形狀是個圓角矩形,如下示意圖 綠色為矩形的部分,當圓的圓心衛浴藍色和綠色的...