cg23 lu - 3. Abgabe [ christian folie, meinrad recheis, stefan schauer ] 22. Juni 2004

Mission on Mars
ESA vs NASA

Story:

Die NASA hat inoffiziell weit mehr als nur 2 Sonden auf den Mars geschickt um bei der Kolonialisierung des Roten Planeten einen entscheidenden Vorteil gegenüber dem Rest der Welt zu haben. Sollte es der NASA zuerst gelingen die wichtigsten Wasservorräte auf dem Mars zu besetzen und damit den gesamten Planeten unter US-Amerikanische Hoheit zu bringen, wären die USA wirtschaftlich mächtiger als alle Länder der Welt zusammen und der Weltfrieden wäre in höchster Gefahr.

Die einzige Sonde der ESA hat eine dermassen schlimme Bruchlandung erfahren, dass ihre Teile über das gesamte Areal jenes Kraters verstreut sind, wo man die grössten H²O Ressourcen vermutet. Zum Glück ist der ESA Rover unbeschädigt. Du steuerst den Rover und versuchst den wichtigsten Krater des Mars für Europa zu gewinnen. Beim zurückholen der Teile der ESA Sonde ist jedes Mittel recht, auch klauen!

Steuerung: siehe ingame Hilfe F1

cheats: "r" für ein radar, "e" um die energie aufzuladen.

Das Spiel:

Es geht also darum so schnell wie möglich die strategisch wichtigen Teile aufzusammeln. Ein Rover kann herumliegende Teile aufsammeln indem er darüber fährt. Wenn man das Radar hat, kann man darauf die herumliegenden Teile (blau), die gegnerischen Rover (rot), und den eigenen Rover (grün) sehen.
Der Spieler kann von feindlichen Rovern, die sich in einer Reichweite von einigen Metern befinden mit der Maus Teile stehlen. Wenn ein Rover in Reichweite ist, leuchtet er grün auf.Der Spieler kann allerdings auch von den Gegnern beklaut werden, allerdings nur bei Kollision. Das Spielziel ist es alle Teile zu beschaffen. Das Spiel ist verloren wenn einer der feindlichen Rover alle Teile gesammelt hat.

Hinweise:

Vertex Arrays: leider gibts auf unterschiedlichen Rechnern immer wieder Probleme mit der korrekten Darstellung. Wir konnten den Bug leider nicht finden. Falls Sie den Vertex Array Code sehen wollen: ./src/3space/ModelOBJ.cpp methoden: generate_vertex_arrays und draw_vertex_arrays.
View-Frustum-Culling: cullt auf Grund von (wir vermuten numerische ungenauigkeiten) manchmal Objekte die es nicht cullen sollte.

Wir sind eine 3-er Gruppe aber Stefan Schauer macht nur cg2, desshalb hat er seine 2 Effekt Punkte nicht implementiert.

Die Engine:

Datenstrukturen:
Color: ein RGBA-Farbwert
Image: ein Bild als eindimensionaler unsigned int Array
Texture: eine OpenGL Textur die aus einem Image erzeugt wurde
Material: eine Lambert'sche Oberflächenrepräsentation
Model: ein Dreiecksmesh
DisplayList: Verwaltung einer Opengl Dislplay List (besitzt einen FuncPtr auf den erzeugenden GL-Code).

Renderer:
Die Datenstrukturen Image, Texture und DisplayList werden im Renderer in eigenen Registries registriert, sodass ein bestimmtes Bild nur einmal geladen werden muss, die Textur dazu nur einmal erstellt wird und einmal compilierte Displaylisten von mehreren Scenegraph-Nodes verwendet werden können. Der Renderer verwaltet also alle Entities und macht sie allgemein zugänglich (für die Verwendung auf dem vom Renderer gehaltenen Device Context "Canvas"). Der Renderer enthält zwei Viewer.

Viewer:
Ein Viewer enthält einen Viewport und den Wurzelknoten seines Szenengraphen und setzt die Projektion. Daher gibt es zwei Ausprägungen nämlich P(erspective)Viewer und O(rthogonal)Viewer. Der Perspective Viewer hat eine Kamera. Der Viewer kann seinen Scenegraph "rendern" (=zeichnen) und "picken" (=sichtbare objekte selektieren).

Scenegraph Nodes:
Node: allgemeine Basisklasse aller Szenengraph Knoten.
RootNode: Wurzelknoten.
QuadNode: Texturiertes Viereck
TextNode: Darstellung von Text mit Hilfe eines kleinern Quads pro Zeichen.
MeshNode: Enthält ein Model.

Die Knoten eines Szenengraphen können andere Knoten als Kinder haben, die mit dem Opengl-State ihrer Elternknoten gerendert werden.
Jede Node hat die Möglichkeit ihre Darstellungsfunktion in eine Display List zu compilieren. Nodes vom gleichen Typ können gemeinsam eine einzige Display List verwenden.

Die Szene:
Die Landschaft ist ein statisches Mesh mit etwa 1000 Dreiecken. Die Textur enthält sowohl Struktur als auch vorberechnete Beleuchtung, um weiche Schatten und global Illumination Effekte zu erhalten, die den Realismus der Landschaft um einiges steigern. Für weiteren Realismus sorgt der leichte atmosphärische Nebel, der sich in der Ferne gelblich über das rote Marsgestein legt. Der Rest der Szene ist mit einer Punktlichtquelle beleuchted, die sich genau dort am Kraterrand befindet, wo die Sonnenscheibe angebracht ist.

Features:
Objektorientierter Szenengraph:
ist das Herzstück unserer Engine.
Maya OBJ Loader: Alle Meshes und deren Materialien werden aus Wavefront OBJ files geladen.
Collision detection: Kollisionen der Rover untereinander und mit dem Krater wurden mit Bounding-Spheres realisiert.
Bitmap Fonts: mit Hilfe der TextNode kann man mehrzeiligen Text im orthogonalen oder im perspektivischen Szenengraphen einhängen.

Effekte:
Rauchspuren: Transparent texturierte Patches werden zur Kamara ausgerichtet z-sortiert ausgegeben. Damit wurde der Staub der von den Rovern aufgwirbelt wird modelliert.
Feuer: (animierte Textur) ein Feuer steht in der Mitte des Kraters.
statische LOD: die Enemy-Rover haben unterschiedlich de
tailierte Meshes für verschiedene Entfernungen. bzw das Radhalterungs-Mesh wird ab einer gewissen Entfernung ausgeblendet.

Libraries:
(OpenGL: voraussetzung für die Übung)
FOX Toolkit: (open source C++ Toolkit) für Fenster, GLCanvas, 2D/3D Vektoren, Matrizen und fürs Laden der Bildformate.
Boost: (open source inofficial C++ extension Library) wir verwenden folgenden Boost Llibraries:
* shared_ptr / shared_array: für automatisches Memory Management
* tokenizer: für den OBJ-Loader.

FMOD: (sound library) frei für noncommerzielle Anwendungen.

Die Objekte wurden mit Wings3D und Max modelliert und texturiert. Wings ist ein freier winged-edge-surface subdivision-modeller nach dem kommerziellen Vorbild Nendo.

Building the Game:
To build the game using the provided workspace and project files you should use MSVC6 or use the provided makefile otherwise. The libraries should be installed at C:\fox and C:\boost. if not you have to change the include and lib path's in the workspace
.

Links: FOX, Boost, FMOD, Wings3D