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
detailierte 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.