Bewegung mit Kollisionserkennung Teil 1

Posted: 4th Februar 2011 by xaedes in Kaufhausschlacht

Teil 1 – Einführung
Teil 2 – Kollision mit Gerade
Teil 2 – Kollision mit Gerade – Demoprogramm
Teil 3 – Kollision mit Strecke
Teil 3 – Kollision mit Strecke – Demoprogramm

Momentan arbeite ich daran eine sinnvolle Kollisionserkennung bei den Bewegungen zu implementieren.
Zum Berechnen einer korrekten Bewegung habe ich die Welt folgendermaßen modelliert:
Die Regale, oder später auch andere behindernde Objekte, bekommen eine BoundingBox, in die die Figuren sinnvollerweise nicht eindringen können sollten.
In folgenden Screenshots habe ich mal eine solche BoundingBox verdeutlicht und im zweiten Bild gezeigt was nicht passieren sollte.

Die BoundingBox besteht nun aus einzelnen Begrenzungskanten (Linien) und die Figur habe ich als Kreis abstrahiert:

s ist dabei die Position der Figur.
v ist der Vektor, der der gewünschten Bewegung der Figur entspricht. Er ist bestimmt durch Richtung und Länge.
p_{L1} und p_{L2} sind Endpunkte einer Begrenzungskante, welche nicht überschritten werden sollte.

Würde die Bewegung wie angefordert ausgeführt, hätten wir folgendes Ergebnis:

z ist dabei die Position der Figur nach der Bewegung (das Ziel).

Wie man unschwer erkennt hat die Figur in diesem Fall die Begrenzungskante nicht beachtet und ist an einer ungültigen Position.

Jetzt müssen wir wissen was bei einer solchen Kollision getan werden soll und wie sich die Figur verhalten soll. Es wäre zum einen möglich eine elastische Kollision mit Bewegungsreflektion, wie bei Billiardkugeln die von der Bande abprallen, zu simulieren, oder wie in diesem Kontext besser, eine unelastische Kollision. Dabei wird einfach nur soweit „gegangen“ wie möglich. Die Bewegung wird abgeschnitten und Bewegungsenergie geht dabei verloren. Steht man im Spiel z.B. neben einem Regal und versucht in die Richtung des Regals zu gehen, sollte einfach nichts passieren. Das ist das gewünschte Verhalten.
Möchte man eine solche perfekt unelastische Kollision erreichen, ist eine Platzierung wie hier veranschaulicht gesucht.
.

Gesucht ist also die korrigierte Zielposition z‘.

Wie man diese ausrechnet zeige ich im nächsten Teil.