Achsenausgerichtete Bounding-Boxen (AABB)

Im Rahmen von Kollisionsberechnungen finden neben Bounding-Sphären auch Bounding-Boxen Verwendung. An dieser Stelle werden wir uns lediglich mit achsenausgerichteten Boxen befassen, die eine genau definierte Höhe, Breite und Länge (Ausdehnung in x-, y- und z-Richtung) unabhängig von der momentanen Orientierung der umschlossenen Spieleobjekte besitzen. Wird hingegen die Ausrichtung einer Bounding-Box an die Orientierung des zugehörigen Spieleobjekts angepasst (kurz: Dreht sich das Objekt, dann wird die Box mitgedreht), spricht man von einer orientierten Bounding-Box (OBB).
Für die Beschreibung einer AABB kann die folgende Struktur verwendet werden:


struct CAABB
{
    D3DXVECTOR3 Mittelpunkt;
    D3DXVECTOR3 Ausdehnung;
};

Bei einem Treffertest wird nun der Abstand von Trefferposition und Box-Mittelpunkt mit der Box-Ausdehnung verglichen. Der Test kann vorzeitig abgebrochen werden, sofern der Abstand entlang mindestens einer Achse (x, y oder z) größer ist als die zugehörige Box-Ausdehnung.

inline bool Check_AABB_Hit(CAABB* pBox, D3DXVECTOR3* pHitPosition)
{
    if(fabs(pBox->Mittelpunkt.x – pHitPosition->x) >
       pBox->Ausdehnung.x)
            return false;

    if(fabs(pBox->Mittelpunkt.y - pHitPosition->y) >
       pBox->Ausdehnung.y)
            return false;

    if(fabs(pBox->Mittelpunkt.z - pHitPosition->z) >
       pBox->Ausdehnung.z)
            return false;

    return true;
}

Der Kollisionstest funktioniert nach dem gleichen Prinzip, nur müssen hierbei die Ausdehnungen beider Boxen berücksichtigt werden:

inline bool AABB_AABB_Collision(CAABB* pBox1, CAABB* pBox2)
{
    if(fabs(pBox2->Mittelpunkt.x - pBox1->Mittelpunkt.x) >
       pBox2->Ausdehnung.x + pBox1->Ausdehnung.x)
            return false;

    if(fabs(pBox2->Mittelpunkt.y - pBox1->Mittelpunkt.y) >
       pBox2->Ausdehnung.y + pBox1->Ausdehnung.y)
            return false;

    if(fabs(pBox2->Mittelpunkt.z - pBox1->Mittelpunkt.z) >
       pBox2->Ausdehnung.z + pBox1->Ausdehnung.z)
            return false;

    return true;
}