LU Computergraphik 2 SS 4.0, 186.165

Michael Wimmer


 

Aufgabendefinition

Ziel des 2. Abschnitts ist es, mit Hilfe von OpenGL ein einfaches texturiertes 3D-Spiel zu programmieren. Dazu soll in OpenGL eine komplette 3D-viewing-Pipeline implementiert werden. Software und Unterlagen, die euch die Aufgabe erleichtern, findet ihr hier und hier und natürlich in den Einführungsvorträgen (1, 2, 3).

Benotungsschema

Insgesamt gibt es für die 2. Abgabe 25 (von insgesamt 100) Punkten. Die Bewertung setzt sich nach folgenden Kriterien zusammen:

  • Grundlegendes Gameplay (5 Punkte)
  • Bewegte Objekte (4)
  • Texturierte Objekte (4)
  • Einfache Beleuchtung (4)
  • Frei bewegbare Kamera (4)
  • Funktionierende Steuerung (4)

Zusätzlich muss eine kurze Dokumentation abgegeben werden. Im Folgenden findet ihr eine detailliertere Beschreibung sowie einige Tipps und Hinweise zur Umsetzung.

Entwicklungsschritte - Anforderungen

Allgemeines

Plant eure Zeit gut!

Es macht keinen Sinn, sich bei der 2. Abgabe in komplizierte Menüsysteme zu verstricken, ein komplexes Shader-Framework zu implementieren, oder sich tagelang mit Objekt-Loadern herumzuspielen. Die 2. Abgabe soll kein Technologie-Demo sein, sondern ein in allen Belangen (also Graphik, Steuerung, aber auch Spieldesign) einfaches Spiel. Nehmt daher lieber einfache Objekte ohne Loader, dafür können diese Objekte schon miteinander interagieren.

Entwurf der Datenstrukturen

Ihr benötigt Datenstrukturen, um die 3D Objekte, die im Spiel vorkommen sollen, zu repräsentieren. Unter OpenGL braucht man dazu üblicherweise Zugriff auf die einzelnen Eckpunkte des Objekts, auf die Texturkoordinaten sowie die Normalvektoren der einzelnen Eckpunkte.

Bei der 2. Abgabe müssen die Objekte noch nicht sehr komplex sein, ihr müsst also noch nicht unbedingt ein Dateiformat für Objektdaten erstellen (obwohl das im Hinblick auf die 3. Abgabe natürlich sinnvoll ist).

Entwurf eines Kameramodells

Da ihr die Objekte aus jeder beliebigen Position im Raum darstellen müsst, solltet ihr ein Kameramodell entwerfen, um die richtigen OpenGL-Transformationsmatrizen zu generieren, die für die Transformation der Objekte in das Bildschirmkoordinaten-System notwendig sind. Die Kamera sollte möglichst frei bewegbar sein (je nach Spieltyp).

Bewegte Objekte

Es müssen, wie in den meisten Spielen, ein paar bewegte Objekte vorkommen. Die Objekte selbst müssen noch nicht animiert sein, sich sondern nur selbst oder bei Interaktion bewegen.

Implementierung von Texture Mapping:

Jedes Objekt, das texturiert werden soll, benötigt Texturkoordinaten. Wenn ihr im 2. Abschnitt noch keine Bitmap-Dateien einlesen könnt, genügt es, wenn ihr prozedurale Texturen (z.B. Schachbrett-Muster) verwendet. Auf jeden Fall müssen die Texturen aber korrekt auf den Objekte angebracht werden.

Beleuchtung und Materialien

Einige nicht-texturierte Objekte (oder, falls alle Objekte texturiert sind, einige texturierte Objekte) müssen mit einem Material versehen werden. Dazu sind 3 Schritte erforderlich:

  • Es muss zumindest eine Lichtquelle definiert sein.
  • Jedem Objekt muss ein Material zugewiesen werden.
  • Jedes Objekt muss mit Normalvektoren versehen werden.

Bei den Normalvektoren müsst ihr 2 Fälle berücksichtigen:

  • Die darzustellende Fläche ist flach (z.B. Kanten eines Tisches):
    Hier müssen für alle Eckpunkte einer Fläche dieselben Normalvektoren angegeben werden!
  • Die darzustellende Fläche ist gekrümmt:
    Hier sollten die Normalvektoren in den Eckpunkten der Krümmung der eigentlichen Fläche entsprechen. Das kann man z.B. durch Mitteln der Normalvektoren der angrenzenden Flächen erreichen (siehe dazu auch die entsprechenden Kapitel im Redbook).

In der 2. Abgabe müssen noch keine gekrümmten Flächen vorkommen. Gebt auch darauf acht, dass jede Lichtquelle die Darstellungsgeschwindigkeit reduziert. Versucht daher, mit so wenig Lichtquellen wie möglich auszukommen.

Spieldesign

Ganz wichtig ist, dass ihr nicht nur eine 3D-Engine abgebt. Auch die 2. Abgabe sollte schon spielbar sein. Es kann eine sehr vereinfachte Spielvariante sein (nur 1 Level, sehr einfache Objekte, keine Collision Detection/Sound, etc.), aber die Spielbarkeit geht entscheidend in die Bewertung ein.

Auch beim Spieleevent kommt ein funktionierendes Spiel bestimmt besser an, als die tollste Grafik ohne jegliches Gameplay!

Sonstige Anforderungen

  • Die Objekte müssen selbstverständlich mit der richtigen Sichtbarkeit dargestellt werden (das ist in OpenGL durch den Z-Buffer trivial).
  • Achtet darauf, dass euer Spiel auf unterschiedlich schnellen Rechnern ausgeführt werden kann. Außerdem braucht die Hardware für manche Blickpunkte länger zum Rendern als für andere. Die Bewegung der Objekte bzw. die Kamera-Steuerung sollte daher an die aktuelle Rendergeschwindigkeit angepasst werden (z.B. durch Messung der Zeit, die das vorige Bild zur Anzeige benötigt hat).
  • Die Steuerung sollte halbwegs intuitiv sein, und vor allem mit Polling realisiert werden (siehe Tips und Tricks sowie den allgemeinen Teil).
  • Vorsicht bei gekrümmten Oberflächen und Specular Lighting:
    Man erwischt leicht einen zu großen spekulären Anteil bzw. Exponenten, was zur Folge hat, dass die Oberflächen sehr unrealistisch ausschauen (z.B. der Effekt, dass die Oberfläche von vielen Betrachtungswinkeln einfach weiß aussieht).

Restriktionen

Lest Euch den Punkt Restriktionen auf der Software-Seite durch, um sicherzugehen, dass alle Zusatztools, die ihr verwenden wollt, auch bei der Übung erlaubt sind!

Abgabe und Dokumentation

Für die Abgabe geht wie in "Bewertung und Benotung" beschrieben vor.

Wichtig: Beschreibt ALLE Features und Fähigkeiten eures Programms, und zwar so, dass man sie finden kann (z.B.: Raumschiff mit direktionaler Lichtquelle beleuchtet), sowie zusätzlich etwaige Feinheiten, Programmiertricks und Besonderheiten (Spezialeffekte, Objekt-Loader, ...)! Was hier nicht drinsteht, läuft Gefahr, bei der Bewertung übersehen zu werden!

Falls ihr bei dieser Abgabe schon komplexere Interaktionsfolgen habt (das kann schon allein das Öffnen einer Tür im Spiel sein :-), inkludiert bitte auch eine Schritt-für-Schritt-Anleitung, wie man durch das Spiel kommt.

Neben den in "Bewertung und Benotung" erwähnten Punkten sollte folgendes vorkommen:

  • Kurzbeschreibung der Implementierung, insbesondere eine kurze Beschreibung, wie die einzelnen Punkte der Angabe (siehe oben) umgesetzt wurden.
  • "Features" des Spiels.
  • Welche Objekte wurden wie beleuchtet (Angabe der Lichtquellen mit Typ) bzw. texturiert?
  • Welche zusätzlichen Libraries (z.B. für Collision, Objekt-Loader, Sound, ...) wurden verwendet, mit Quellenangabe (URL) (siehe auch Restriktionen)?

Die Deadline für diese Abgabe findet ihr auf der Hauptseite.