Advanced Games Physics
6. Kapitel

Kollision an Multi-Polygonen

Flipper

Das oben beschriebene Verfahren der vektoriellen Kollisionserkennung eignet sich besonders gut für die Implementierung der Kollision an Multi-Polygonen als class (processing) oder object (p5.js). Dadurch wird es möglich, komplexe Anordnungen von vielen Hindernissen zu modellieren. Ein klassisches Beispiel hierfür ist das Spiel FLIPPER. Für jedes Hindernis wird eine Instanz eröffnet. Für jedes Hindernis wird auf Kollision geprüft und für jedes Hindernis wird eine nachträgliche Korrektur des Stoßortes vorgenommen.
So weit so gut. Die Herausforderung für die Implementierung besteht beim FLIPPER aber darin, die verschiedenen Geometrien des Spieles geeignet zu erfassen und gleichzeitig einen ökonomischen, d.h. Rechenzeit optimierten, Ablauf zu ermöglichen.

Berücksichtigen der Geometrien bedeutet, unterschiedliche Bewegungsabläufe zu berücksichtigen:
  1. Startkanal: Fall unter Berück­sichtigung der Strömungs­reibung
  2. Oberer Halbkreis: Fadenpendel
  3. Spielfeld mit Hindernissen: Schräger Wurf unter Reibungs­einfluss und Kollisions­erkennung Kollisionserkennung mit nach­träglicher Korrektur des Stoß­ortes
  4. Reflexionsfreie Bewegung auf Hindernissen: Schiefe Ebene und
  5. Rücklaufkanal: Schiefe Ebene

Insbesondere der Übergang von 3. zu 4. ist nicht unproblematisch. Einziges Unterscheidungsmerkmal ist die Abfolge von Kollisionen: Solange die Kugel noch springt, liegt der Zustand nach 3. vor. Zwischen jeder Kollision gibt es kollisionsfreie Phasen. Im Gegensatz dazu finden im Zustand 4. stets Kollisionen ohne Pause statt. Dies machen wir uns als Kriterium für das Weiterschalten von 3. auf 4. zu nutze. Das setzt aber eine sehr zuverlässig funktionierende Ortskorrektur während der Kollision voraus!
Um die CPU-Last klein zu halten, wird das Spielfeld segmentiert. D.h. je nach Aufenthaltsort der Kugel werden bestimmte Segmente zur Kollisionserkennung aktiv geschaltet, während in den nichtaktiven Segmenten keine Kollisionserkennung durchgeführt wird.

Der hier implementierte Flipper hat eine sehr überschaubare Struktur und nur eine Bedienungsmöglichkeit, nämlich den Zug-Griff rechts unten am Spielfeld. Wird der Zug-Griff nach unten gezogen und dann losgelassen, wird die Kugel losgeschnippt. Je weiter Du nach unten ziehst, desto stärker die Kraft (zu erkennen an der Geschwindigkeitsanzeige rechts neben dem Spielfeld).
Mit dem Button "visible" können die Hindernisse und die Segmentierung des Spielfeldes sichtbar gemacht werden. Ebenso werden die Vektoren für die Kollisionserkennung angezeigt. Viel Spaß!

download processing
download p5.js
run program

Ergebnisdiskussion: Der Programmierer wird immer wieder vor besondere Herausforderungen gestellt. Hier ist es die unvollständige Approximation einer gleichmäßigen Rundung durch ein Polygon, z.B. am oberen Halbbogen oder an den Hindernissen. So approximierte Objekte haben keinen konstanten Radius! Das führt bei Kollisionsentscheidungen, die sich auf einen konstanten Radius beziehen (z.B. zum Verlassen des oberen Halbbogens), zu Fehlern. Diese Fehler zu vermeiden, müssen diesen Entscheidungen gewisse Toleranzen eingeräumt werden, die wiederum zu anderen Fehlentscheidungen führen können. Hier ist also durch sorgfältiges Ausprobieren ein Optimum zu finden.