Sergiy Krutykov

Eine der wichtigsten Aufgaben der Engine ist, die 3D-Gegenstände in OpenGL maßstabsgetreu und an richtiger Stelle zu zeichnen. Dafür stehen die Orientierung des Smartphones als Pitch-, Roll- und Kompass-Winkel in Grad zur Verfügung.

Maßstabsgetreue Darstellung der 3D-Objekte

Damit man von "maßstabsgetreu" sprechen kann, muss man zuerst einen Maßstab definieren. Es liegt nah, die Einheit von OpenGL gleich einem Meter zu definieren. Demnach sollte z.B. ein virtueller Würfel mit der Kantenlänge 1.0 in OpenGL in der Entfernung 20.0 genauso groß erscheinen wie ein reeller Würfel mit der Kantenlänge 1m in der Entfernung 20m. Dass die 3D-Objekte in OpenGL in der (virtuellen) Entfernung kleiner werden wird dadurch beeinflusst, dass sie mit einer Projektionsmatrix multipliziert werden. Genauer gesagt beeinflusst ein Faktor dieser Matrix, der Blickwinkel der Projektion (Field of View). Die Änderung des Abstand eines 3D-Objekts geschieht dadurch, dass seine Matrix mit einer Translationsmatrix multipliziert wird. In den beiden folgenden Abbildung sind die Screenshots von einem Test-Programm auf iPhone, welches unter anderem auch dafür geschrieben wurde, um den Blickwinkel zu "justieren":

Auf beiden Bildern ist der gleiche Tresor in unterschiedlichen Abständen zu dem Betrachter zu sehen. Der Tresor soll die gleiche Breite wie die Tür hinter ihm haben. Im linken Bild hat der Tresor sowie die Tür hinter ihm den Abstand von 20 Metern zu dem Betrachter, in der rechten 10 Meter. Die Darstellung scheint (im Vergleich mit der Tür) maßstabsgetreu zu sein: Der Blickwinkel der Projektionsmatrix wurde auf 45° gesetzt. Man muss beachten, dass dieser Blickwinkel von der Auflösung der Kamera abhängt, so dass für andere Geräte eventuell nachjustiert werden muss.

Anpassungen an die Pitch-, Roll- und Kompass-Winkel

Bei den Änderungen der Orientierung des Smartphones müssen die 3D-Objekte in OpenGL so verschoben werden, dass ihre Bewegung die Bewegung des Geräts ausgleicht. Bei jeder Drehung des Smartphones muss also die ganze Szene in entgegengesetzte Richtung gedreht werden. Dafür muss die Projektionsmatrix mit drei Drehmatrizen, jeweils um x-, y- oder z-Achse nacheinander multipliziert werden. Man muss nur beachten, dass ein Objekt zuerst verschoben werden muss und danach mit dieser Produktmatrix multipliziert werden muss, sonst dreht es sich um eigene Achse und nicht um den Betrachter. Die Reaktion auf die Änderungen der Pitch- und Roll-Winkel erscheint bei dem Testprogramm auch ziemlich passend zu sein:

Auf dem linken und dem mittleren Bild sieht man, dass der Tresor sich dem Kippen des Geräts "anpasst". Das rechte Bild ist dadurch entstanden, dass das Gerät zur Seite geneigt wurde, wobei der Tresor

Allerdings macht sich die Ungenauigkeit des Accelerometers (und damit der Pitch- und Roll-Winkel) insbesondere für die weit entfernten Gegenstände bemerkbar, denn die Verschiebung des in 100 Metern liegenden Gegenstandes um 1° ergibt visuelle Erhöhung oder Erniedrigung von ihm um 2m: Wenn man zum Beispiel einen virtuellen Torwart an der anderen Seite des Stadions in einem Tor platzieren möchte, dann schwankt dieser ab und zu über dem Tor. Und wie im Abschnitt Sensoren steht, ist diese Schwankung um 1° vorprogrammiert.

Viel zu große Ungenauigkeit des Kompasses (siehe Abschnitt Sensoren) ruiniert aber die Idee, einen virtuellen Gegenstand so zu platzieren, dass er wie "eingegossen" zu der Umgebung passt, komplett. Daher wurde im Laufe des Projekt entschieden, die Ungenauigkeiten der Sensoren dadurch auszugleichen, dass die Gegenstände auf Luftballons in der Luft schweben, womit die Schwankungen in der Kamera vertuscht werden.

Koordinaten der Objekte in OpenGL

Die Position der Objekte in der Engine wird durch zweidimensionale Koordinaten beschrieben: (x, y). Dabei ist geht die x-Achse von links (-) nach rechts(+) und die y-Achse von hinten (-) nach vorne (+). Wenn der Spieler zum Beispiel im Punkt (0, 0) steht und nach Norden (also mit Drehung der Szene 0°) schaut, dann befindet sich ein Objekt mit den Koordinaten (0, 4) direkt vor im (im Abstand von 4 Metern) und ein Objekt mit den Koordinaten (-3, 4) vorne links (4 Meter nach vorne und 3 nach links). In der folgenden Abbildung ist die schematische Darstellung diesen Sachverhalts:

Da der Spieler nicht immer im (0,0) steht, sondern seine Position ständig ändert, die Gegenstände jedoch an der gleichen Stelle bleiben, kann der Spieler selbst nicht als Bezugspunkt für die Messung der Abstände gelten. Als Lösung dafür wird ganz zum Anfang ein beliebiger Punkt in der Nähe des Spielers als Bezugspunkt genommen und alle Positionen werden anhand von den x- und y-Komponenten der Abstände zu ihm bestimmt. Die Vorgehensweise ist in dem folgendem Diagramm anhand von einem Beispiel dargestellt:

Die y-Komponente des Abstandes vom Spieler zu dem Gegenstand ist gleich dy' - dy und die x-Komponente gleich dx' - dx (da der Spieler sich links von dem Bezugspunkt befindet, ist dx' - dx = |dx'| - (-|dx|) = |dx'| + |dx''| ).

Diese Differenzen werden bei Zeichnen der Objekte berücksichtigt: Die Translationsmatrizen die auf jedes Objekt angewandt werden, beziehen sich auf diese Werte. Es wurde oben angenommen, dass der Spieler zum Norden schaut. Es ändert sich jedoch nichts, wenn er seine Blickrichtung ändert: Wenn man die Drehmatrizen, Translationsmatrizen und die Projektionsmatrix in richtiger Reihenfolge miteinander multipliziert, werden die Objekte immer an passenden Stellen angezeigt.


Page last modified on March 21, 2011, at 11:02 PM