Advanced Games Physics
2. Kapitel

Umgang mit Images als bewegliche Objekte

Photorealistische Objekte

So richtig schön wird ein Spiel erst dann, wenn die Akteure und die Objekte fotorealistisch sind! Die Herausforderung besteht darin, dass jedes fotorealistisch dargestellte Objekt einen Doppelgänger in Form einer Polygonkontur benötigt. Das Image ist zum Anschauen da, die Kontur, um z.B. Kollisionen berechnen zu können. Dazu muss das Objekt, dessen Image als .bmp- oder .png-Datei vorliegt, digitalisiert werden. Digitalisieren heißt hier, die Kontur des auf dem Image dargestellten Objektes digital zu erfassen! Und zwar so, dass Kontur und Image deckungsgleich und maßstäblich sowie im richtigen Winkel zur Anwendung passend sind.

Kontur-Erfassung eines Images

Wegen der erforderlichen hohen Präzission beim Erfassen einer Kontur verbietet sich das Arbeiten mit Geräten geringer Display-Auflösung. Eine Möglichkeit zur Digitalsierung einer Kontur auf der Grundlage eines Images wird in der Desktop-Version dieser Seite vorgestellt.

Für die Verwendung einer digitalisierten Kontur genügt es, diese als file verfügbar zu haben. zeigt die Datenstruktur des files contour.txt. Dieses wird in Abhängigkeit vom verwendeten Betriebssystem im Folder Dokumente oder Downloads gespeichert. Aber hier besteht Wahlfreiheit, so dass jeder beliebige andere Ordner gewählt werden kann.

Mit größter Sicherheit gibt es im Internet unzählige Programme, mit deren Hilfe Images digitalisiert werden können. Dennoch habe ich mich dazu entschieden, ein weiteres Programm zu schreiben. Dieses Programm liefert deckungsgleiche und maßstäbliche Kontur-Daten. Darüber hinaus werden für spätere Anwendungen (z.B. Rotation) die normierte Fläche der Kontur A', die Koordinaten des Flächenschwerpunktes S(x0', y0') und das normierte Flächenträgheitsmoment J' bereit gestellt. Alle Daten sind so aufbereitet, dass sie zwischen allen hier vorgestellten Beispielprogrammen ausgetauscht werden können.

download processing
download p5.js
run program

Wegen der erforderlichen Präzission beim Erfassen einer Kontur, ist das Arbeiten mit der Maus zu empfehlen. Deshalb sind die folgenden Anweisungen für die Mausbenutzung verfasst!


So ist das Erfassungsprogramm zu handhaben:
  • Vorbereitung
  1. Stelle das Objekt, welches als Image vorliegt, mit Hilfe eines der gängigen Grafikbearbeitungsprogramm (z.B. Gimp) frei. D.h. entferne alle Bildteile, die nicht zu dem gewünschten Objekt gehören.
  2. Schneide das frei gestellte Objekt bündig aus dem Image aus (Befehl in den meisten Grafikprogrammen: Zuschneiden). Andernfalls sind die erfasste Kontur und das Image nicht deckungsgleich!
  3. Lade das zu erfassende Image in den Ordner "data" des Erfassungsprogramms. Sinnvoller Weise liegt das Image als .png-File vor und ist so orientiert, dass seine größte Abmessung entweder in x- oder y-Richtung zeigt! Images, die anders orientiert vorliegen, sind mit Hilfe eines Grafikprogramms so zu drehen, dass die größte Abmessung der oben aufgestellten Forderung entspricht.

  4. Benenne das Image-File in "image.png" um.

  5. Starte das Erfassungsprogramm Grund_0050_digitize_Objects.pde (processing) oder pGrund_0050_digitize_Objects.js (p5.js).

    Für einfache Anwendungen, d.h. das Objekt ist fixiert, werden die Werte für Fläche, Trägheitsmoment und Schwerpunkt nicht benötigt. Darum kann das Erfassungsprogramm in einer vereinfachten Form gestartet werden. Standardmäßig ist das Erfassungsprogramm auf die einfache Erfassung eingestellt. Andernfalls (z.B. wenn nichtzentrale Stöße an einem beweglichen Objekt dargestellt werden sollen) ist in Zeile 12 des Programmcodes in der p5.js-Version die Variable imageCenter statt mit "center" mit "gravity" zu laden.




Abb. Laden und Einrichten eines Image zur Konturerfassung


  • Programmausführung
  1. Passe die Größe des Images mit Hilfe des Buttons scale so an, dass ein möglichst genaues Erfassen der Konturpunkte möglich ist. Per Buttonbetätigung wird die Vergrößerung um den Wert 1 bis zum Wert 4 erhöht, danach wird die Vergrößerung wieder auf den Wert 1 zurück gesetzt.

  2. Suche die größte Abmessung. Fasse mit der Maus den grünen Knopf links oberhalb des rot gezeichneten Quadrats und verschiebe das Quadrat so, dass entweder die linke Seite des Quadrats an die äußerste linke Abmessung des Images (größte Abmessung ist parallel zur x-Achse) oder die obere Seite an den obersten Punkt des Images (größte Abmessung ist parallel zur y-Achse).

  3. Fasse nunmehr den rechten unteren grünen Knopf mit der Maus und passe das Quadrat so an, dass entweder der rechte Rand des Quadrates die äußerste rechte Abmessung des Images (größte Abmessung ist parallel zur x-Achse) oder der untere Rand die tiefste Abmessung (größte Abmessung ist parallel zur y-Achse) berührt. Diese Maßnahmen führen dazu, dass die erfasste Kontur auf den Wert 1 normiert wird. D.h. die Ausdehnung der größten Abmessung erscheint in der erfassten Kontur mit dem Wert 1.

  4. Verschiebe das Quadrat so, dass das Fadenkreuz mit dem Mittelpunkt des Images übereinstimmt. Auf diese Weise wird sicher gestellt, dass bei einer späteren Anwendung Image und Kontur wirklich deckungsgleich sind.

  5. Jetzt kann mit der Konturerfassung begonnen werden. Klicke mit der Maus charakteristische Konturpunkte des Images an. Dieser Punkt wird rot gekennzeichnet auf dem Image zu sehen sein. Erfasse so weitere Punkte. Aus ökonomischen Gründen sollte die Anzahl von Konturpunkten möglichst klein bleiben!

  6. Korrekturen, Löschungen oder Erweiterungen der Kontur sind immer möglich: Anfassen eines vorhandenen Punktes und verschieben ändert die Koordinaten dieses Punktes, Klicken auf eine Verbindungsline erzeugt an dieser Stelle einen neuen Konturpunkt. Anklicken mit der rechten Maustaste (processing) oder linke Maustaste + Shift (p5.js) löscht diesen Konturpunkt. Betätigen des Buttons "new" löscht die gesamte erfasste Kontur und eine komplette Neueingabe ist möglich!

  7. Mit dem Button "close" wird die Kontur geschlossen, wenn das Objekt ein Körper ist. In der Regel ist dies der Fall, dann wird der letzte Konturpunkt mit den Werten des ersten Konturpunktes geladen.

  8. Mit dem Kommado "close" werden die Koordinaten des Schwerpunktes S (blaus Kreuz), die Fläche A und das Flächenträgheitsmoment J berechnet.

  9. Zuletzt werden mit dem Button "save" die normierten Konturkoordinaten P'i und die weiteren normierten Kenngrößen A' und J' im File "contour.txt" zum Speichern bereitgestellt (). Das erfolgt in Abhängigkeit vom verwendeten Betriebssystem im Folder Dokumente oder Downloads. Aber hier besteht Wahlfreiheit, so dass jeder beliebige andere Ordner gewählt werden kann.


Aufbau des Files contour.txt

Abb. Aufbau des Files contour.txt

Die Angabe zur Image-Breite [pixel] ist gleichwertig zur Angabe einer Image-Höhe. Grund hierfür ist die Normierung der Image-Daten, die sich auf das das Image umgebende Quadrat entsprechend des 3. Schrittes der Konturerfassung beziehen.

Kontur-Rekonstruktion aus einem Konturenfile

Nach der Erfassung eines Images in einem Konturenfile stehen die Daten gepackt und normiert in einem txt-file zur Verfügung (). Sollen nun diese Daten in einer Anwendung genutzt werden, so müssen sie wieder entpackt und denormiert werden.

Für die Kollisionserkennung und -behandlung selbst ist es unwichtig, wo der Mittelpunkt der Kontur positioniert ist. Für die Anwendung aber schon! Denn, erfolgt ein Stoß auf das Objekt, das durch das Image repräsentiert wird, so ist es entscheidend für die Bewegung nach dem Stoß, ob dieser zentral oder dezentral erfolgte. Über die Konsequenzen kannst Du näheres unter Behandlung des dezentralen, elastischen Stoßes bzw. Wechselwirkung von Stoß und Drehimpuls erfahren.
In diesem Kapitel ist diese Thematik noch nicht relevant. Darum wurde das Konturerfassungsprogramm so eingestellt, dass auf Trägheitsmoment und Schwerpunkt verzichtet wird. Vielmehr betrachten wir das Objekt als fixiert, was bedeutet, dass uns der Imagemittelpunkt als Bezug genügt. Damit wird garantiert, dass Image und Kontur einen gemeinsamen Mittelpunkt haben.
Damit beide auch deckungsgleich sind, wird das Image zur Entnormierung an die konkreten Anforderungen angepasst. Das erfolgt mittels des vorgegebenen Wertes polygonWidth, der im Programm als Konstante festgelegt wurde. Mit dem Befehl resize(polygonWidth, 0) wird das Image in seiner Größe so verändert, dass es die selben Abmessungen wie die erfasste und entnormierte Kontur hat. Darum muss auch die Kontur mit eben dem Wert polygonWidth entnormiert () werden. So erscheinen beide, Image und Kontur, deckungsgleich.



Abb. Laden einer Kontur aus einem file und Entnormierung mit einem vorgegebenen Wert

Hier ist ein Beispiel für eine Kontur, die von einem Objekt abgenommen wurde. Das Image und damit auch die Kontur werden als unbeweglich betrachtet. Stöße der Kugel an das Objekt führen daher nur zur Reflexion der Kugel.
In der Darstellung ist die Deckungsgleichheit zu erkennen. Mit dem Button show/hide kann die Kontur zum Image sichtbar/unsichtbar geschaltet werden.
download p5.js
run program

Synchronität zwischen Image und Kontur


Nicht ganz unproblematisch ist die Bewegung des Pärchens Image/Kontur (). Während das Image mit Hilfe der Matrix-Befehle einfach verschoben oder gedreht werden kann, trifft dies für die Kontur nicht zu. Die Kontur ist ja nur ein mathematisches Hilfsmittel, das durch seine Konturpunkte beschrieben ist. Um nun beide, das Image und die Kontur den physikalischen Gesetzen entsprechend zu bewegen, müssen das Image mittels der Matrix-Befehle und die Kontur mittels Translations- bzw. Rotations-Mathematik behandelt werden.

Bitte einen Augenblick Geduld
während das Programm geladen wird!
Abb. Deckungsgleichheit von Kontur und Image


Während das Verschieben eines Polygons um einen bestimmten offset unproblematisch ist, ist die Drehung eines Polygons nicht ganz ohne! Um ein Polygon um den Winkel φ zu drehen, muss jeder Punkt des Polygons um den Winkel φ um den Koordinatenursprung gedreht werden. Betrachten wir das Schicksal eines einzelnen Punktes P(x,y):
Zunächst wird ein Hilfskoordinatensystem konstruiert, das genau um den Winkel φ gegenüber dem Ursprungssystem gedreht ist. Nun werden die x- bzw. die y-Koordinate des Punktes P(x,y) auf dieses Hilfssystem projiziert. Dabei ist zu beobachten, dass die Projektionen x' bzw. y' Anteile sowohl von x als auch von y beinhalten. In der Grafik wird dieser Vorgang aus Gründen der Übersichtlichkeit nur für die x-Koordinate dargestellt (siehe hierzu auch den Geistesblitz zur Drehung eines Koordinatensystems).
Für die Drehung um den Winkel φ gilt die Transformationsregel:

()
Formel 1

Wobei nun x' bzw. y' die neuen Koordinaten des gedrehten Punktes P(x',y') sind.
Drehung eines Punktes um den Koordinatenursprung

Abb. Drehung eines Punktes um den Koordinatenursprung


zeigt den Code für das Laden und Drehen von Images und Konturdaten. Besondere Beachtung verdient das Verschieben des Images in den durch die Kontur vorgegebenen Schwerpunkt. Die Verschiebung muss in zwei Schritten erfolgen:
  1. Verschiebe den Mittelpunkt des Image auf die Koordinaten des Schwerpunktes.
  2. Verschiebe das Image um die Koordinaten des Schwerpunktes, um so die deckungsgleiche Drehung des Images zu ermöglichen. Der Befehl resize() passt das Image an die Maß der Kontur an.




Abb. Deckungsgleiches Laden und Drehen von Image und Kontur


Das Programmbeispiel verwendet eine bereits erfasste Kontur. Hier die eines Fünfecks, dessen Schwerpunkt deutlich vom Mittelpunkt des Images abweicht. Aber auch andere Konturen befinden sich im Ordner "data". z.B. die des Kometen Tschuri. Mit dem Programm soll demonstriert werden, wie eine Rotation von Image und Kontur deckungsgleich erfolgt. Zu diesem Zweck greift eine Griff (grün) am Schwerpunkt des Objektes an. Mit der Maus kann dieser Griff angefasst und bogenförmig bewegt werden. So kann das Objekt gedreht werden. Betätigen des Buttons Show zeigt die selbe Operation an der Kontur.
download p5.js
run program

Ergebnisdiskussion: In der Konturdarstellung werden der Mittelpunkt (weiß) und der Schwerpunkt (rot) des Objektes bzw. der Kontur angezeigt. Es ist zu erkennen, dass die Drehung des Objektes um den Schwerpunkt erfolgt.
Im linken Darstellungsbereich werden die aus dem Konturfile data/contour.txt übernommenen Werte angezeigt. Achte dabei auf die ersten Werte, diese sind für die Rotationsparameter von Bedeutung!