Goblin-Arena

Fakten
TypStandalone Game
Aktion, Third-Person
PlattformWindows
EntwicklerFelix Christoph
Benjamin Granzow
StatusTech Demo
TechnologienXNA-Framework 4.0, C#, Bullet-Engine

Konzept

Goblin Arena ist eine Technologie Demo für ein klassisches Arena-Spiels. Zwei gehen rein nur einer kommt raus. Die Hauptfigur ist ein kleiner grüner Goblin der in einer begrenzten Welt herumlaufen kann. Alle 3D-Objekte wurden selbst entworfen und umgesetzt, ebenso wie der Hauptcharakter inklusive Animationen. Die Landschaft wird komplett aus einem Graustufenbild berechnet(Heightmap). Es wurden auch physikalische Funktionen mit Hilfe der Bullet Engine realisiert, Objekte können realistisch fallen und umkippen.

Das Ziel dieses Projektes war das Sammeln von Erfahrungen im Bereich 3D-Spiele-Programmierung. Dabei sollte es hauptsächlich um gängige Standards und Grundlagen gehen, daher wurden nicht viele innovative Ideen umgesetzt, sondern versucht einen soliden Prototyp zu entwickeln. Probleme wie Animation, Texturierung, Physik Berechnung, Import von Objekten aus Dateien, dynamische Implementierung von beliebigen Objekten sollten behandelt werden.

Eigenschaften

  • Animiertes Spielermodel (Modelpipeline)
  • Hightmap (Terrainpipeline)
  • Physik für nicht statische Objekte
  • ausgearbeitetes Statesystem

Untersuchung

3D-Modellierung

Zum erstellen der 3D-Modelle wurde Blender in der Version 2.61 verwendet. Es wurde der zu steuernde Hauptcharakter, sowie viele Dekorationsobjekte modelliert, texturiert, mit Materialien versehen und ins Autodesk FBX-Format exportiert. Dieses Format eignet sich hervorragend, da auf einfache Weise alle Informationen bezüglich des Modells (Vertex-Infos, Texturen, Animationen) in einer einzigen Datei gespeichert werden können. Blender unterstützt außerdem seit der Version 2.59 standardmäßig den Export ins FBX-Format speziell für die Nutzung in Microsoft XNA. XNA unterstützt nativ das FBX-Format, daher lag die Entscheidung nahe dieses Format zu benutzen.

Animationen

Die ersten Animationen wurden durch Motion-Capture mit einer Microsoft-Kinect erstellt. Doch leider mussten wegen technichen Schwierigkeiten alle Animationen im Keyframing-Verfahren per Hand umgesetzt werden. Der Nachteil beim Keyframing ist einerseits, dass die Bewegungen nicht so realistisch wirken wie beim Motion-Capturen, und andererseits viel Zeit benötigt wird, um die Animationen trotzdem ansprechend zu gestalten.

In der Programmierung der Animationen trat das Problem auf, das 3D-Modelle zwar angezeigt werden konnten, aber standardmäßig keine Animationen bzw. Bewegungen unterstützt werden. Daher wurde eine eigene Animationsklasse entworfen, welche Skeletttransformationen speichert. Für das neue Animationsmodel musste ein neuer Importer geschrieben werden, der es erlaubt sehr speicherschonend Animationen zu hinterlegen. Dabei wird nur die Geometrie des Objektes in einer Datei hinterlegt und die Animationsskelette einzeln in weiteren Dateien. Beim Laden durch den Importer werden die einzelnen Animationen in das Model mit eingearbeitet.

Heightmap

Da große Meshes wie eine Weltkarte viel Speicherplatz benötigen, haben wir uns für die effizientere Methode entschieden und eine Heightmap verwendet. Eine Heightmap ist eine Textur aus der erst zur Laufzeit das eigentliche Terrain erstellt wird. Dabei werden die Höheninformationen aus einem Graustufenbild ausgelesen und in ein Mesh umgewandelt. Dieses kann nachträglich beliebig texturiert werden.

Physik und Kollision

Bei der Physik wurde auf die Bullet-Engine zurückgegriffen. Die Physik wird in einem eigenen vereinfachten Abbild der Welt berechnet, daher wäre es ohne weiteres möglich die Physik-Engine leicht auszutauschen. Nachdem ein Schritt in der Physikabbildung berechnet wurde, werden diese Informationen in die sichtbare Welt übertragen. Damit das ganze dynamisch wird, wurde ein Verfahren implementiert, das aus jedem Model die Abmessungen (BxHxT) bestimmt und ein passendes Collision Shape generiert. Daher kann die Physikengine einfach durch beliebige Models erstellt werden.

 

1 Kommentar