【物理】AABB物理碰撞檢測


什么是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) {
    

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM