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.
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.
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
- 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.
- 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!
-
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.
-
Benenne das Image-File in "image.png" um.
-
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
-
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.
-
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).
-
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.
-
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.
-
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!
-
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!
-
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.
-
Mit dem Kommado "close" werden die Koordinaten des Schwerpunktes
S (blaus Kreuz), die Fläche A und das
Flächenträgheitsmoment J berechnet.
- 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.
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.
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 Imagewährend das Programm geladen wird!
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:
Wobei nun x' bzw. y' die neuen Koordinaten des gedrehten Punktes P(x',y') sind.
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:
()
Wobei nun x' bzw. y' die neuen Koordinaten des gedrehten Punktes P(x',y') sind.
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:
- Verschiebe den Mittelpunkt des Image auf die Koordinaten des Schwerpunktes.
- 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.
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!