In Spielen ist es häufig
notwendig eine Kollisionserkennung zu implementieren. Es werden hier die am häufigsten benötigten Kollisionsarten angesprochen. |
 |
Kollision zweier Rechtecke |
Dies ist die einfachsten Kollisionserkennungen,
und wie eine solche auszusehen hat kann man sich schnell überlegen.
Man hat nur bestimmte Angaben der Rechtecke, die diese aber eindeutig definieren.
So kann man auch nur diese für die Kollisionserkennung verwenden. Wenn man die
Rechtecke und den Raum in dem sie sich befinden näher betrachtet, fällt einem
auf, dass die Angaben der Rechtecke eine bestimmte Menge aus dem Raum, in dem
die Rechtecke sich befinden, definieren. Da die Angaben der Rechtecke diese
Mengen begrenzen, braucht man nur testen ob diese Grenzen überschritten werden.
|
|
So kann man eine einfache Abfrage gestalten:
|
Wenn
(R1.Bottom > R2.Top
UND
R1.TOP < R2.Bottom
UND
R1.Right > R2.Left
UND
R1.Left < R2.Right)
dann: KOLLISION!!!
|
 |
Hier ein Beispiel: Kollisionserkennung 2D |
 |
Kollision zweier Kreise |
Die Kollision zwischen zwei Kreisen zu realisieren,
scheint auf den ersten Blick ziemlich komplex zu sein. Beim genaueren Betrachten
der Angaben die für einen Kreis notwendig sind, stellt sich heraus, das es noch
einfacher wird als eine Rechteckkollision. Der Kreismittelpunkt und der Radius eines Kreises definieren ihn eindeutig. So
ist jeder Punkt Element des Kreises, wenn er mindestens genauso nah wie der
Radius lang ist, vom Mittelpunkt entfernt ist. |
Im Falle einer Kollision zwischen zwei Kreisen gibt es also immer mindestens
einen Punkt der ein Element beider Kreise ist. Dieser ist dann zwangsläufig
nicht weiter entfernt von den Mittelpunkten der Kreise als der Radius dieser.
Daraus folgt, dass genau dann eine Kollision stattfindet, wenn die Mittelpunkte
der Kreise näher aneinander sind, als die Summe der Radien groß ist.
|
|
Die Umsetzung ist sehr einfach. Berechnet wird die Entfernung (Pythagoras sei
Dank) zwischen zwei Punkten, wobei man am Besten den Mittelpunkt der Objekte
nimmt. Ist dann die errechnete Distanz kleiner als der Radius beider Objekte,
liegt eine Kollision vor.
|
So könnte man solch eine Abfrage gestalten:
|
Wenn
(Wurzel((K1.X - K2.X)*(K1.X - K2.X) + (K1.Y - K2.Y)*(K1.Y
- K2.Y))
<
(K1.Radius + K2.Radius))
dann: KOLLISION!!!
|
 |
Hier ein Beispiel: Kollisionserkennung
(Distanz-Berechnung) |
 |
Kollision zweier Linien |
Wenn man zwei Linien betrachtet die überprüft
werden sollen, kann man schnell die Ähnlichkeit zu linearen Funktionen
herleiten. Denn die Linien sind bloß Ausschnitte von linearen Funktionen wenn
man so will.
|
|
Als erstes muss man aus den gegebenen Linien zwei Funktionen machen. Die Werte
"m" und "n" müssen daher berechnet werden. Die Steigung
einer Funktion (oder der Linie) berechnet sich ganz einfach durch den Term
(Y2-Y1) / (X2-X1) wie nach dem so genannten Steigungsdreieck.
Wenn man die Funktion
nun nach "n" umstellt und einige bekannte einsetzt X1, Y1 und m so erhält
man den Wert für "n".
|
Den Schnittpunkt der Funktionen zu ermitteln ist nun sehr einfach. Man setzt
beide Funktionen gleich und formt diese Gleichung solange um, bis man das
X-Argument des Schnittpunktes besitzt. Im Computer geht das ganz analog dazu,
nur das man die Gleichsetzung schon im Voraus so umstellt das man sofort das
Ergebnis erhält.
Jetzt wurde der Schnittpunkt von zwei Funktionen ermittelt, da wir aber den
Schnittpunkt zwischen zwei Linien berechnen wollten, muss noch abgefragt werden
ob der Schnittpunkt ein Element der beiden Linien ist.
|
Ein paar Probleme wirft diese Art der Lösung doch auf. Wenn eine der Linien
Senkrecht zur X-Achse steht, kann die Steigung nicht berechnet werden, da sie an
dieser Stelle unendlich ist, oder wenn die Linien parallel verlaufen, haben sie
keinen Schnittpunkt oder sie liegen genau aufeinander. Für diese Probleme kann man
Abfragen erstellen, die diese Schwierigkeiten eliminieren. Man kann es aber auch
sein lassen, da in einem Spiel Linien mit Gleitkomma-Koordinaten nur mit extrem
geringer Wahrscheinlichkeit genau Senkrecht oder Parallel werden.
|
 |
Hier ein Beispiel: Linienkollision |
 |