2 Grundlagen der Arbeit
Transcrição
2 Grundlagen der Arbeit
Entwicklung eines Augmented Reality-Spiels Studienarbeit vorgelegt von Tobias Daniel Kammann Matrikelnr: 119920326 Institut für Computervisualistik Arbeitsgruppe Computergraphik Betreuer und Prüfer: Prof. Dr.-Ing. Stefan Müller September 2003 Inhaltsverzeichnis 1 Einleitung 2 Grundlagen der Arbeit 2.1 Verwendung vorhandener Komponenten . . . 2.2 Funktionsweise des AR-Toolkits . . . . . . . 2.2.1 Übersicht . . . . . . . . . . . . . . . 2.2.2 Programmablauf . . . . . . . . . . . 2.2.3 Kameraposition . . . . . . . . . . . . 2.2.4 Installation des AR-Toolkits . . . . . 2.2.5 Anmerkung zur verwendeten Version 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 11 11 11 11 16 17 19 3 Entwicklung des Spiels 3.1 Planung eines interessanten Spiels . . . . . . . . . . . . . . . . . . 3.2 Angestrebtes Spielkonzept . . . . . . . . . . . . . . . . . . . . . . 3.3 Implementation des Spielprinzips . . . . . . . . . . . . . . . . . . . 3.3.1 Koordinatenbestimmung für Raumschiffe und Levelobjekte 3.3.2 Raumschiffsteuerung . . . . . . . . . . . . . . . . . . . . . 3.3.3 Joystick . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.4 Tor-Objekte . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.5 Kollisionserkennung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 21 22 27 28 33 35 36 36 4 Ergebnisse 4.1 Das Spiel . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.1 Spielkonzept . . . . . . . . . . . . . . . . . . . 4.1.2 Interaktionsmöglichkeiten . . . . . . . . . . . . 4.2 Umgesetzte Optimierungen . . . . . . . . . . . . . . . . 4.2.1 Schatten . . . . . . . . . . . . . . . . . . . . . . 4.2.2 Kollision mit realen Objekten . . . . . . . . . . 4.2.3 Automatische Höhenanpassung des Raumschiffs 4.2.4 Benutzererfahrungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 41 41 43 45 46 47 48 49 5 Fazit und Ausblick 5.1 Abgeschlossene Umsetzung . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2 Optimierungsansätze und Erweiterungen . . . . . . . . . . . . . . . . . . . . . 5.2.1 Erkennung der Markerposition . . . . . . . . . . . . . . . . . . . . . . 51 51 51 51 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Inhaltsverzeichnis 5.2.2 Verdeckung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2.3 Fortführung des Spielkonzepts, Optimierung . . . . . . . . . . . . . . Ausblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 52 53 6 Anhang 6.1 Beispielprogramm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2 Systemkonfiguration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 55 60 5.3 6 Abbildungsverzeichnis 2.1 2.2 2.3 2.4 2.5 2.6 2.7 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12 3.13 3.14 3.15 3.16 3.17 Prinzipielle Arbeitsweise des AR-Toolkits in mehreren Schritten . . . . . . . . Objektstruktur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Markerstruktur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Vergleich der gefundenen mit den gespeicherten Mustern . . . . . . . . . . . . Kamera-Viewport und zwei Marker (schwarze Balken) im Blickfeld der Kamera mit Positionsänderung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Marker-Informationsdatei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Beispieldatei zu einem 3D-Modell . . . . . . . . . . . . . . . . . . . . . . . . Der Benutzer trägt ein HMD und arbeitet mit Markern – der PC verschwindet c aus dem Blickfeld (Foto HITLab[9]) . . . . . . . . . . . . . . . . . . . . . . Skizzen zur Brettspiel-Metapher-Erweiterung in die dritte Dimension . . . . . Der Marker dient als Eingabegerät und die reale Physik soll nachgebildet werden Konzeptskizzen zum Rennspiel . . . . . . . . . . . . . . . . . . . . . . . . . . erste Studie zum Spielkonzept (Montage) . . . . . . . . . . . . . . . . . . . . Objektpositionen sind relativ zum Zentrum des Bezugsmarkers . . . . . . . . . Bestimmung der absoluten Objektposition zur Darstellung im Kamerakoordinatensystem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bei Ausfall des linken Markers wird der Offset bestimmt. . . . . . . . . . . . . Im Anschluss wird der neue Marker als Bezugspunkt verwendet. . . . . . . . . Schritt 1: Sollte zum gegenwärtigen Zeitpunkt noch kein Marker als Referenz benutzt werden, wird der erste sichtbare als Marker gewählt (der weiß umrahmte Marker ist der Bezugsmarker). . . . . . . . . . . . . . . . . . . . . . . . . . . Schritt 2: Kommen weitere Marker ins Bild, ändert sich der Referenz-Marker zunächst nicht. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Schritt 3: Befinden sich mehr als ein Marker im Zentrum des Bildes, ändert sich die Referenz nicht. Sollte jedoch der derzeitig gewählte Marker das Zentrum verlassen, wird der neue Referenzmarker der Marker, der dem Zentrum am nächsten und sichtbar ist. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bestimmung der neuen Objektposition bei Eigenbewegung . . . . . . . . . . . Richtungswechsel des Raumschiffs . . . . . . . . . . . . . . . . . . . . . . . . Bounding Box-Ausrichtung am obj-Koordinatensystem – nicht an cam . . . . Kollisionsprüfung an Toren über outside_hit und inside_hit . . . . . . . . . . . Punktabstand zu einem Polygon: abovePolygon() . . . . . . . . . . . . . . . . 12 14 14 15 16 18 18 23 24 24 25 27 29 29 30 31 32 32 33 34 35 37 38 39 7 Abbildungsverzeichnis 8 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10 Das Heads-Up-Display im Spiel . . . . . . . . . . . . . . . . . . Navigationshilfe mit Pfeilen . . . . . . . . . . . . . . . . . . . . Gegnerische Drohnen stören den Spieler . . . . . . . . . . . . . . Menüsteuerung über Handrückenmarker . . . . . . . . . . . . . . Werkzeug-Marker zur Manipulation: Modellauswahl per Drehung Drehen des Werkzeugs zum Anpassen der Tor-Größe . . . . . . . optimierte Orientierung durch Schlagschatten . . . . . . . . . . . Kollisionserkennung mit realen Objekten . . . . . . . . . . . . . Kollision mit realen Objekten, die unter dem Marker stehen . . . . Optische Verzerrung der Kamera . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 42 43 44 45 45 46 47 48 49 5.1 Verdeckung der augmentierten Objekte durch reale Gegenstände (Montage) . . 52 1 Einleitung Augmented Reality (AR) bedeutet soviel wie „erweiterte Realität“. Dabei handelt es sich um die Überlagerung realer Bilder (Fotos oder Videos) mit computergenerierten Bildern, welche sich abhängig von Position und Blickwinkel des Betrachters perspektivisch korrekt in die reale Szene einpassen. Meistens wird Echtzeit angestrebt, so dass für den Betrachter der Eindruck entsteht, die aus dem Rechner stammenden Bilder wären Teil der realen Welt.1 Ziel der Arbeit soll es sein, diese Technologie in einer konkreten Umsetzung kennenzulernen und zur Realisierung einer eigenen Applikation zu benutzen. Die Wahl fiel hierbei auf ein AR-Spiel. Das Konzept soll geplant, realisiert und verschiedene Interaktionsmöglichkeiten untersucht werden. 1 Nähere Informationen zu dieser Technologie und zu verwendeten Termini werden in dieser Ausarbeitung nicht gegeben. Die im Anhang genannten Quellen sollten als Referenz genügen. 9 1 Einleitung 10 2 Grundlagen der Arbeit 2.1 Verwendung vorhandener Komponenten Die Realisierung einer Augmented-Reality-Anwendung, die mit optischen Markern arbeitet, benötigt viele Komponenten. Neben der Darstellung der computergenerierten Bilder und dem Capturen des Kamerabildes muss die komplette Bildverarbeitung zur Erkennung und Verarbeitung der Musterfelder implementiert werden. Da es unmöglich wäre, all diese Komponenten im vorgegebenen Zeitraum selbst zu entwickeln, wurde beschlossen, auf vorhandene Software aufzubauen. Verschiedene Pakete bieten die nötige Funktionalität: etwa das Programm der Gruppe „The Essex Virtual Applications, Systems and Environments Laboratory“ [1] oder das „AR-Toolkit“ des „Human Interface Technology Labs Washington“ [2]. In dieser Arbeit wird letzteres verwendet. 2.2 Funktionsweise des AR-Toolkits 2.2.1 Übersicht Das Programmpaket ist in C++ geschrieben, für verschiedene Plattformen (Windows, Linux, SGI, MacOS, MatLab) erhältlich und komplett mit den Quellcodes für wissenschaftliche Zwecke kostenlos herunterlad- und einsetzbar[3]. Es umfasst alle grundlegenden Funktionen zur Umsetzung einer markerbasierten Augmented Reality-Anwendung – sowohl für optical als auch für video-see-through Head Mounted Displays (HMDs). Mitgelieferte Kalibrierungstools (auch mit Quellcode) erleichtern die Anpassung an verwendete Hardware (Kamera, HMD, Markermuster). 2.2.2 Programmablauf Die wichtigsten Arbeitsschritte sollen kurz erläutert werden. Diese werden bei jedem Durchlauf der Programmschleife wiederholt. Zunächst wird der nächste verfügbare Videoframe eingelesen und mit einem definierbaren Schwellwert binarisiert. Nach dieser Farbreduktion wird das Bild nach Rechtecken durchsucht und eine Liste aus allen gefundenen Elementen erstellt (Abb. 2.1 (rot markiert)). Dabei muss es sich aber nicht nur um den gewünschten Marker handeln - sämtliche Gegenstände im Bild, die eine „Rechteck-verwandte“ Form besitzen, können erkannt werden. Selbst eine geballte Faust oder Schattenwürfe an der Tastatur liefern gelegentlich Rechteck-Informationen. Diese fehlerhafte Erkennung stört jedoch im Normalfall nie, wie sich im Folgenden zeigen wird. 11 2 Grundlagen der Arbeit Für all diese gefundenen Rechtecke werden die Translation und Rotation abhängig zum Kamerakoordinatensystem bestimmt und gespeichert. Im Anschluss vergleicht das AR-Toolkit die Muster, die vortrainiert sind und die es erkennen soll, mit den vermeintlichen Mustern, die im aktuellen Frame in den Rechtecken liegen. Sind mehrere Übereinstimmungen vorhanden, entscheidet der Grad der Ähnlichkeit, welches Rechteck letztlich ausgewählt wird. Das heißt, ein Musterfeld darf nur einmal im Sichtbereich der Kamera vorkommen bzw. wird nur einmal erkannt. Eine zufällige rechteckige Form wird also an dieser Stelle aussortiert, da die Ähnlichkeit zu den gespeicherten Mustern selten groß genug ist. Zu den Rechtecken wird jeweils die Marker-ID gespeichert, sofern es eine Übereinstimmung gibt. Während des Programmabschnitts, in dem die Darstellung abläuft, kann aus der pro Rechteck gespeicherten Information die entsprechende Transformationsmatrix ausgelesen und zum Ausrichten der 3D-Objekte verwendet werden. Das AR-Toolkit zeichnet zunächst den aktuellen Videoframe als Hintergrund (bei optical-see-through fällt dieser Schritt weg) und überlagert diesem im Anschluss alle weiteren gerenderten 3D-Graphiken, deren Position und Rotation mit der gespeicherten Matrix multipliziert wird. Abbildung 2.1: Prinzipielle Arbeitsweise des AR-Toolkits in mehreren Schritten 12 2.2 Funktionsweise des AR-Toolkits Der Ablauf für jeden Frame eines einfachen Beispielprogramms beinhaltet dann nach der Initialisierung mindestens folgende Aufrufe des AR-Toolkits (Punkt 5 wird weiter unten exemplarisch vorgestellt, die Methoden sind ohne Parameter aufgeführt): 1. camera.grabFrame() liefert das aktuelle Bild 2. argDrawMode2D() „schaltet um“ in den Zeichenmodus für das Videobild 3. argDispImage() der aktuelle Frame wird angezeigt 4. arDetectMarker() Rechtecke werden gefunden und mit den vortrainierten Markern verglichen 5. Auswahl der richtigen Matrix (Vergleich der gespeicherten Marker-IDs) 6. argDrawMode3D() Umschalten in den OpenGL-Modus 7. argDrawCamera() Festlegen des glViewPorts 8. Laden der Matrizen und Zeichnen der 3D-Objekte 9. argSwapBuffers() am Ende der Programmschleife wird der neue Frame gezeichnet und der FrameBuffer gewechselt Die Speicherung der Marker-Informationen und der Matrizen erfolgt in AR-Toolkit eigenen Typen (Typedefs). An dieser Stelle sollen nur die wichtigsten Variablen und Methoden des ARToolkits erwähnt werden. Eine ausführliche Dokumentation über die verbleibenden Elemente liegt zwar leider auch beim HITLab nicht vor, doch liefern die Header-Dateien meist genügend Auskunft über die Funktionen. Zusätzlich ist das komplette Listing eines einfachen Beispielprogramms in Abschnitt 6.1 angefügt. Die zwei wichtigsten Strukturen des Toolkits sind in Abbildung 2.2 und 2.3 aufgeführt. Sie werden zum Verwalten der Marker- und Objekt-Informationen verwendet. ARMarkerInfo speichert die aktuellen Werte für einen im Bild gefundenen Marker (Ähnlichkeitswert (cf), Marker-ID (id), 3D-Koordinaten der Rechteck-Eckpunkte, ...). ObjectData_T enthält für jedes vordefinierte 3D-Objekt unter anderem die aktuelle Matrix zur Positionierung, die assoziierte Marker-ID (id), sowie einen als Boolean verwendeten Integer-Wert „visible“. Dieser gibt an, ob das Objekt derzeitig im Bild zu sehen ist (d.h. ob zur Zeit der mit dem Objekt verknüpfte Marker sichtbar ist). Verwendet man mehr als einen Marker in seinem Programm, kann man jeweils ein Array für obige Strukturen verwenden. Um in jedem Frame die aktuellen Werte geliefert zu bekommen, muss zunächst die Methode 13 2 Grundlagen der Arbeit typedef struct { char name[256]; int id; int visible; double marker_coord[4][2]; double trans[3][4]; double marker_width; double marker_center[2]; } ObjectData_T; Abbildung 2.2: Objektstruktur typedef struct { int area; int id; int dir; double cf; double pos[2]; double line[4][3]; double vertex[4][2]; } ARMarkerInfo; Abbildung 2.3: Markerstruktur arDetectMarker(dataPtr, thresh, &marker_info, &marker_num) aufgerufen werden. Ihr wird die Bildinformation (dataPtr), der zu benutzende Schwellwert für die Binarisierung (thresh im Bereich von [0,255]), sowie eine Referenz auf das ARMarkerInfo-Array und einen Integer-Wert marker_num übergeben. Nach dem Beenden dieser Methode enthält das Array die aktuellen Marker-Werte, und marker_num gibt an, wie viele Muster im aktuellen Frame gefunden wurden. Es kann mit einer Schleife geprüft werden, ob die gefundenen Muster zu den verwendeten Objekten gehören (Abb. 2.4). Man vergleicht die Objekt-Marker-ID mit der in marker_info gespeicherten ID. Werden mehrere Übereinstimmungen gefunden, entscheidet der höchste Ähnlichkeitswert (cf). Kann keine Übereinstimmung gefunden werden, wird das Objekt als nicht sichtbar definiert (object[i].visible = 0). Wurde ein Objekt hingegen erfolgreich entdeckt, wird die Methode arGetTransMat() bzw. arGetTransMatCont() aufgerufen, welche die Objektdaten (u.a. die Transformationsmatrix) aktualisiert. Nach diesem Update kann man die gespeicherten Matrizen nutzen, um die 3D-Objekte korrekt auszurichten. Anzumerken ist hier, dass ein Objekt die zuletzt erkannten Koordinaten behält, sollte es nicht gefunden werden; nimmt man etwa einen Marker aus dem Bild, so ist die aktuelle Position 14 2.2 Funktionsweise des AR-Toolkits for( i = 0; i < objectnum; i++ ) { k = -1; for( j = 0; j < marker_num; j++ ) { if( object[i].id == marker_info[j].id ) { if( k == -1 ) k = j; else { if( marker_info[k].cf < marker_info[j].cf ) k = j; } } } if( k == -1 ) { object[i].visible = 0; continue; } } if( object[i].visible == 0 ) { arGetTransMat( &marker_info[k], object[i].marker_center, object[i].marker_width, object[i].trans); } else { arGetTransMatCont(&marker_info[k], object[i].trans, object[i].marker_center, object[i].marker_width, object[i].trans); } object[i].visible = 1; number_of_visible_markers++; } Abbildung 2.4: Vergleich der gefundenen mit den gespeicherten Mustern 15 2 Grundlagen der Arbeit stets die veraltete. Eine Prüfung über (object[i].visible != 0) ist daher nötig, um nur gültige Werte abzufragen. 2.2.3 Kameraposition Das AR-Toolkit selbst setzt die Kamera stets in den Ursprung des internen Koordinatensystems. Sobald in der Methode argDrawMode3D() in den 3D-Modus geschaltet wird, wird auch die Kamera eingestellt. Der OpenGL-Viewport definiert sich durch die Größe des Kamerabildes (gImYsize und gImXsize) und einen Vergrößerungsfaktor (gZoom). Die Position der Kamera bleibt dabei unverschoben im Koordinatenursprung, wodurch sich eine Blickrichtung entlang der positiven z-Achse ergibt (siehe Abb. 2.5). void argDraw3dCamera( int xwin, int ywin ){ ... glViewport(0, gWinYsize-(int)(gZoom*gImYsize), (int)(gZoom*gImXsize), (int)(gZoom*gImYsize)); ... Abbildung 2.5: Kamera-Viewport und zwei Marker (schwarze Balken) im Blickfeld der Kamera mit Positionsänderung Bewegt der Anwender die Marker im Blickfeld der Kamera, ändern sich erwartungsgemäß auch deren Koordinaten. Wird stattdessen die Kamera selbst bewegt, während die Marker ihre Position behalten, ändern sich allerdings auch die Koordinaten selbiger. Alle im Bild befindlichen Marker verändern ihre Koordinaten in der Welt, auch wenn sie sich nicht bewegen. Die Position wird immer relativ zur Kamera neu bestimmt. Ein anderes Vorgehen wäre mit dem AR-Toolkit auch gar nicht möglich, da die Marker die einzigen Bezugspunkte zur realen Welt sind (die Kamera selbst wird nicht zusätzlich getrackt, 16 2.2 Funktionsweise des AR-Toolkits die Positionsbestimmung ist also nur über die Marker „inside-out“ möglich). Diese Tatsache spielt eine entscheidende Rolle beim Design des Spiels (Kapitel 3). 2.2.4 Installation des AR-Toolkits Im Folgenden sollen so knapp wie möglich die ersten Programmierschritte beschrieben werden. Die Arbeit ist Performance- und Kompatibilitätsgründen nur auf der Microsoft WindowsPlattform in C++ entwickelt worden und es wird daher nur auf diese eingegangen. Das Toolkit gibt es auf der Webseite des HITLabs [2] in allen bisher erschienen Versionen zum Download. Für Windows gibt es zwei Varianten. Eine greift auf das Microsoft VisionSDK und eine auf Microsofts DirectX zurück. Da das VisionSDK nicht mehr weiterentwickelt wird und die aktuellsten Versionen des AR-Toolkits stets auf DirectX aufsetzen, verwendet das Spiel letztere Variante. Zum Ausführen und Kompilieren benötigt man folglich das kostenlose DirectXSDK [6]. Jedes AR-Toolkit-Paket enthält neben einigen Beispiel- und den erwähnten Kalibrierungsprogrammen den kompletten Satz aller Quell- und Headerdateien sowie der einzubindenden Bibliotheken (Diese können selbstverständlich auch selbst aus den Quellen erstellt werden). Zur Verwendung der Toolkit-Funktionalität muss man in seinem Projekt einiges einbinden: 1. Das Include-Verzeichnis muss auf den mitgelieferten „include“-Ordner des Pakets und auf die DirectX-SDK Headerdateien verweisen 2. Als zusätzliche Bibliotheksordner muss der „lib“-Ordner des Pakets deklariert werden 3. Je nach AR-Toolkit-Version können die einzubindenden Bibliotheken variieren. Essentiell sind folgende: strmiids.lib, glu32.lib, glut32.lib, opengl32.lib, ARFrameGrabber.lib, libAR32.lib, libARgsub32.lib, dxguid.lib 4. Zum Ansteuern der 3D-Schnittstelle wird die GLUT verwendet, die mitgeliefert wird. Per Präprozessor-Befehl müssen folgende Headerdateien inkludiert werden: windows.h, GL/gl.h, GL/glut.h, AR/gsub.h, AR/ARFrameGrabber.h, AR/param.h, AR/ar.h Beim Toolkit sind bereits einige Marker als Bilddateien mitgeliefert, die man ausdrucken und mit den Beispielprogrammen direkt verwenden kann. Die VRML unterstützende Version des Toolkits benötigt neben einer Datei für die Kamerakonfiguration und den Dateien für die Marker weitere Dateien. Eine vrml_data speichert die Anzahl der zu erkennenden Marker und für jedes Muster einen Verweis auf eine weitere Datei für das 3D-Modell, sowie die Angabe über die zu verwendende Musterdatei, die Größe des Markers in Millimetern und einen Offset vom Mittelpunkt (zur Darstellung des 3D-Modells). Die Dateien, die zu den 3D-Modellen gehören, enthalten die Angabe über die zu verwendende VRML-Datei, sowie Informationen über eine zu benutzende Translation, Rotation und Skalierung. Zusätzlich werden Beleuchtungswerte gespeichert, die nur für das jeweilige Modell angewandt werden. 17 2 Grundlagen der Arbeit ######################################## # Anzahl der zu registrierenden Muster 2 #pattern 1 VRML Wrl/3dmodell1.dat # Extradatei für das VRML-Modell Data/pattern1.patt # dem Modell zugeordnetes Muster 40.0 # Kantenlänge des Markers in mm 0.0 0.0 # Offset zum Mittelpunkt #pattern 2 VRML Wrl/3dmodell2.dat Data/pattern2.patt 70.0 0.0 0.0 ######################################## Abbildung 2.6: Marker-Informationsdatei ######################################## Wrl/model.wrl # Angabe über die zu verwendende VRML-Datei 0.0 0.0 0.0 # Translation - x,y,z vom Mittelpunkt des Markers 0.0 0.0 0.0 0.0 # Rotation Winkel + Achse, zB. 90.0 1.0 0.0 0.0 2.5 2.5 2.5 # Skalierung x,y,z LIGHT DIR # gerichtete Lichtquelle 0.5 # Ambient 1.0 # Intensität 1.0 1.0 1.0 # RGB 0.0 0.0 1.0 # Richtung ######################################## Abbildung 2.7: Beispieldatei zu einem 3D-Modell 18 2.2 Funktionsweise des AR-Toolkits Das Vorgehen bei der nötigen Kamerakalibrierung und beim Erstellen eigener Marker ist ausreichend in der Dokumentation des HITLabs beschrieben. 2.2.5 Anmerkung zur verwendeten Version Begonnen wurde die Studienarbeit mit der Version 2.52, die bereits die Darstellung von VRMLModellen ermöglicht. Jedoch ist hier die Auflösung der Kamera auf 320x240 Pixel beschränkt. In einer späteren (inoffiziellen) Nachfolge-Version, die von der Technischen Universität Wien[7] online zur Verfügung gestellt wird, ist diese Beschränkung aufgehoben, so dass aus diesen zwei unterschiedlichen Versionen eine eigene entwickelt wurde. Dies war nötig, da die Variante der Virtual Reality Group in Wien keine VRML-Graphiken verarbeiten konnte. 19 2 Grundlagen der Arbeit 20 3 Entwicklung des Spiels 3.1 Planung eines interessanten Spiels Zunächst soll kurz untersucht werden, was Computerspiele im Allgemeinen interessant macht und den Benutzer motiviert. Da die Leistungsfähigkeit der PCs und der Spielekonsolen stetig wächst, steigen die Erwartungen der Spieler vor allem gegenüber der Graphik nahezu linear an. Vergleicht man aufwendig produzierte, kommerzielle Spiele mit Spielen eines älteren Jahrgangs, fallen zum Beispiel stets graphische Innovationen auf, die dem Spieler ein Anreiz sein sollen, das Programm zu spielen - respektive zu kaufen. Selbst für den Spielfluss uninteressante Änderungen (realistischerer Schatten, Detailgrad bei Gegenständen, die nichts zum Spielgeschehen beitragen) werden bestaunt und als motivierendes Element angegeben1 . Neben dieser Effektshow mit „noch besserer Graphik als in der letzten Version“ sind andere Möglichkeiten Interesse zu wecken beispielsweise ein völlig neuartiges Spielkonzept, was bereits durch seine Einzigartigkeit anziehend wirkt, oder umgekehrt ein bekanntes (an die reale Welt angelehntes) Thema umsetzt. Da bei Letzterem ein Abbild der realen Welt simuliert wird, ist das Prinzip und das Spielziel meist bekannt und eine Eingewöhungszeit nicht so lang, wie es bei einem neuen Spielkonzept der Fall wäre. Ist der Spieler begeistert an das Spiel herangegangen, kann es dennoch passieren, dass das Interesse an dem Werk schnell nachlässt. Das kann zum einen technische Gründe haben – etwa als zu schlecht empfundene Graphik, Programmfehler, unkomfortable Bedienung – oder auch am Konzept des Spiels oder der Story selber liegen. Neben technischen Aspekten sind also verschiedene inhaltliche Punkte zu beachten: • wird die Storyline gut fortgeführt? • gibt es unerwartete Wendungen? • existiert eine Steigerung im Spielverlauf? • kann der Spieler in die Welt eintauchen? • ist ein guter Spannungsbogen/Cliffhanger vorhanden? • wird der Spieler für seine Aktionen belohnt? • gibt es humoristische Einlagen oder andere unterhaltende Elemente in ausreichender Anzahl? 1 nicht-repräsentative Umfrage des Autors 21 3 Entwicklung des Spiels • gibt es genügend andere motivierende Faktoren im Spiel? (z.B. Geschwindigkeitsrausch oder die Befriedigung des „Jäger und Sammler“-Prinzips) Gibt es im Spielverlauf keine Veränderungen, geht der Spielspaß verloren, und das gesamte Programm war eine Eintagsfliege. Der Aufwand dürfte sich kaum gerechtfertigt haben. Bei der Frage, waelche Art Spiel die Augmented Reality-Technologie am besten in Szene setzen würde, mussten neben obigen Überlegungen zusätzlich verschiedene weitere Aspekte berücksichtigt werden: 1. das Spiel soll nicht zu komplex sein – es muss den Benutzer schnell in seinen Bann ziehen können und unterhalten (zunächst soll die Technologie im Vordergrund stehen und nicht eine komplexe, große Geschichte) 2. es soll die Vermischung der virtuellen und der realen Welt gut realisieren und sie im Spielprinzip und bei der Interaktion möglichst effektiv ausnutzen 3. die Kosten sollen möglichst gering sein, bzw. eine Benutzung ohne teure Head-MountedDisplays u.ä. ist wünschenswert 4. es soll trotzdem noch genügend Raum bieten, um eine interessante Spielgestaltung (verglichen mit „normalen“ Computer-Arcade-Spielen) zu ermöglichen 5. der Spielfluss sollte möglichst stabil sein – auch wenn das Tracking für Bruchteile vorübergehend aussetzt 3.2 Angestrebtes Spielkonzept Das Augenmerk bei der Entwicklung der Spielidee lag vor allem auf den letztgenannten fünf Punkten. Die Technologie soll möglichst effektiv genutzt werden. Ein durchschnittliches Computerspiel, das nur zufällig auf Marker projiziert wird (statt auf den Bildschirm) und die reale Umgebung gar nicht mit einbezieht, wäre nur die zweite Wahl. Da durch die Benutzung des AR-Toolkits die Kosten fest eingegrenzt waren (vorerst das Arbeiten mit einer einfachen Webcam, den selbst ausgedruckten Papier-Markern und später die Benutzung eines HMDs) klärt sich Punkt 3 von selbst. Mir waren von den übrigen Punkten die Einbeziehung des realen Raums und die Einfachheit des grundlegenden Spielprinzips am wichtigsten. Die ersten Ideen beschränkten sich meist auf nur einen Marker, der entweder vor dem Spieler auf dem Tisch liegen sollte oder den der Spieler in die Hand nehmen muss. Die Metapher eines normalen Brettspiels, welches man am Wohnzimmertisch mit Freunden spielen kann, sollte benutzt werden, um ein AR-Erlebnis aufzubauen. Der Vorteil dieses Systems liegt in der Sicherheit des Trackings, da nur ein großer Marker benötigt wird und auch keine Verwechslungen beim Tracking entstehen. Die Position ist fest und der Betrachter sitzt etwa immer im selben Winkel zum Marker. Gelegentliches Annähern oder Herumgehen, um das Spielfeld aus einem anderen Blickwinkel zu betrachten, stören nicht. Das Bild bleibt stabil und ermöglicht die Konzentration auf das eigentliche Spielgeschehen. 22 3.2 Angestrebtes Spielkonzept Somit könnte man ein klassisches Brettspiel ins Dreidimensionale erheben (Spielfelder können sich in den Himmel erstrecken und so mit normalen Brettspiel-Materialien normalerweise niemals konstruierbare Welten entstehen lassen) und zusätzlich mit Anweisungen, Musikeffekten und Animationen anreichern. Gleichzeitig kann eine KI eingebunden werden, oder man hat die Möglichkeit über das Internet mit einem Freund zu spielen, der zu Hause vor seinem „Brettspiel“ sitzt. Der Benutzer trägt dann bestenfalls nur noch das HMD mit Kopfhörern und schiebt einige Marker auf dem Tisch hin und her. Der dahinter rechnende PC verschwindet bestenfalls ganz aus der Wahrnehmung des Benutzers. Monitor, Tastatur und Maus sollen bei der Bedienung überflüssig sein (Abb. 3.1). Abbildung 3.1: Der Benutzer trägt ein HMD und arbeitet mit Markern – der PC verschwindet c aus dem Blickfeld (Foto HITLab[9]) Für die Studienarbeit fiel die Wahl aber gegen die Brettspiel-Variante, da diese Idee zu viel Gamedesign enthalten hätte und zu wenig Tracking benötigt, welches aber ausführlicher untersucht werden wollte. Die Einbeziehung der realen Welt in das Spielgeschehen ist auch nicht sehr groß. Der einzige Vorteil läge tatsächlich darin, nicht vor dem Rechner sitzen zu müssen und die Blickposition durch reale Kopfbewegung vorzugeben (statt durch Maus, Joystick, Tastatur). Die nächste Variante bietet mehr Immersion. Ein Labyrinth-Spiel soll auf einem großen Marker dargestellt werden. Durch diese erscheinenden Räume muss der Benutzer eine Kugel steuern, indem er den Marker in die Richtung neigt, in die die Kugel rollen soll. Dadurch erreicht man eine äußerst intuitive Eingabe. Das Murmel-Labyrinth-Prinzip weckt Erinnerungen (an das Holzlabyrinth aus der Kindheit), ist vertraut und kann gut durch verschiedene Level, Animationen und Sounds zu einem spannenden Erlebnis werden. Allerdings wäre hier der einzige Vorteil von AR die intuitive Eingabe gewesen. Das Spiel selber erscheint immer auf dem Marker, den man direkt vor sich hält. Der restliche reale Raum wird gar nicht mit einbezogen und auch nicht mehr wahrgenommen. Hätte man beispielsweise einen Joystick mit Trägheitssensor, wäre das Ganze sogar eleganter, da das Tracking bei Verdeckung oder schlechten Lichtverhältnissen nicht ausfallen könnte. Die Benutzung der optischen Marker bietet keinen Vorteil. 23 3 Entwicklung des Spiels Abbildung 3.2: Skizzen zur Brettspiel-Metapher-Erweiterung in die dritte Dimension Abbildung 3.3: Der Marker dient als Eingabegerät und die reale Physik soll nachgebildet werden Das angestrebte Spielprinzip versucht daher, vor allem den realen Raum, in dem gespielt wird, in das Spielgeschehen zu integrieren. Es musste eine alles beeinflussende Entscheidung getroffen werden: Soll der Benutzer die Marker frei positionieren dürfen oder sollen sie im Raum fest fixiert angebracht werden? Beides hat gewisse Vor- und Nachteile. Letztere Variante würde es etwa ermöglichen, den realen Raum in der 3D-Welt nachzubilden und die Position des Spielers in dieser virtuellen Welt über das Tracking zu bestimmen. Man würde also die reale Welt im Rechner modellieren und feste Punkte definieren, wo Marker in dieser Welt zu liegen haben. Erscheint dann ein Marker im Sichtfeld der Kamera, ist die Position des Betrachters eindeutig bestimmt. Gleichzeitig könnte man so eine sehr genaue Reaktion auf die realen Objekte simulieren. Modelliert man einmalig den realen Raum im Computer und speichert die Informationen im Programm, können z.B. Verdeckungen und Kollisionen mit realen Objekten sehr gut realisiert werden. 24 3.2 Angestrebtes Spielkonzept Der Nachteil an dieser Version ist natürlich, dass die Informationen über den realen Raum vorab einmal gespeichert werden müssen. Der Benutzer kann nicht in jedem beliebigen Raum das Spiel benutzen und somit den „Level-Aufbau“ nicht variieren. Eine Möglichkeit zur Veränderung des Spielfelds wäre allerdings denkbar. Der Benutzer verteilt im mit Markern (die zur Positionsbestimmung des Spielers dienen) bestückten Raum weitere Musterfelder, die am Anfang des Spiels registriert werden und entsprechende Objekte an den übergebenen Koordinaten in der virtuellen Welt erscheinen lassen. Nach der Initialisierungsphase des Spiels könnte der Benutzer also alle selbst verteilten Marker wieder entfernen, da die 3D-Koordinaten dem Programm nur einmal mitgeteilt werden müssen. Danach genügen die fest installierten Felder zur Blickpunktbestimmung. Auf diese Art könnte der Benutzer dem Programm neue reale Gegenstände im Raum „beibringen“ und speichern lassen. Wegen dieser beschriebenen Komplexität bzw. Unhandlichkeit und dem Wunsch nach einem komplett frei bestimmbaren Spielfeld, fiel die Wahl auf die andere Version. Der reale Raum ist dem Programm nicht bekannt. Als Referenz dienen nur die Marker, die aber teilweise Aufschluss über Objekte im realen Raum liefern können (z.B. liegt ein Marker immer auf einer Fläche, woraus folgt, dass auf selber Höhe eine Kollision erfolgen muss – eine Bezug zur realen Grundlage wird dadurch also letztlich doch hergestellt). Nach dieser Entscheidung war das Konzept relativ schnell gefunden. Die Marker sollen eine Rennstrecke definieren, indem über ihnen eine verbindende Bahn aufgespannt wird oder auf jedem Marker ein Tor erscheint, welches der Spieler durchqueren muss. Abbildung 3.4: Konzeptskizzen zum Rennspiel Die Rennstrecke, die aufgespannt wird, hätte für den Benutzer einen starken Wiedererkennungswert, da das Spiel wie eine Carrera-Bahn funktionieren würde – mit dem Vorteil, dass man das Fahrzeug komplett frei steuern könnte und die Strecke nicht zusammensteckt, sondern durch Verschieben der Marker festläge. Das einzige Problem bei dieser sonst sehr interessanten Idee ist die Beschränkung durch das optische Tracking. Ist ein Marker nicht im Bild, fällt sofort ein Teil der Strecke aus, da die Bahn zwischen je zwei Markern aufgespannt wird. 25 3 Entwicklung des Spiels Um dieses Problem zu umgehen, hätte man sicherlich die letzte Position (in Relation zu den noch sichtbaren Markern) zwischenspeichern können, um so ein stabiler arbeitendes Programm zu erhalten. Interessant wäre an dieser Version auch das dynamische „Verbiegen“ der Strecke durch das Verschieben der Marker. Die aufgespannte Bahn könnte mit Kurven (Bezierkurven, Splines) umgesetzt werden, und das Bewegen der Muster hätte eine in Echtzeit realisierte Anpassung zur Folge. Doch da diese erste Variante wieder weitere Probleme nach sich ziehen würde (zu schnelle Kopfbewegungen, Latenz bei der Darstellung und dadurch bedingter Ausfall von Streckenabschnitten), wurde die zweite ausgewählt: auf je einem Marker erscheint ein einzelnes Tor. Der Spieler muss alle Tore im Level in vorgegebener Reihenfolge durchqueren. Fällt ein Marker aus, verschwindet nur der eine Streckenposten, der unabhängig von den anderen funktioniert. Der einzige Nachteil beim Ausfall ist, dass der Spieler das nicht sichtbare Objekt nicht ansteuern bzw. durchqueren kann. Als Szenario wurde ein Weltraumrennen festgelegt, bei dem ein Raumschiff gesteuert werden muss. Dies passt zum einen besser zu der neuen verwendeten Technologie und ermöglicht es auch, sich frei im 3D-Raum zu bewegen (anstatt nur auf dem Boden). Der Spielspaß mit dem ferngesteuerten Auto wird so im 21. Jahrhundert zum Vergnügen mit dem eigenen, ferngesteuerten Raumschiff. Im Spielprinzip vorgesehen ist, dass der Spieler zu Beginn alle Marker im Raum verteilt, so dass stets zwei im Blickfeld der Kamera liegen (siehe unten). Die Musterfelder auf denen später Tore erscheinen sollen, können auf Tischen, Gläsern, an der Wand, der Decke, usw. angebracht werden. Der Spieler bestimmt so individuell bei jedem Neustart die Strecke durch sein Wohnzimmer, seine Küche, etc. Das Spiel umfasst verschiedene Marker. Einige stecken die Rennstrecke ab, andere haben eine spezielle Funktion und definieren beispielsweise die Startposition der Raumschiffe. Nach dem Verteilen beginnt die Partie (es ist keine zusätzliche Konfiguration nötig, der Spieler muss nur die Startposition im Blickfeld haben). Um eine Runde abzuschließen, muss der Spieler alle Tore durchqueren. Raumschiffe – vom Computer oder von menschlichen Personen gesteuert – treten im Rennen gegeneinander an, und der schnellste Spieler gewinnt nach einer festen Anzahl von Runden. Zusätzlich soll es Gegenstände geben, die abseits der Strecke erscheinen. Sammelt man sie ein, erhält man Punkte oder Upgrades (schnelleres, wendigeres Schiff, ...) als Belohnung. Im Arcade-Modus wird umgekehrt nicht nach Runden gespielt sondern auf Zeit. Der Spieler versucht, möglichst viele Runden zu fliegen und Punkte zu sammeln. Die verbleibende Zeit läuft stetig ab und kann nur durch das Abschließen einer Runde oder das Einsammeln von Gegenständen wieder aufgestockt werden. Neben den Raumschiffen der anderen Spieler verhindern herumschwirrende Drohnen das einfache Abfliegen der Strecke. Bei Kontakt mit dem Schiff verursachen sie Schaden, so dass je nach Kapazität der Schilde der Spieler schon nach wenigen Treffern aus dem Rennen sein kann. Neben (hoffentlich) nervenaufreibenden Ausweichmanövern kann man die Drohnen auch mit seinem Laser in Vakuum auflösen. Je nach Ausstattung des Raumschiffs verursacht der Laser mehr oder weniger Schaden und kann häufiger oder seltener abgefeuert werden. 26 3.3 Implementation des Spielprinzips Abbildung 3.5: erste Studie zum Spielkonzept (Montage) Bestimmte Punkte-Grenzen bringen Extraleben oder verbessern das Raumschiff in seiner Wendigkeit, Stabilität oder Geschwindigkeit. Die gespeicherte Highscore lässt die Motivation entstehen, besser als andere spieler sein zu wollen. 3.3 Implementation des Spielprinzips Während der Implementation des Spiels mussten viele verschiedene, unabhängige Problemstellungen betrachtet werden. Nach der Einarbeitungsphase in das AR-Toolkit galt es die einzelnen Module umzusetzen. Näher beleuchtet werden hier nur die Raumschiffsteuerung mit Joystick-Integration, die Positionsbestimmung bei mehreren Markern und die Kollisionserkennung – mit der jeweils nötigsten Mathematik. Die Modellierung der Spielobjekte (es wurde 3DSMax benutzt bzw. zwei Raumschiff-Modelle aus dem Internet „geliehen“ und angepasst), die Integration von Soundausgabe (DirectMusic), viele kleinere Probleme und das generelle Klassen-Design werden nicht näher beschrieben. 27 3 Entwicklung des Spiels 3.3.1 Koordinatenbestimmung für Raumschiffe und Levelobjekte Vorgehensweise Wie in Kapitel 2.2.3 beschrieben, legt das AR-Toolkit die Kamera stets in den Ursprung des OpenGL-Koordinatensystems. Es galt zu klären, wie Objektveränderungen in der Welt - durch das Verschieben der Marker durch den Benutzer oder die Änderung des Blickwinkels und der Kameraposition - zu behandeln sein sollen. Mehrere Möglichkeiten ein Koordinatensystem für das Spiel aufzustellen mussten verglichen werden. Die erste Idee beruht auf dem Prinzip eines Referenz-Markers2 , der immer im Bild sein muss, um die Kameraposition im Weltkoordinatensystem zu ermitteln. In diesem Fall wäre der Ursprung der Welt im Referenz-Marker und die Kameramatrix würde sich durch den Blickwinkel auf diesen ermitteln. Alle auf weiteren Markern erscheinenden Objekte wären dann in Abhängigkeit vom ersten Marker zu setzen. Vorteilhaft an dieser Variante ist die Unabhängigkeit von der Kamera. Die Welt liegt in ihrem eigenen Koordinatensystem und der Blickwinkel auf die Welt wird zusätzlich durch die Beziehung zwischen Referenz-Marker und Kameraposition festgelegt. Der große Nachteil hierbei ist allerdings, dass dieser Bezugspunkt niemals verdeckt sein darf. Ist dies doch der Fall, „fällt die ganze Welt aus“. Auf der anderen Seite würde dieses Konzept es wiederum ermöglichen, alle zusätzlichen Marker nach der Aufbauphase des Levels – nachdem das Programm die Positionen der einzelnen Objekte registriert hat – vom Tisch zu nehmen und somit weniger störende reale Objekte (d.h. Marker) im Blickfeld zu sehen. Zwei Aspekte haben mich dazu bewogen, nicht obiges, sondern das im Folgenden beschriebene Prinzip anzuwenden. Der erste Grund, der dagegen spricht, ist technischer Natur, der zweite entsteht durch das Spielkonzept. Technisch problematisch ist die „Ein-Marker-Variante“, da die Erkennung der Muster auf größere Distanz sehr ungenau werden kann, was oft zum Ausfall oder zu falscher Positionsbestimmung führen würde. Sollte in einem recht großen, realen Raum gespielt werden, könnten die virtuellen Objekte (nach der Aufbauphase) immer nur an einem Marker ausgerichtet werden. Das jedoch würde bedeuten, dass eventuell bei variierender Kameraposition die weiter entfernten virtuellen Objekte ihre vorbestimmte Position nicht mehr genau halten. Da der Referenz-Marker fälschlicherweise um ein paar Grad gedreht erkannt werden könnte, was sich bei größeren Entfernungen bereits zu einem recht unangenehmen Fehler aufsummieren würde, misslänge die Positionierung des virtuellen Objektes. Neben diesem wichtigen Aspekt muss auch noch das Spielprinzip berücksichtigt werden. Die Idee sieht vor, dass der Benutzer mit einem HMD und dort integrierter Kamera die Szene betrachtet und folglich die Kameraposition variieren kann. Der Spieler soll die Möglichkeit haben sich frei umzusehen und den Level durch seinen realen Raum zu legen – auch über so große Distanzen, dass nicht immer alle Marker im Bild liegen müssen. Genau dieser Ansatz führt jedoch dazu, dass das Referenz-Marker-Prinzip scheitern muss. Möchte der Benutzer etwa einen Kreisparcours aus den Markern abstecken und in deren Mitte stehen, sind vermutlich die meiste Zeit nur zwei oder drei Marker im Bild (der Betrachter lässt seinen Blick langsam im Kreis schweifen). Dies würde bedeuten, dass man mehrere Referenz2 oder mehrerer, was die Stabilität und Genauigkeit steigern könnte 28 3.3 Implementation des Spielprinzips Marker benötigen würde, deren Positionen zu Beginn komplett ermittelt werden müssten. Im Anschluss kann bei Ausfall der Bezugspunkt auf den neu erkannten wechseln. Um diese zusätzlichen Marker (als Weltkoordinaten-Referenz) zu vermeiden und das angesprochene Spielprinzip einfach umsetzen zu können, werden die Objekt-Marker direkt benutzt, um die Positionen der Raumschiffe über wechselnde Bezugsmarker gleich zu halten. Neben dem OpenGL-Koordinatensystem cam, welches an der Kamera ausgerichtet ist (siehe Abschnitt 2.2.3), wird ein zweites Objektkoordinatensystem obj zur Positionsbestimmung der Spielobjekte benutzt. Für alle sich in der Welt bewegenden Gegenstände (Raumschiff, Gegner, Raketen, usw.) werden die Positionen mit Koordinaten (~r) in diesem Koordinatensystem verwaltet (Abbildung 3.6). Dabei sind in diesem die z-Achse die senkrechte und die x- und y-Achsen die waagerechten. Abbildung 3.6: Objektpositionen sind relativ zum Zentrum des Bezugsmarkers Abbildung 3.7: Bestimmung der absoluten Objektposition zur Darstellung im Kamerakoordinatensystem Erst bei der Darstellung wird für jedes Objekt auf die gespeicherten Koordinaten die Transformationsmatrix m ~ 1 des Markers aufaddiert (Abbildung 3.7). Für die Kollisionen untereinander werden nur die obj-Koordinaten verwendet, während für die Prüfung mit den Toren die camWerte miteinander verglichen werden müssen (Näheres hierzu in 3.3.5). 29 3 Entwicklung des Spiels rabsolut ~ =m ~ 1 + ~r Sollte ein Marker ausfallen, muss eine „Übergabe“ stattfinden, so dass die Objekte weiterhin an derselben Position stehen bleiben: m ~ 1 wird zum Zeitpunkt des Ausfalls durch einen neuen Vektor m ~ 2 ersetzt. Da aber die Position der Objekte relativ zum Ursprung des neuen Markers liegen würde, muss ein Offset mof~f set bestimmt werden. Um diesen zu ermitteln, wird die Differenz zwischen alten und neuen Marker-Vektor bestimmt und auf den neuen Vektor addiert. Der Offset wird stets mitgeführt, so dass die verwendete Formel zur Bestimmung der absoluten Koordinaten wie folgt aussieht (Abb. 3.8 und 3.9): mof~f set = m ~1 − m ~2 rabsolut ~ =m ~ 2 + ~r + mof~f set m ~ 1 steht hier generell für den alten und m ~ 2 für den neu verwendeten Marker. Bewegt sich das Objekt, wird nur der Vektor ~r verändert. Bleibt es hingegen stehen, kann sich – solange kein Marker-Wechsel stattfindet – nur der Vektor m ~ 2 ändern. Die Position bleibt also immer in Relation zum gewählten Marker. Vorteilhaft an dieser Variante ist neben dem angestrebten Freiheitsgrad (ein Marker im Bild genügt bereits, um das Spiel zu bedienen und Punkte zu sammeln) die erhöhte Stabilität. Fällt ein Marker aus, weil beispielsweise der Benutzer mit der Hand im Bild ist und genau einen Marker verdeckt, bleiben die Objekte stets an der richtigen Stelle - natürlich nur solange wie mindestens ein Marker übrig ist. Abbildung 3.8: Bei Ausfall des linken Markers wird der Offset bestimmt. 30 3.3 Implementation des Spielprinzips Abbildung 3.9: Im Anschluss wird der neue Marker als Bezugspunkt verwendet. Verfeinerung Startet das Spiel, wird die Anfangsposition des Raumschiffs automatisch in Relation zum ersten erkannten Marker gesetzt. Dieser bleibt vorerst der Bezugspunkt – auch wenn weitere Marker im Bild erscheinen sollten. Erst wenn der derzeitig verwendete Marker ausfällt, wird die oben beschriebene Neuberechnung des Offsets durchgeführt. Um die Sicherheit bei der Erkennung und somit die Stabilität des Programms zu erhöhen, wird zusätzlich geprüft, ob der Bezugsmarker das Zentrum des Kamerabildes verlässt. Ist dies der Fall, findet ein Wechsel statt, sofern ein anderer Marker weiter im Zentrum liegt. Dieses Prinzip wurde integriert, da bei einigen Kameras die Linsenverzerrung am Rand des Bildes bereits so deutlich ausgeprägt war, dass das AR-Toolkit bei der Postionsbestimmung sehr ungenau wurde. Die nachfolgenden Bilder veranschaulichen die Idee (Abb. 3.10 bis 3.12). 31 3 Entwicklung des Spiels Abbildung 3.10: Schritt 1: Sollte zum gegenwärtigen Zeitpunkt noch kein Marker als Referenz benutzt werden, wird der erste sichtbare als Marker gewählt (der weiß umrahmte Marker ist der Bezugsmarker). Abbildung 3.11: Schritt 2: Kommen weitere Marker ins Bild, ändert sich der Referenz-Marker zunächst nicht. 32 3.3 Implementation des Spielprinzips Abbildung 3.12: Schritt 3: Befinden sich mehr als ein Marker im Zentrum des Bildes, ändert sich die Referenz nicht. Sollte jedoch der derzeitig gewählte Marker das Zentrum verlassen, wird der neue Referenzmarker der Marker, der dem Zentrum am nächsten und sichtbar ist. 3.3.2 Raumschiffsteuerung Die Steuerung des Raumschiffs stellt die wesentliche Komponente für ein angenehmes, intuitives und unterhaltsames Spiel dar. Ist die Bedienung zu ungenau oder entspricht sie nicht den Erwartungen des Benutzers, so wird dieser schnell aufgeben und das Interesse an dem Spiel verlieren. Die Steuerung wurde daher so umgesetzt, dass der Benutzer selbst wählen kann, wie er navigieren möchte: die „normale“ Flugsimulator-Bedienung, die der Benutzer evtl. schon aus anderen Computerspielen kennt, in denen er meist die Sicht aus dem Cockpit einnimmt oder aber die Kamera immer hinter dem Schiff herfliegt, führt gelegentlich zu Irritationen beim Benutzer. Da man – wie bei einem ferngesteuerten Auto – meist von derselben Position aus auf das Schiff schaut, hat man als Orientierung nur die Raumschiffgraphik selbst. Es muss erkennbar sein, welche Richtung „vorne“ ist und wo es folglich bei Beschleunigung hinfliegen wird. Der Spieler soll das Raumschiff per Tastatur oder Joystick steuern können, wobei man zunächst vier Tasten (oder zwei Achsen) zur Raumschiffausrichtung und weitere zum Einstellen der Beschleunigung besitzen soll. Die Steuerung im Dreidimensionalen stellt eine zusätzliche Herausforderung dar, bei der der Benutzer die Übersicht schnell verlieren kann, wenn er nicht nur parallel zum Boden fliegt, sondern zusätzlich die Richtung des Raumschiffs um ein paar Grad nach oben oder unten lenkt. Die Nase des Schiffs neigt sich und in diesem Fall würde dann eine Rechtsdrehung – relativ zur Raumschifforientierung zwar korrekt, aber für den Benutzer eher unerwartet – eine Richtungsänderung nach oben oder unten bewirken können. Mathematisch zusammengefasst: je mehr sich der Up-Vektor des Raumschiffs von der senkrecht stehenden Achse der Welt unterscheidet, desto mehr wird der unerfahrene Benutzer verwirrt. Um dieses Problem zu umgehen und neuen Spielern einen schnellen Einstieg zu ermöglichen, wurde neben der üblichen Raumschiff/Flugzeug-Bedienung die Möglichkeit integriert, das Schiff mit zwei weiteren Tasten entlang der senkrechten Achse steigen und fallen zu lassen. Jetzt kann der Anwender einfacher (sozusagen im Zweidimensionalen) steuern und nur bei Bedarf die 33 3 Entwicklung des Spiels Abbildung 3.13: Bestimmung der neuen Objektposition bei Eigenbewegung Höhe anpassen, sofern es der Parcours erfordert. Dies ermöglicht ein schnelleres Verstehen der Bedienung, da vermutlich jeder Anwender schon einmal ein ferngesteuertes Auto bedient haben dürfte (bzw. diese Art der Navigation intuitiv genug ist). Um die Steuerung des Schiffs interessanter zu gestalten, gibt es verschiedene Faktoren, die den Spielspaß erhöhen sollen. Zum ersten den Trägheits- bzw. Wendigkeitsfaktor des Schiffs, zum zweiten Reibung (die natürlich im Weltraum eigentlich nicht existiert) und zum dritten (optional) Gravitation. Die Prinzipien, die zur Implementation angelegt wurden, werden die folgenden Graphiken erläutern. Die Neupositionierung und Beschleunigung des Raumschiffs erfolgt über einen Richtungsvektor d~ und vier Skalare: die aktuelle Geschwindigkeit vcur , die vom Spieler vorgegebene Geschwindigkeit vset , den konstanten Beschleunigungswert des Raumschiffs acc und die Reibung f r. Zusätzlich ist natürlich der Positionsvektor ~r des Objekts nötig (Abb. 3.13). Die Folgeposition rneu ~ wird bestimmt: rneu ~ = ~r + d~ ∗ vcur Bei jedem Durchlauf wird die Geschwindigkeit nachreguliert: zum einen bedingt durch die Geschwindigkeitsvorgaben des Spielers vset und zum anderen durch die Reibung f r. Die Variable sign wird auf 1 gesetzt, sofern vset positiv ist; andernfalls erhält sie den Wert −1. vcur = vcur + (acc − f r) ∗ sign Bremst der Spieler, nimmt die Beschleunigungsvorgabe einen negativen Wert an und das Raumschiff bremst ab – bzw. fliegt rückwärts sobald vcur selbst negativ wird. Im Anschluss muss die Beschleunigung vcur noch in den Bereich vset geclippt werden, da das Schiff maximal so schnell fliegen darf, wie es der Benutzer vorgegeben hat. Dieses Prinzip ermöglicht bereits eine natürlich wirkende, lineare Beschleunigung, die für unsere Raumschiffsimulation völlig ausreichend ist. Möchte der Benutzer das Raumschiff in andere Bahnen lenken, wird zur Richtungsänderung folgende Rechnung verwendet. Benötigt wird hier noch der Up-Vektor des Schiffs (up), ~ ein Wendigkeitswert (ag), sowie der Wert set, um den der Benutzer das Raumschiff gelenkt haben 34 3.3 Implementation des Spielprinzips Abbildung 3.14: Richtungswechsel des Raumschiffs möchte (zwischen -1 und 1 (0 = keine Richtungsänderung)). ~ wird ermittelt (Abb. 3.14): Die neue Richtung des Raumschiffs dneu ~ = d~ × up dir ~ ~ = dir ~ + (1 − ag ∗ set) ∗ (d~ − dir) ~ dneu Da der Wendigkeitswert ag im Spiel zwischen 0.005 und 0.020 liegt, wird das Raumschiff maximal um ein paar Grad pro Aufruf weitergedreht. Diese Änderung kann natürlich so lange anhalten, wie der Benutzer die Vorgaberichtung abweichend von der aktuellen Flugrichtung angibt. Durch die zusätzliche Neubestimmung der Raumschiffposition bei jedem Programmdurchlauf beschreibt das Schiff beim Lenken einen Bogen und fliegt keine „Ecken“. Die Gravitation bewirkt bei jedem Durchlauf zusätzlich eine Positionsverschiebung des Objekts entlang der senkrechten Achse im Weltkoordinatensystem, die der Spieler durch ein Ansteigen kompensieren muss – andernfalls fällt das Schiff so lange bis sich in der Welt eine Kollision zwischen Schiff und anderen Levelobjekten ereignet (siehe Kapitel 3.3.5). 3.3.3 Joystick Durch die einfache Skalierung der Lenkung und die Geschwindigkeitsvorgabenvariable (set) war es einfach, die digitale Steuerung per Tastatur um eine analoge mit einem Joystick zu erweitern. Die Joystick-Integration wurde über die in der „windows.h“-Bibliothek vorhandenen Joystick-Methoden realisiert. Angesprochen werden können nur Standard-Joysticks (maximal zwei Stück, über den Midi-Port der Soundkarte bzw. einen extra Game-Port) mit drei Achsen und bis zu vier Knöpfen. Die Variablen vom Typ JOYCAPS und JOYINFO liefern Informationen über die Minima und Maxima der Achsen, sowie den aktuellen Status (x-, y- und z-Wert, Buttons). Nach dem Aufruf von joyGetDevCaps() und joyGetPos(), liegen in der JOYINFO-Variable die aktuellen Werte vor. Die x, y und z-Werte liegen dabei im int-Bereich von [0, 65535], und werden von mir in den float-Bereich zwischen -1 und 1 abgebildet. Dies ermöglicht die einfache 35 3 Entwicklung des Spiels Erweiterung der digitalen Raumschiffsteuerung per Tastatur (dort waren nur die Werte -1, 0 und 1 möglich). Joystick benutzende Spieler sind dadurch natürlich eindeutig im Vorteil. 3.3.4 Tor-Objekte Für jedes Tor müssen neben Informationen für das Auswerten der Spiel-Ereignisse (Tor-Nummer (für die Reihenfolge im Level), Punkte, ...) auch Werte für die Realisierung einer effizienten Kollisionsprüfung gespeichert werden. Die kollisionsrelevanten Daten sind folgende: • innerer und äußerer Radius des Tores (2 Skalare) • Rechteck-Koordinaten für die Bodenplattform des Tors (4 Vektoren) • Rechteck-Koordinaten für eine weitere Plattform (4 Vektoren) • 3 Vektoren zur Ausrichtung des Tores (Up, Front, Left) Jedes Tor hat eine definierte Bodenplattform, da es stets auf einem Marker steht und somit eine Kollisionsfläche fest vorgegeben ist. Spezielle Tore wie die Startfläche können weitere Ebenen definieren, die über der Bodenfläche liegen. Für jedes Tor werden die Vektor-Daten jeweils zwei Mal gespeichert. Zunächst werden sie in relativen Angaben definiert, bei denen der Mittelpunkt des Tores im Koordinatenursprung liegt. Diese Daten werden nur ein einziges Mal im Programm festgelegt. Die zweite Version sind diese Vektoren ungewandelt in das Koordinatensystem cam der Kamera: auf die relativen Werte wird die jeweilige Matrix des Markers, auf dem das Tor erscheint, aufmultipliziert. Diese Aktualisierung geschieht leider zwangsläufig bei jedem Darstellungsdurchlauf und wird für die Kollisionsprüfung benötigt. 3.3.5 Kollisionserkennung Ein in fast allen 3D-Anwendungen sehr wichtiger Teil ist die Kollisionserkennung zwischen den virtuellen Objekten. In der Augmented Reality sollte es aber zusätzlich Kollisionen mit realen Objekten geben, um den Eindruck zu stärken, dass die Computer generierten Objekte mit der realen Welt interagieren. Im Folgenden werden zunächst die Ansätze zur Kollision unter den virtuellen Gegenständen und danach kurz die Ansätze zur Erkennung realer Objekte beschrieben. Da das Spiel recht objekt- bzw. polygonarm ist, sind aufwendige Hierarchien zum Testen der Kollision unnötig. Das Spielprinzip sieht zudem nur vor, dass sich die Raumschiffe bewegen und keine physikalischen Rückmeldungen für die Level-Objekte untereinander berechnet werden müssen. Wird zunächst der Abstand der Raumschiffe zu jedem sichtbaren Marker getestet. Ist ein Schwellwert unterschritten – was noch keine Objektkollision bedeutet –, wird eine mögliche Berührung zwischen Tor und Objekt wie folgt (am Beispiel Tor und Raumschiff) ermittelt. Das Raumschiff besteht – je nach Modell – aus bis zu 43000 Polygonen, was eine Überprüfung auf unterster Ebene mit den Dreiecken der Tore vom Aufwand her doch ausschließt. Problematisch ist zusätzlich die Kapselung der VRML-Darstellung des AR-Toolkits. Man gelangt zwar letztlich an die Vertices der VRML-Graphiken, doch hätte dies ein Umschreiben mehrerer AR-Toolkit-Klassen bedeutet. 36 3.3 Implementation des Spielprinzips Abbildung 3.15: Bounding Box-Ausrichtung am obj-Koordinatensystem – nicht an cam Die gewählte Variante verwendet eine einfache Bounding Box für das Raumschiff, deren Größe zur Zeit fest vorgegeben ist und jeweils bei der Wahl eines anderen Raumschiff-Objekts „von Hand“ angepasst werden muss. Diese Bounding Box wird durch acht (Eckpunkt-)Vektoren beschrieben, die sich bei Drehungen des Raumschiffs auch korrekt mitdrehen: auf eine Achsenausrichtung (axis aligned bounding box (AABB)) an cam wurde bewusst verzichtet. Da die Kameraposition am Ursprung der OpenGL-Welt liegt, verändert beispielsweise das Bewegen des Raumschiffs in horizontaler Richtung nicht nur die x- oder y-Werte unseres Objektes. Eine AABB würde sich aber am Koordinatensystem der Kamera ausrichten müssen und somit unser Raumschiff stets ungenau einrahmen (Abb. 3.15). Im Kollisionstest mit dem Tor werden zwei verschiedene Verfahren angewandt – für die Plattformen und für die Ringe je eins. Die Prinzipien der Prüfungen sowie die Implementierungen der Schnitt-Tests werden im Folgenden erklärt. Plattformen Ob es eine Berührung zwischen Plattform-Ebene und Raumschiff gegeben hat, wird getestet, indem zunächst für alle 8 Bounding Box-Punkte der Abstand zur Ebene bestimmt wird. Ist ein Abstand zur Ebene kleiner als ein vorgegebener Mindestabstand (distanceToPlane()), liegt eine Kollision vor, sofern der Punkt zum aktuellen Zeitpunkt überhaupt oberhalb der Ebene liegt. Hierzu wird die Methode abovePolygon() angewandt. Um die Kanten der Plattform erfolgreich zu überprüfen, werden alle 6 Flächen der Bounding Box mit quad_quad_intersect() gegen das Plattform-Viereck auf einen Schnittpunkt getestet. Ist eine der obigen Bedingungen wahr, erfolgt der Abprall des Raumschiffs. Der Geschwindigkeitsvektor wird invertiert, halbiert und die Position auf die vorherige zurückgesetzt. Zusätzlich wird ein entsprechender Sound als Feedback ausgegeben. 37 3 Entwicklung des Spiels Abbildung 3.16: Kollisionsprüfung an Toren über outside_hit und inside_hit Ringe Zur Bestimmung, ob das Raumschiff durch das Tor durchfliegt oder mit dem Rand kollidiert, musste eine etwas andere Methode angewandt werden, da nicht auf Polygon-Ebene alle VRMLDreiecke des Tors verglichen werden konnten. Ein vereinfachtes repräsentatives Polygon-Gitter zum Test wäre vermutlich der nächst beste Ansatz, doch erschien er zunächst unnötig, da die im Folgenden vorgestellte Variante am zweckmäßigsten zum Ziel führt. Allerdings gibt es einige Probleme, die hoffentlich in einer nachfolgenden Version mit dem Polygon-Gitter-Modell eliminiert werden können. Die gegenwärtige Version testet in mehreren Schritten, ob eine Kollision vorliegt und gleichzeitig, ob das Raumschiff durch das Tor durchgeflogen ist. Dazu benötigt man die oben genannten Informationen für ein Tor: einen äußeren und einen inneren Radius (zwischen diesen Radien liegt der Tor-Rahmen, an dem eine Kollision auftritt), sowie die Gleichung für die Ebene, die im Tor liegt, und einen Wert zum Speichern der Dicke des Tors. Zunächst wird für alle Bounding Box-Eckpunkte getestet, ob sie nahe genug an der Ebene des Tors liegen (nicht weiter weg als die angegebene Dicke). Ist dies für mindestens einen der Eckpunkte der Fall, wird geprüft, ob sie innerhalb des äußeren Radius liegen. Befindet sich ein Punkt innen, erhöhen wir eine Zählvariable outside_hit, die die Anzahl der Treffer speichert. Eine zweite Variable inside_hit sammelt die Werte für den inneren Radius. Sollten outside_hit und inside_hit verschiedene Werte haben, muss eine Kollision mit der Außenhülle vorliegen, da outside_hit stets mit erhöht wird, wenn inside_hit seinen Wert ändert. Das Raumschiff befindet sich folglich innerhalb des inneren Radius, wenn die beiden Variablen denselben Wert besitzen und ungleich Null sind. Sind die Werte verschieden, liegt mindestens ein Eckpunkt nicht im Inneren und eine Kollision wird ausgelöst (Abb. 3.16). Um das Tor als „passiert“ zu markieren, wird zusätzlich der Abstand zum Tor vorher und nachher gemessen: fand ein Vorzeichenwechsel statt, bekommt der Spieler einen Punkt für diesen Streckenposten. 38 3.3 Implementation des Spielprinzips Abbildung 3.17: Punktabstand zu einem Polygon: abovePolygon() Kollisionen zwischen dem Spieler, den gegnerischen Drohnen und den Laser-Geschossen werden komplett über Bounding Sphere-Verfahren geprüft. Algorithmen Die in diesem Abschnitt benötigten Methoden und deren Funktionsweisen sollen kurz vorgestellt werden. double distanceToPlane(double point[3], double planePoint[3], double normVector[3]); Diese Methode bestimmt den Abstand eines Punktes zu einer Ebene, die in Normalform angegeben wird. Die Differenz zwischen dem ersten Punkt und dem Punkt der Ebene wird gebildet und aus ihr und dem Normalenvektor der Ebene das Skalarprodukt gebildet. Dieser Rückgabewert liefert abhängig von der Normalenausrichtung einen positiven oder negativen Abstand. int abovePolygon(double point[3], double norm[3], double plane[4][3]); Um zu bestimmen, ob ein beliebiger Punkt über einem Polygon liegt, wird diese Methode verwendet, die als Rückgabewert 1 oder 0 liefert. Übergeben werden der zu prüfende Punkt ptest , die Normale der Ebene ~n und die vier Eckpunkte des Polygons p~0 , p~1 ,p~2 , p~3 . Es werden 39 3 Entwicklung des Spiels die in der Ebene liegenden, auf den Seiten senkrecht stehenden Vektoren pn~lot errechnet, indem jeweils die Differenz aus zwei aufeinander folgenden Punkten bestimmt wird. Das Kreuzprodukt zwischen diesen „Kantenvektoren“ und dem Normalenvektor ~n liefert die senkrecht stehenden (Abb. 3.17). Im Anschluss werden die Punkte pn+1,n ~ half ermittelt und die Vektoren von diesen Koordinaten zu ptest bestimmt. Die Prüfung, ob letzterer über der Ebene liegt, erfolgt, indem für jeden dieser Vektoren das Skalarprodukt mit dem jeweiligen pn~lot gebildet wird: sind alle vier Ergebnisse größer oder gleich Null, haben alle vier Winkel einen Wert, der kleiner als 90◦ ist. Der zu prüfende Punkt liegt zwangsläufig oberhalb des Polygons. int quad_quad_intersect(double quad0[4][3], double quad1[4][3]); Zur Bestimmung, ob sich zwei Vierecke schneiden, werden die Ebenen in je zwei Dreiecksflächen aufgeteilt und erst dann der Schnitttest in tri_tri_intersect() ausgeführt. int tri_tri_intersect(double V0[3], double V1[3], double V2[3], double U0[3], double U1[3],double U2[3]); Übergeben werden zwei Bündel von je drei Vektoren für je ein Dreieck. In der Methode wird die Ebenengleichung für das Dreieck v~0 , v~1 , v~2 in Normalform aufgestellt. Danach werden die Eckpunkte des zweiten Dreiecks eingesetzt und der vorzeichenbehaftete Abstand zur Ebene bestimmt (du0 , du1 , du2 ). Sind alle Vorzeichen identisch und die Abstände größer als Null, kann keine Kollision vorliegen. Umgekehrt wird dieser Vergleich mit der Fläche u~0 , u~1 , u~2 und v~0 , v~1 , v~2 getestet (dv0 , dv1 , dv2 speicheren die Abstände) und bei obiger Bedingung 0 zurückgegeben. Andernfalls wird die Schnittlinie aus dem Kreuzprodukt der zwei Normalenvektoren der Ebenen ermittelt. Die größte Komponente dieses Vektors wird bestimmt und deren Index verwendet, um projizierte Vektoren v~p und u~p zu erhalten. Dann werden die Intervalle für die zwei Dreiecke mit diesen Aufrufen berechnet: COMPUTE_INTERVALS(vp0,vp1,vp2,dv0,dv1,dv2,dv0*dv1,dv0*dv2, isect1[0],isect1[1]) COMPUTE_INTERVALS(up0,up1,up2,du0,du1,du2,du0*du1,du0*du2, isect2[0],isect2[1]) isect1 und isect2 werden in COMPUTE_INTERVALS initialisiert. An erster ArrayPosition liegt stets der kleinere Wert, so dass wir im Anschluss ein letztes Mal prüfen, ob kein Schnittpunkt vorliegt. Andernfalls geben wir 1 zurück: ... if(isect1[1]<isect2[0] || isect2[1]<isect1[0]) return 0; return 1; 40 4 Ergebnisse 4.1 Das Spiel Im vorgegebenen Zeitraum konnte eine funktionsfähige AR-Anwendung entwickelt werden. Das AR-Toolkit wurde erfolgreich integriert und die wichtigsten Ideen vom Spielkonzept realisiert, welche hier vorgestellt werden sollen. Darüber hinaus wurden verschiedene Interaktionsmöglichkeiten mit dem Benutzer angedacht und zum Teil implementiert. Sie werden in diesen Kapitel ebenfalls beschrieben. Leider war kein HMD vorhanden, so dass komplett mit einer stationären Kamera und einem Monitor gearbeitet werden musste. Folglich war es nicht möglich, die bei einer See-ThroughUmgebung enstehenden Probleme, Vorteile und Beschränkungen zu erforschen. Interessant wäre eine Untersuchung zur Stabilität des AR-Toolkits bei einer solchen Immersionsvariante gewesen. Viele Fragen dazu mussten leider offen bleiben. Sind Ausfälle tolerierbar? Wie gut gelingt die Vermischung der realen und virtuellen Welt? Ist das vorgestellte Spielkonzept wirklich geeignet für Augmented Reality unter Benutzung eines HMDs? Spielbeginn Vor dem Programmstart muss eine Kamera angeschlossen sein und die zu verwendenden Marker sollten im Raum verteilt die Strecke abstecken. Startet der Benutzer im Anschluss die Anwendung, befindet er sich sogleich in der Spielansicht. Die Marker werden erkannt und die Tore erscheinen entsprechend. Vorerst wird die Highscore-Liste eingeblendet und der Anwender muss das Spiel per Tastatureingabe starten (Einspieler-/Zweispieler-Modus). Zu Beginn erscheint das Raumschiff dann mit einer weiß leuchtenden Schutzhülle, die den Benutzer in dieser Zeit vor Schaden bewahrt und nach einigen Sekunden verschwindet. Der Spieler muss gegen die Zeit antreten und möglichst schnell Runde um Runde abfliegen. Dabei bekommt er über ein HeadsUp-Display (Abb. 4.1) im Sichtfeld die verbleibende Zeit und die Beschädigung am Raumschiff als Balkengraphik visualisiert. Der „schrumpfende“ Balken für die Zeitangabe kann auch im Bildrand gut wahrgenommen werden ohne dass der Benutzer explizit hinsehen muss1 . Zusätzlich werden der Punktestand und die verbleibenden Leben angezeigt. 4.1.1 Spielkonzept Die Umsetzung des angestrebten Konzepts beschränkt sich auf den vorgestellten „Arcade-Modus“. Die Spieler (maximal zwei) können ihre Raumschiffe per Joystick und Tastatur steuern und die 1 Die schlechtere Wahl wäre eine Angabe in Sekunden – hier müsste man genau hinsehen, um ein Gefühl für die verbleibende Zeit zu bekommen. 41 4 Ergebnisse Abbildung 4.1: Das Heads-Up-Display im Spiel auf den Markern erscheinende Strecke abfliegen. Dabei muss die richtige Reihenfolge der Tore eingehalten und eine Runde in der vorgegebenen Zeit vollendet werden. Um es dem Benutzer zu erleichtern, erscheint über dem aktuell anzufliegenden Tor eine Pfeil-Markierung (Abb. 4.2) und das Ablaufen der Zeit wird fünf Sekunden vor Schluss akustisch signalisiert. Beim Beenden einer Runde erhält der Spieler Bonus-Zeit, die je nach Schwierigkeit und Level aber immer weiter abnimmt. Abbildung 4.2: Navigationshilfe mit Pfeilen Das Raumschiff besitzt zusätzlich einen Energiewert, der abnimmt, wenn gegnerische Objekte kollidieren oder den Spieler unter Beschuss nehmen. Eine Kollision mit den Toren, Wänden und Bodenplattformen führt nur zu einem Abprall bzw. einer Geschwindkeitsreduzierung, jedoch nicht zu einem Schaden. 42 4.1 Das Spiel Erschwerend kommt in jeder dritten Runde2 ein weiterer Gegner ins Spielfeld: Drohnen steuern stets auf den Spieler zu bzw. versuchen vor ihn zu gelangen und dann zu rammen (Abb. 4.3). Neben Ausweichmanövern können diese aber auch per Knopfdruck mit dem Laser abgeschossen werden, der in einem Raumschiff natürlich nicht fehlen darf. Sind alle gegnerischen Drohnen ausgeschaltet, tauchen sie frühestens in der nächsten Runde (im nächsten Level) wieder auf. Der Benutzer kann – vorübergehend ungestört – die Strecke in der verbleibenden Zeit vollenden. Abbildung 4.3: Gegnerische Drohnen stören den Spieler 4.1.2 Interaktionsmöglichkeiten Grundlagen Zunächst wurde die „klassische“ Bedienung einer Software bzw. eines Spiels implementiert: der Anwender benutzt die Tastatur, wählt mit Funktionstasten die Optionen an und steuert per Cursor-Tasten. Als erste Optimierung wurde ein Joystick eingebunden, der drahtlos und in Verbindung mit einem HMD bereits einen hohen Komfort und Freiheitsgrad bieten würde. Die analoge Steuerung hat sich als unabdingbar herausgestellt. Die Tasturabfrage der GLUT ist eher mäßig, so dass der Keyboard-Spieler mit unangenehm, ewig währendem „Hacken“ auf das Eingabegerät beschäftigt ist. Der Benutzer muss allerdings auch unter Verwendung des Joysticks auf die Tastatur zurückgreifen, um etwa das Spiel neu zu starten. Markerbasierte Steuerung Die erste Variante der Marker basierten Bedienung des Spiels ist im Spielkonzept verankert. Verschiebt der Anwender die Pappfelder auf denen die Tore erscheinen, verändert sich die abzufliegende Strecke. Auf diese Art und Weise kann die Strecke selbst zur Laufzeit verändert und interessant gehalten werden. (Ein Tor könnte etwa auf einem sich drehenden Plattenspieler liegen.) Ist sie zu schwer, hat man etwa die Option die Abstände zu verringern. 2 je nach Schwierigkeitsgrad 43 4 Ergebnisse Menüs Weitere Ideen sahen die Eingabe über spezielle Musterfelder vor. Der Benutzer soll sämtliche Eingaben über den Joystick und die Marker realisieren können. Dazu schnallt sich der Spieler zwei bestimmte Muster an die Handrücken. Während des Spiels sind sie durch das Umfassen des Joysticks nicht sichtbar. Sollte eine der beiden Hände gedreht und einer der Menü-Marker im Bild erkannt werden, schaltet das Spiel auf Pause und der Anwender kann mit dem Pfeil, der auf dem linken Musterfeld erscheint, die Menüeinträge, die auf der rechten Hand erscheinen, auswählen (Abb. 4.4). Hierzu wird intern die Pfeilspitzen-Position im 3D-Raum bestimmt und die Nähe zu einem Menü-Punkt berechnet. Ist der Abstand unter einem ersten Schwellwert, wird der Eintrag markiert, fällt die Distanz unter einen zweiten Wert, wird der Befehl ausgeführt. Problematisch war bei dieser Steuerung jedoch die 3D-Positionierung. Der Benutzer glaubte, den Menüeintrag ausgewählt zu haben, doch befand sich der Pfeil weit hinter dem Menüobjekt, was jedoch in der Perspektive des Betrachters schlecht zu erkennen war. Würde man zur Abstandsbestimmung alle einbezogenen Marker auf dieselbe Distanz zur Kamera abbilden, wäre in dieser Art der Steuerung viel Potential enthalten: der Pfeilmarker stellt dabei letztlich eine Art Maus-Cursor dar. Auswählen könnte man dann wie angedacht durch die geringe Distanz zum Objekt oder durch eine schnelle Drehung des Markers. Abbildung 4.4: Menüsteuerung über Handrückenmarker Werkzeuge Eine intuitive Manipulation des Spiels ermöglicht ein weiterer Ansatz, bei dem wieder spezielle Muster benutzt werden müssen: sie dienen zur Anpassung der Level-Elemente. Hält man während des Spiels etwa den Marker mit dem Schraubenschlüssel-Symbol in die Nähe eines Tores, so erscheint eine Markierung um das ausgewählte Element. Der Benutzer kann durch Drehen des Werkzeug-Markers das Tor in seiner Größe verändern und so den Schwierigkeitsgrad der Strecke individuell anpassen (Abb. 4.5 und 4.6). 44 4.2 Umgesetzte Optimierungen Ein anderer Werkzeug-Marker wird zum Beispiel verwendet, um ein Levelobjekt auszutauschen. So kann der Benutzer die Graphiken der Tore selbst bestimmen oder spezielle Elemente einbinden (z.B. ein Tor durch eine Startplattform oder ein anderes Hindernis ersetzen). Dieses Prinzip der Werkzeug-Marker ist beliebig erweiterbar und durch die verwendeten Muster für den Benutzer leicht verständlich. Abbildung 4.5: Werkzeug-Marker zur Manipulation: Modellauswahl per Drehung Abbildung 4.6: Drehen des Werkzeugs zum Anpassen der Tor-Größe 4.2 Umgesetzte Optimierungen Neben den Optimierungen im Spielprinzip und Überlegungen, möglichst interessante Extras einzubinden, die das Spielgeschehen dauerhaft unterhaltsam gestalten, sind andere wichtige Aspekte zu berücksichtigen, die dazu dienen sollen, dem Benutzer eine bessere Immersion zu er- 45 4 Ergebnisse möglichen. Drei implementierte Verbesserungen sollen im Folgenden herausgestellt werden: die Einbindung von Schatten, Kollision mit realen Objekten, sowie die Optimierung der Steuerung. 4.2.1 Schatten Ein Hauptproblem bei der Steuerung des Raumschiffs war die Abschätzung der Höhe im realen Raum. Der Benutzer sieht letztlich alles nur in 2D (das AR-Toolkit kann nur ein Kamerabild verarbeiten). Das Fehlen der räumlichen Tiefe ermöglicht eine Orientierung nur über die Größenverhältnisse und über Überschneidungen von Objekten. Dass diese zwei Möglichkeiten für eine Orientierung nicht ausreichen würden, wurde bei ersten Tests schnell klar. Es wurden für die sich bewegenden virtuellen Objekte Schlagschatten eingebunden, die die Orientierung erleichtern sollen. Da das Programm nicht die Lichtverhältnisse des realen Raums kennt, sitzt die virtuelle Lichtquelle senkrecht über der Szene, so dass alle Schatten senkrecht nach unten projiziert werden (Abb. 4.7). Nach wenigen Tests wurde der große Vorteil dieses Abbildung 4.7: optimierte Orientierung durch Schlagschatten Ansatzes bereits deutlich. Allerdings hat man so dennoch mit einer Einschränkung zu kämpfen. Da das Programm den realen Raum nicht kennt und somit nicht weiß, wo reale Objekte unter dem Spielfeld liegen, ist nicht immer klar, in welcher Höhe der Schatten zu erscheinen hat. Die implementierte Variante verfolgt daher die Idee, dass Schatten nur gezeichnet werden, wenn die Objekte über Markern stehen bzw. in unmittelbarer Nähe sind. Für jeden Marker wird das Bodenplattform-Rechteck verwendet, um vom Objekt aus einen Strahl senkrecht nach unten auf die Basis zu schießen. Existiert ein Schnittpunkt, so zeichnen wir den Schatten. Andernfalls schweben die Objekte ohne Schatten im Raum. Da der Benutzer aber in kürzeren Abständen Marker um Marker ansteuert, schaltet sich der Schatten somit immer wieder ein und verschwindet kurze Zeit später wieder. Zur Positionsbestimmung für den Benutzer reicht dieser wechselnde Schatten völlig aus, auch wenn ein dauerhafter Schatten optisch selbstverständlich wünschenswerter wäre. Zwei andere Varianten wären noch denkbar, die allerdings auch gewisse Nachteile besitzen. Zum einen könnte man den im realen Raum am tiefsten liegenden Marker benutzen, um in 46 4.2 Umgesetzte Optimierungen seiner Höhe eine Ebene aufzuspannen, die die unterste Schicht der Welt darstellt. Sofern kein höherer Marker als Schattenbezugspunkt benutzt wird, erscheint der Schatten auf dieser Ebene. Der Nachteil dieser Variante ist, dass etwa „Abgründe“ zwischen zwei Schreibtischen nicht registriert würden, da die unterste Ebene die beiden Schreibtischplatten verbindet. Das Raumschiff würde im realen Raum seinen Schatten in die Luft projizieren. In der zweiten Variante sollten immer drei Marker, die im Bild zu sehen sind, eine Ebene aufspannen und somit dynamisch weitere Bezugsebenen für den Schatten generieren. Vorteilhaft ist hier das Aufspannen auch schiefer Ebenen. Das Problem der „Abgründe“ greift hier allerdings auch und zusätzlich fällt die Ebene aus, sobald sich nur noch zwei Marker im Bild befinden. Um dennoch öfters Schattenwürfe zu erhalten, werden zusätzliche Kollisionsebenen verwendet, die flach auf dem Boden liegen, um weitere Bezugsflächen zu ermitteln. 4.2.2 Kollision mit realen Objekten Um weitere Verbesserungen für den Spieler zu erhalten, die die Immersion weiter stärken und die Grenze zwischen Realem und Virtuellem weiter verwischen, wurde mit einer extra Sorte Markern eine Möglichkeit integriert, reale Objekte als „undurchlässig“ zu markieren. Man kann beispielsweise einen Marker an eine Wand oder eine Tischplatte kleben und das Programm wird in Zukunft über diesem Marker intern eine Ebene aufspannen, die für die Kollisionstests und den Schattenwurf genutzt wird. Der Clou ist dabei, dass auf dem Marker kein virtuelles Objekt erscheint. Nachdem der Benutzer ggf. noch die Größe der Ebene skaliert hat, wird diese nie gezeichnet, da dass Raumschiff für den Betrachter dann mit dem realen Objekt, an dem der Marker angebracht ist, zu kollidieren scheint und auch hierauf der Schatten projiziert wird. Während der Aufbau-Phase (vor dem eigentlich Spiel) hat der Benutzer die Möglichkeit, die unsichtbaren Kollisionswände einzublenden, um ihre Höhe und Breite anzupassen (Abb. 4.8, links). Abbildung 4.8: Kollisionserkennung mit realen Objekten Neben diesen extra Kollisionsmarkern besitzt jedes Tor von sich aus die untere Plattform als Kollisionsfläche. Zusätzlich definiert je ein Quader unter jedem Tor weitere Wände. Stellt der 47 4 Ergebnisse Benutzer einen Marker etwa auf eine Flasche o.ä., fliegt das Raumschiff gegen die unter dem Papierfeld stehende Flasche (Abb. 4.9). Abbildung 4.9: Kollision mit realen Objekten, die unter dem Marker stehen 4.2.3 Automatische Höhenanpassung des Raumschiffs Da die Bildverzerrung bei den verwendeten Kameras doch unangenehm groß ist, erkennt das Toolkit Marker im Randbereich in einer falschen Höhe und Ausrichtung. Tore, die auf demselben realen Grund stehen, werden im Spiel als unterschiedlich hoch positioniert registriert (Abb. 4.10). Dies ergibt natürlich einige Probleme, die es auszugleichen gilt. Zu nennen wäre vor allem die dadurch erschwerte Steuerung durch den Benutzer. Durchquert das Raumschiff ein Tor und steuert ein zweites an, welches sich eigentlich auf derselben Höhe wie das erste befindet, aber durch die Verzerrung anders positioniert wird, stößt es dennoch unerwartet am Rand an. Da diese Beschränkungen nicht zu umgehen waren, ist eine automatische Höhenregulierung für das Raumschiff integriert worden. Zunächst wird der Abstand zu allen sichtbaren Toren ermittelt. Ist das nächstliegende Tor bestimmt und ein Schwellwert unterschritten, wird die Höhe des Raumschiffs automatisch nachreguliert. Langsam gleitet das Raumschiff höher oder tiefer – so als ob der Benutzer selbst die Anpassung vorgenommen hätte. Ist das Schiff auf Höhe des Ring-Zentrums stoppt die Regulierung. Dieser Eingriff zerstört zwar die totale dreidimensionale Steuerungsfreiheit des Spielers, erhöht aber die Spielbarkeit enorm, da in Tests die beschriebene Verzerrung doch zu stark war, als dass man sie hätte ignorieren können. Neben dieser Höhenanpassung für die Position wurde gleichzeitig eine automatische LaserSchussausrichtung integriert. Da gegnerische Objekte nicht immer auf Spielerhöhe fliegen, fiel 48 4.2 Umgesetzte Optimierungen dem Benutzer das Anvisieren der Objekte recht schwer. Nur die Richtung muss stimmen und der Feind wird – egal auf welcher Höhe er sich befindet – getroffen3 . Sollte eine andere Kamera weniger verzerren oder der Benutzer eine größere Herausforderung suchen, kann die Funktion deaktiviert werden. Sie ist also nur als aktivierbare Hilfe zu verstehen. Abbildung 4.10: Optische Verzerrung der Kamera 4.2.4 Benutzererfahrungen Wie bereits erwähnt, konnte die Benutzung eines HMDs nicht erprobt werden, wodurch wichtige Aspekte undokumentiert bleiben müssen. Handhabung Ansonsten zeigte sich das Spiel in der Benutzung recht stabil, wenn auch bei zu großer Kameraentfernung oder schlechteren Lichtverhältnissen schnell Marker ausfielen oder „hin- und hersprangen“. Meistens war dies kein Problem, da der Marker, an dem das Rauchschiff ausgericht wurde, oft im vorderen Bereich der Kamera lag und somit stabil getrackt werden konnte. Gelegentlich ergab es sich jedoch, dass der aktuelle Bezugspunkt ungenau zitterte und die Raumschiffposition diesem Fehler folgte. So kam es vor, dass der Benutzer mit seinem Schiff in Toren oder Plattformen „feststeckte“, da eine unplanmäßige Koordinatenverschiebung die Kollisionsprüfung ausgetrickst hatte. Zwar konnte sich der Spieler schnell behelfen, indem er einfach eine Hand vor den blockierten Marker gehalten hat (so verschwand das entsprechende Tor und die Kollision wurde deaktiviert), doch wäre hier eine Verfeinerung der Prüfung wichtig. Ebenso kam es vor, dass das Schiff im Tor hängen blieb, wenn es – während es im Torbogen stand – nach oben oder unten fliegen sollte. Die automatische Höhensteuerung des Schiffs eliminierte dieses Problem jedoch (siehe Abschnitt 4.2.3). 3 Da in der Testumgebung die Marker meist auf derselben Höhe waren, fiel das „eigentliche Vorbeischießen“ nie auf. Sollte man mit einem HMD einen größeren Raum verwenden, könnte diese Art der Hilfe eher störend oder unrealistisch wirken 49 4 Ergebnisse Die angesprochene Verzerrung (Abb. 4.10) erschwerte die Navigation ein wenig und das Erkennen von rechteckigen Bereichen, die gar keine Marker waren, führte gelegentlich zu Problemen: wurde etwa ein Bildbereich fälschlicherweise als Werkzeugmarker erkannt, konnte es vorkommen, dass auf einmal ein Tor die Größe änderte oder das Modell wechselte. Eine zusätzliche Sicherung könnte hilfreich sein. Spielspaß Das Spielkonzept kam allgemein gut an, wobei die Neuheit der Augmented Reality ein großes Stück zur Faszination beitrug. Testpersonen nahmen, drehten, neigten und vertauschten Marker während des Spiels, um die verschiedenen Effekte betrachten zu können. Die Langzeitmotivation des Spiels war zwar im Moment eher gering, doch sollten die vorgeschlagenen (nicht umgesetzten) Spielideen und der (zur Zeit nur rudimentär vorhandene) Mehrspieler-Modus diese immens steigern. Joysticksteuerung Die analoge Joystick-Raumschiffsteuerung erwies sich nach einigen Minuten als sehr angenehm und als fast zu einfach – dadurch, dass das Raumschiff keinem seitlichen „Drift“ erlag, konnte präzise gesteuert werden. Eine verbesserte Flug-/Fahrphysik wurde vermisst. Marker Da das Spiel den erstbesten Marker zur Ausrichtung verwendet, kam es zudem zu einer schrägen Spielwelt, wenn das erste erkannte Musterfeld nicht waagerecht auf einem Untergrund lag. Alle folgenden Übergaben der Koordinaten mussten diese schräge Positionierung übernehmen. Wichtig ist daher, dass der „Startmarker“ immer auf einer waagerechten Unterlage liegt. Dies ist ebenfalls für die korrekte Bestimmung des Schattens wichtig. Ansonsten kann der Spieler Musterfelder beliebig verteilen und auch kopfüber an der Decke anbringen (um etwa einen Looping fliegen zu müssen). 50 5 Fazit und Ausblick 5.1 Abgeschlossene Umsetzung Die zum Zeitpunkt der Abgabe vorliegende Version der Software war voll einsatzfähig und beinhaltete die wesentlichen Elemente, mit denen man bei der Entwicklung einer AR-Applikation in Kontakt treten muss: die Planung einer stabilen und immersiven Anwendung, die Koordinatenauswertung und -umsetzung (die das Toolkit über die Marker liefert) und die Grundlagen einer Kollisionsprüfung mit angedachten und teilweise integrierten Methoden zur Steigerung des Immersionsgefühls. Das Toolkit stellt hierfür eine gute Grundlage. Es ist nach der Einarbeitungsphase ein mächtiges Werkzeug. Leider war die Bildqualität der Kameras nicht sehr gut, so dass offen bleibt, ob bei Verwendung präziserer Kameras eine stabilere Erkennung möglich gewesen wäre. 5.2 Optimierungsansätze und Erweiterungen Vor allem die zeitliche Begrenzung hat zwangsläufig dazu geführt, dass einige geplante Ideen nicht umgesetzt werden konnten. Neben technischen Feinheiten (eine verbesserte Kollisionserkennung, direkt aus den VRML-Modellen abgeleitete Bounding-Boxes, Integration von 3DSound und Mehrkanalton mit Musik, aufwendigere Graphiken, Erweiterungen der Interaktionsmöglichkeiten mit Markern), gibt es aber doch einige spezielle Verbesserungen, die kurz aufgezählt und beschrieben werden sollen. 5.2.1 Erkennung der Markerposition Um eine bessere Vermischung der realen und virtuellen Welt zu erhalten, wäre es sinnvoll, die Ausrichtung der einzelnen Marker untereinander zu berücksichtigen. Der Benutzer müsste einen speziellen Marker auf eine ebene Fläche legen und das Toolkit kann im Bezug zu diesem Muster die Ausrichtung aller anderen bestimmen. Hilfreiche wäre dies zum Beispiel für die Projektion des Schattens. Ist dem Toolkit durch den Bezug zum genannten Marker bekannt, dass ein weiteres Muster kopfüber angebracht ist, wird kein Schatten projiziert und etwaige Partikeleffekte (o.ä.) des Modells müssten der Schwerkraft folgend fallen (in relativen Koordinaten zum Tor dann nach oben!). Derzeitig sind spezielle Marker vorgesehen, um diese Eigenschaften mitzuteilen. Spezielle Musterfelder, etwa für Wände, werden verwendet, um eine Kollision auszulösen, aber keinen Schatten auf sich zu projizieren. 51 5 Fazit und Ausblick 5.2.2 Verdeckung Auf der Suche nach weiteren Möglichkeiten, die Immersion in das Spiel und die Vermischung der realen und virtuellen Welt weiter voranzutreiben, kam die Idee auf, neben der Kollision mit realen Objekten auch noch Verdeckung zu integrieren. Die Informationen hierfür liefern bereits die Marker (siehe Kapitel 4.2.2). Jetzt müssten diese normalerweise nicht gezeichneten Kollisionsebenen nur noch in den Depth-Buffer geschrieben werden, um die Raumschiff-Bereiche wegzuclippen, die hinter dieser Ebene liegen. Ist der Color-Buffer dabei deaktiviert, wird man die Kollisionsebene nachher nicht im Bild sehen. Abbildung 5.1: Verdeckung der augmentierten Objekte durch reale Gegenstände (Montage) 5.2.3 Fortführung des Spielkonzepts, Optimierung Neben dem umgesetzten Arcarde-Modus sollte auch noch die beschriebene Variante mit Computer-Gegnern umgesetzt werden. Eine Erweiterung um einen Karriere-Modus mit der Möglichkeit, bessere Raumschiffe zu kaufen und vorhandene zu modifizieren, wäre erstrebenswert. Prinzipiell könnte jeder Benutzer auch eigene Graphiken integrieren (eigene VRML-Modelle einladen) und so das Spiel besser personalisieren. Bessere Graphiken, Partikel-Systeme und mit der Zeit aufwendigere Effekte im Spiel könnten den Benutzer länger „bei der Stange halten“ (siehe Kapitel 3.1). Das Spiel sinnvoll und spannend mehrspielerfähig zu gestalten, ist jedoch schwierig: wird mit HMDs gespielt, muss jeder Spieler ein eigenes tragen und eine Synchronisation über das Netzwerk wäre notwendig. Trägt nur ein Spieler ein HMD, muss der zweite Spieler immer durch die Augen des anderen steuern. Ist hingegen nur ein Monitor angeschlossen, verliert das Spiel zwar einen Teil seines AR-Charakters, kann aber fair von mehreren Spielern gleichzeitig bedient werden. Eine etwas andere Mehrspieler-Variante ist an das MagicBook-Konzept des HITLabs[2] angelehnt. Der zweite Spieler sitzt vor einem Bildschirm und sieht die Spielwelt aus Sicht des 52 5.3 Ausblick Raumschiffs. Er betritt die virtuelle Welt und steuert aus der Ego-Perspektive weitere Raumschiffe, die Bordkanone, etc., um dem ersten Spieler zu assistieren oder gegen ihn anzutreten. Denkbar wäre eine Kooperation, bei der der zweite Spieler Hilfsaufgaben übernimmt. Da der erste Spieler den zweiten als Avatar oder Raumschiff, etc. in seiner augmentierten Sicht eingeblendet bekommen würde, könnte er ihm Hinweise geben, z.B. wo er hinfliegen soll. (Spieler 1 hat die totale Übersicht über das Spielfeld, während Spieler 2 nur einen kleinen Ausschnitt sieht.) Die einzige störende Einschränkung wäre hier, dass der zweite Spieler nicht die reale Umgebung sehen kann, sondern nur die virtuellen Objekte am Bildschirm sieht. (Um dieses Problem zu beheben, müsste man mehrere Kameras verwenden, um etwa dem zweiten Spieler eine Skybox1 aus dem realen Raum um die virtuelle Welt zu legen.) 5.3 Ausblick Das vorgestellte Toolkit bietet einen günstigen Einstieg in die AR-Technologie, da das Marker basierte Tracking neben einem Bildschirm und einer Kamera nur die Musterfelder benötigt, die schnell selbst erstellt werden können. Sind die Begrenzungen und Möglichkeiten des Inside-Out-Prinzips erkannt, wird der SoftwareEntwickler nach der vermutlich am längsten währenden Konzept-Phase die meiste Zeit damit verbringen, die Funktionalitäten des eigenen Programmes zu implementieren – das Toolkit selbst tritt in den Hintergrund und liefert unkompliziert die neuen Matritzen der definierten Muster. Leider ist die Stabilität des Trackings nur in unmittelbarer Nähe und ruhiger Kameraposition sehr hoch. Sobald der Anwender schnelle Bewegungen ausführt, sich weiter entfernt, sich die Beleuchtung verändert oder Marker teilweise unter Schatten verschwinden, verliert das Toolkit an Präzision. Sollte es sich um kritische Anwendungen handeln, bei denen eine millimetergenaue Visualisierung vonnöten ist, kann das Toolkit noch nicht zum Einsatz kommen. Da diese Technologie so jung ist, sind viele Fragen noch zu klären. Es gibt genug Potential für weitere Forschungen. Die Bildverarbeitung und perspektivische Bestimmung der Marker zum Positionstracking ist ein eigenes, umfangreiches Feld für Studien- und Diplomarbeiten (– anzustreben wäre ohnehin ein Tracking, welches komplett ohne vordefinierte Musterfelder auskommt). Ebenso dürften sich bei der Verwendung von Head-Mounted- oder Head-Coupled-Displays weitere Bereiche anschließen, die sich mit der Handhabbarkeit der Geräte, der Anpassung vorhandener und Entwicklung neuer, besser geeigneter Eingabegeräte und der Kalibrierung beschäftigen werden. Gerade der letzte Punkt ist zur Zeit die größte Hürde, um Geräte unkompliziert in den Consumer-Bereich zu bringen. Ohne eine Automatisierung muss der Anwender bei nur leichtem Verrutschen des Displays die AR-Anwendung neu kalibrieren, um die virtuellen mit den realen Bildern auf Deckung zu bringen. 1 Die virtuelle Welt des 2. Spielers ist natürlich endlich. Sie liegt letztlich in einem Würfel, deren Innenflächen normalerweise eine Landschaft-, Weltraum- oder Himmelstextur zeigen würden, um die Immersion in die Spielumgebung zu steigern. In diesem Fall müsste man jedoch genaugenommen in Echtzeit aktualisierte Kamerabilder als Texturen verwenden, so dass der 2. Spieler den realen Raum des 1. Spielers als Umgebung eingeblendet bekommt. Eine genaue Abbildung wäre allerdings sehr aufwendig, da eine Kamera – sollte überhaupt eine an der aktuellen Spielerposition existieren – ihre Position real verändern müsste, sollte sich Spieler 2 virtuell bewegen. 53 5 Fazit und Ausblick Gelänge es, HMDs leicht und stromsparend genug zu entwickeln, leistungsstarke, mobile Geräte für den Endverbraucher günstig anzubieten und das Tracking zu optimieren, stünde einem umfangreichen Einsatz der AR-Technologie im Alltag nichts mehr im Wege. Ob als Navigationshilfe für Touristen, für den Museumsbesuch, die multimediale Bedienungsanleitung, das moderne Brettspiel, das Einblenden wichtiger, unterstützender Informationen bei Operationen oder das virtuelle Einrichten des Wohnzimmers vor der Kaufentscheidung – mit der richtigen Umsetzung dürfte die Augmented Reality in einigen Jahren ein normaler Bestandteil des technologischen Alltags sein. 54 6 Anhang 6.1 Beispielprogramm #ifdef _WIN32 #include <windows.h> #endif #include <stdio.h> #include <stdlib.h> #include <string.h> #include #include #include #include #include #include char int int int char ARParam char int int double double <GL/gl.h> <GL/glut.h> <AR/gsub.h> <AR/param.h> <AR/ar.h> <AR/ARFrameGrabber.h> *vconf = ""; xsize, ysize; thresh = 100; count = 0; // die Kameraparameter müssen vorher mit dem // mitgeliefertem Tool bestimmt und gespeichert werden *cparam_name = "Data/camera_para.dat"; cparam; // die Musterfeld-Datei, die verwendet werden soll *patt_name = "Data/patt.wrench"; patt_id; // Größe des Markers in Millimetern patt_width = 80.0; // Offset zur Positionierung patt_center[2] = {0.0, 0.0}; // Transformationsmatrix: sie wird vom Toolkit // aktualisiert patt_trans[3][4]; 55 6 Anhang static static static static static void void void void void init(void); cleanup(void); keyEvent( unsigned char key, int x, int y); mainLoop(void); draw( void ); ARFrameGrabber camera; int main() { CoInitialize(NULL); // Initialisierung der Anwendung init(); //Video-Capture starten camera.Init(0); camera.DisplayProperties(); camera.SetFlippedImage(true); //die main event loop starten argMainLoop( NULL, keyEvent, mainLoop ); CoUninitialize(); return 0; } static void keyEvent( unsigned char key, int x, int y) { // Programm beim Drücken von ESCAPE verlassen if( key == 0x1b ) { cleanup(); exit(0); } } /* main loop */ static void mainLoop(void) { ARUint8 *dataPtr; ARMarkerInfo *marker_info; int marker_num; int j, k; 56 6.1 Beispielprogramm // Videoframe capturen camera.GrabFrame(); if( (dataPtr = (ARUint8 *)camera.GetBuffer()) == NULL ) { arUtilSleep(2); return; } if( count == 0 ) arUtilTimerReset(); count++; // Umschalten in den 2D-Modus argDrawMode2D(); // Zeichnen des Frames als Hintergrund argDispImage( dataPtr, 0,0 ); // Marker im aktuellen Frame finden if( arDetectMarker(dataPtr, thresh, &marker_info, &marker_num) < 0 ) { cleanup(); exit(0); } // Prüfen, ob Objekte sichtbar sind k = -1; for( j = 0; j < marker_num; j++ ) { if( patt_id == marker_info[j].id ) { if( k == -1 ) k = j; else if( marker_info[k].cf < marker_info[j].cf ) k = j; } } if( k == -1 ) { argSwapBuffers(); return; } // die Transformationsmatrix zwischen Kamera und Marker bestimmen und // speichern arGetTransMat(&marker_info[k], patt_center, patt_width, patt_trans); // 3D-Objekte werden gezeichnet draw(); // Buffer wechseln und danach von oben anfangen argSwapBuffers(); } 57 6 Anhang static void init( void ) { ARParam wparam; xsize = 320; ysize = 240; // Kameraparameter setzen if( arParamLoad(cparam_name, 1, &wparam) < 0 ) { printf("Camera parameter load error !!\n"); exit(0); } arParamChangeSize( &wparam, xsize, ysize, &cparam ); arInitCparam( &cparam ); if( (patt_id=arLoadPatt(patt_name)) < 0 ) { printf("Muster konnte nicht geladen werden.\n"); exit(0); } // Graphikfenter öffnen argInit( &cparam, 2.0, 0, 0, 0, 0 ); } // Aufräumen am Ende der Anwendung static void cleanup(void) { argCleanup(); } static void draw( void ) { double gl_para[16]; argDrawMode3D(); argDraw3dCamera( 0, 0 ); glClearDepth( 1.0 ); glClear(GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); // Laden der Transformationsmatrix argConvGlpara(patt_trans, gl_para); glMatrixMode(GL_MODELVIEW); 58 6.1 Beispielprogramm glLoadMatrixd( gl_para ); glMatrixMode(GL_MODELVIEW); glTranslatef( 0.0, 0.0, 25.0 ); glutSolidCube(50.0); glDisable( GL_DEPTH_TEST ); } 59 6 Anhang 6.2 Systemkonfiguration Entwicklungsplattform • Pentium 4, 2,4 GHz • 512 MB RAM • GeForce 4 TI 4200 • Logitech Quickcam Pro USB 1.1 • Logitech Quickcam Express USB 1.1 • FireWire iBot • Analogjoystick, 4 Buttons, 2 Achsen • Microsoft Windows XP Professional, Service Pack 2 • Microsoft DirectX 9.0a Eingesetzte Software • Microsoft Visual Studio.net 7.0 • 3DSMax Version 5.0 • Adobe Photoshop 6.01 CD-ROM Die beigefügte CD-ROM enthält einige Videos, die das Toolkit und das entwickelte Programm in Aktion zeigen. Zusätzlich sind dort die Modelle, Beispielprogramme, dieser Text als PDF, ARToolkit-Versionen, Bilder und das AR-RACE (als binaries) gespeichert. Der Quellcode wird auf Anfrage gerne zugesandt1 . 1 [email protected] 60 Literaturverzeichnis [1] http://vase.essex.ac.uk/ [2] http://www.hitl.washington.edu [3] http://www.hitl.washington.edu/research/shared_space/download/ [4] http://www.gamasutra.com [5] http://www.gamedev.net [6] http://www.microsoft.com (Download -> DirectX -> DirectX 9.0 Software Development Kit with DirectX 9.0a Runtime) [7] TU Wien, AR Toolkit-Bereich von Thomas Pintaric http://www.ims.tuwien.ac.at/∼thomas/artoolkit.php [8] Woo, M.; Neider, J.; Davis, T. OpenGL Programming Guide Third Edition, OpenGL Architecture Review Board [9] Billinghurst, M., Kato, H., Weghorst, S. and Furness, T. A. (1999). A Mixed Reality 3D Conferencing Application (Technical Report R-99-1). Seattle: Human Interface Technology Laboratory, University of Washington. [10] Kevin Hawkins; Dave Astle OpenGL Game Programming Prima Tech [11] Müller, S.; Computergraphik 2; Universität Koblenz, 2002-2003 http://www.uni-koblenz.de/∼cg/veranst/ws0203/cg2.html [12] Müller, S.; Virtuelle Realität und Augmented Reality; Universität Koblenz, 2003 http://www.uni-koblenz.de/∼cg/veranst/ss03/vrar.html 61