Kollisionen an beliebig orientierten Flächen

Bei der Verwendung von achsenausgerichteten Bounding-Boxen (AABB) werden im Zuge des Kollisions-Handlings nur die sechs achsenparallelen Kollisionsflächen der Boxen bei der Berechnung der Bewegungsrichtungen nach einer Kollision berücksichtigt. Dies führt zu teils starken Abweichungen vom realen Verhalten der Kollisionspartner, was den meisten Spielern natürlich nicht verborgen bleibt – kurzum, man bemerkt schnell, dass hier irgendetwas nicht stimmt, dass getrickst wurde.
Mithilfe von Bounding-Sphären ist hingegen eine deutlich realistischere Kollisionsbeschreibung möglich, da es keinerlei Beschränkungen bei der Anzahl der möglichen Kollisionsflächen gibt. Bei einer Kollision zweier Sphären lässt sich jedem denkbaren Kontaktpunkt eine separate Kollisionsfläche zuordnen.

Hinweis:
Das Verhalten eines Spieleobjekts bei einer Kollision lässt sich umso realistischer beschreiben, je besser das verwendete Kollisionsmodell an die Objektgeometrie angepasst ist. Eine einzelne Bounding-Sphäre, die das gesamte Objekt einschließt, ist für das Kollisions-Handling komplexer 3D-Modelle normalerweise nicht ausreichend und sollte daher in Verbindung mit einem Bounding-Sphären-Test nur zum Ausschluss einer mögliche Kollision verwendet werden. Liegt eine Kollision im Bereich des Möglichen, sollten im zweiten Schritt, im Zuge eines genaueren Kollisionstests, kleinere Bounding-Sphären zum Einsatz kommen, die jeweils nur Teile des 3D-Modells umschließen.

















Da die Kollisionsflächen beim Einsatz von Bounding-Sphären beliebig im Raum orientiert sein können, benötigen wir ein mathematisches Verfahren für die Berechnung der neuen Bewegungsrichtungen, welches nicht auf achsenparallele Flächen beschränkt ist. Wir wissen bereits, dass sich eine Fläche durch ihren Flächennormalenvektor charakterisieren lässt. Im Rahmen der Kollisionsbeschreibung bietet sich zweckmäßigerweise auch die Bezeichnung Kollisionsnormale an, welche sich für die beiden Kollisionspartner wie folgt berechnet:

D3DXVECTOR3 CollisionNormal_Object1 = SphereCenter_Object1 - SphereCenter_Object2;

D3DXVec3Normalize(&CollisionNormal_Object1, &CollisionNormal_Object1);

D3DXVECTOR3 CollisionNormal_Object2 = -CollisionNormal_Object1;


Mithilfe der Kollisionsnormale sowie der Flug- bzw. Bewegungsrichtung von vor der Kollision lässt sich die neue Bewegungsrichtung nach der Kollision wie folgt bestimmen:


































Die Berechnung der neuen Flugrichtung gliedert sich jetzt in 3 Schritte:

Schritt 1: Berechnung des Skalarprodukts von Flächennormale und Flugrichtung:

float DotProduct = D3DXVec3Dot(&Normal, &Flugrichtung);

Schritt 2: Berechnung des Projektionsvektors (negative Projektion der Flugrichtung von vor der Kollision auf die Kollisionsnormale):

D3DXVECTOR3 NormalProjectionsVector = -DotProduct*CollisionNormal;

Schritt 3: Berechnung der neuen Flugrichtung:

Bewegungsrichtung = Bewegungsrichtung + 2.0f*NormalProjectionsVector;