Dies ist die Dokumentation des Anfängerpraktikums von Selina Kunkel und Sascha Hund unter der Betreuung von Dr. Susanne Krömker
(Visualization and Numerical Geometry Group, IWR Universität Heidelberg). Ziel dieses Praktikums war die Erstellung einer Virtual
Reality Rollercoaster-Strecke, sowie das Modellieren einer zugehörigen Landschaft, wobei es bei der Umsetzung freigestellt war,
eine reale Vorlage zu verwenden oder ein fiktives Szenario zu entwerfen.
Wir haben uns für ein Szenario mit Bezug zur Universität Heidelberg entschieden und deswegen einen Teil des Neuenheimer Feldes als
Grundlage der Strecke ausgewählt.
Das uns zur Verfügung gestellte Head-Mounted Display war die Oculus Rift Development Kit 2, die
auch als "Crystal Cove" bezeichnet wird und sich durch ein Full HD OLED Display mit einer Auflösung von 960x1020 Pixel pro
Auge (Gesamtauflösung: 1920x1020 Pixel), sowie ein Head-Tracking System, das über eine am Monitor des Benutzers befestigte Kamera die in
der Brille verbauten Infrarot-LEDs erfasst, auszeichnet. [1]
Zur Verwendung der Oculus Rift wird die Oculus Software benötigt, die neben den Treibern auch den offiziellen Store enthält und
zudem die Möglichkeit bietet, sich mit Freunden zu verbinden.
Zur Modellierung der Rollercoaster-Strecke und der Landschaft haben wir uns für die Unreal Engine von Epic Games in der Version 4.16.3 entschieden,
da sie das Oculus Rift SDK bereits seit der Version 4.13 enthält und eine umfangreiche Dokumentation bereitstellt. [2]
Weitere wichtige Features der Engine sind die "Blueprint Spline Components", welche die Grundlage des von uns verwendeten
Plugins SimpleCoaster darstellt, sowie die "Hierarchical Level of Details", die es erlauben, mehrere Static Mesh Actors
zu einem einzigen zusammenzufassen, um die Draw Calls pro Frames zu reduzieren und damit den Ressourcenverbrauch zu verringern,
ohne die Grafikqualität des gestalteten Levels merklich zu beeinflussen. [3]
Das SimpleCoaster Plugin beinhaltet Klassen zur Erstellung der Schienen sowie Trigger-Stellen, die der Geschwindigkeitsregulierung
dienen.
Als Versionskontrollsystem haben wir Git über die Gitlab-Server verwendet und das Demo-Video mittels der Software TinyTake von MangoApps erstellt.
Grundlage unserer Rollercoaster-Strecke ist das SimpleCoaster-Projekt, wobei wir hier das Test-Level entfernt und ein
neues, leeres Level angelegt haben, sodass wir die Assets des Plugins nutzen konnten. Diese bestehen aus den Klassen TrackSpline, Trigger_AddVelocity Trigger_Brake
und Trigger_Climbing, sowie gegebenenfalls zugehörigen Materialien, Texturen und Audiofiles.
Da sich unsere Vorlagen zur Modellierung der Gebäude auf öffentlich verfügbare Karten beschränkten und diese hauptsächlich zur Kontrolle der
zweidimensionalen Relationen zuträglich waren, bestand ein erster Schritt der Umsetzung in der Anfertigung zahlreicher Fotos. Diese erlaubten uns
die Gebäudefassaden bis zum gewünschten Detailgrad nachzubilden und zudem die Höhe der einzelnen Gebäude in Relation zueinander abzuschätzen.
Als Referenzobjekt bezüglich der Maße erstellten wir zunächst eine grobe Version des Mathematikons, wobei sich diese Maße durch die vom Editor und Plugin vorgegebenen
Elemente (eine Wand mit Türrahmen sowie das TrackSpline) unter Nachbildung der fünften Etage ergaben.
Durch die Maße des Mathematikons konnten wir anschließend die Grundplatte des Levels erstellen und in einem nächsten Schritt Landschaft und Straßen bzw. Wege modellieren.
Hierfür boten sich die in der Engine verfügbaren Landscape-Modellierungstools an, mithilfe derer wir eine natürliche Begrenzung des Levels in Form von Bergketten erstellten,
sowie der integrierten Spline-Funktion, die sich für die Modellierung der Wege eignete.
Da wir abgesehen von den Gebäuden, die wir mit dem Rollercoaster betreten, keine Innenräume gestaltet haben, war es notwendig, ein eigenes
Glas-Material zu erstellen, das zwar den Eindruck von echtem Glas vermittelt, das Licht allerdings so sehr reflektiert, dass die dahinterliegenden
Räume nicht einsehbar sind.
Dieses Material wurde anschließend für die meisten Fenster verwendet, wobei nur einige Ausnahmen, wie bspw. das INF 252 oder die Gewächshäuser
der biologischen Fakultät, mit dem originalen Glas-Material versehen wurden.
Auch mussten verschiedene Texturen, wie zum Beispiel die der Straßen oder auch die im Flur des Mathematikons ausgehangenen Bilder, erstellt werden. Texturen lassen sich in der Unreal Engine aus verschiedensten Dateien erstellen; im Falle der Bilder waren es PNGs, die importiert wurden.
Die Gebäude wurden ausgehend von den Karten und Fotos mithilfe von Geometry Brush Actors modelliert. Geometry Brush Actors sind einfache
geometrische Figuren, wie etwa Würfel, die durch Änderung der Seitenlängen umgeformt und angepasst werden können.
Geometry Brush Actors können sowohl Volumen hinzufügen, als auch wegnehmen. So kann beispielsweise eine Fensteröffnung aus einer bestehenden
Wand genommen werden, indem der Geometry Brush Actor auf "substractive" gesetzt wird. Dabei ist es allerdings wichtig, die Reihenfolge zu
beachten. Wird die Fensteröffnung vor der Wand im Level platziert, so hat die Öffnung keinerlei Effekt. Diese Regelung erlaubt das
Einfügen von weiteren Volumina in Hohlräumen, die über solche substractive Geometry Brush Actors erzeugt wurden.
Geometry Brush Actors werden häufig nur als Platzhalter für Static Meshes verwendet, da diese einerseits deutlich komplexere Formen
erlauben und außerdem sehr viel effizienter gerendert werden können.
Da wir die gesamte Modellierung über die Unreal Engine selbst und nicht über weitere 3D-Modellierungsprogramme durchgeführt haben, konnten wir
die Gebäude zwar nicht durch aufwendig gestaltete Grafiken ersetzen, aber aus Performance-Gründen zumindest aus den vorhandenen Brushes
direkt in der Engine Static Meshes erstellen. Diese Optimierung konnte allerdings erst nach Fertigstellung der Modelle vorgenommen werden,
da bei Static Meshes lediglich Größe und verwendete Texturen angepasst werden können, die Form allerdings unveränderlich ist.
Nachdem die Außenfassaden der Gebäude modelliert worden waren, widmeten wir uns den Innenräumen des INF 252 und des Mathematikons, wobei wir auf vorhandene Assets wie Stühle, Tische u.a. zurückgriffen, die teilweise noch durch eigene bzw. modifizierte Texturen angepasst werden mussten.
Einer der letzten Schritte war das Erstellen der Rollercoaster-Strecke. Durch das SimpleCoaster-Plugin lässt sich eine Strecke durch das Einfügen der
TrackSpline-Klasse erstellen. Dieses anfängliche TrackSpline lässt sich an jeweils einem Ende bewegen und ziehen, wobei jederzeit ein neuer Punkt hinzugefügt werden kann,
der dann einen neuen Streckenabschnitt markiert. Alle Punkte lassen sich im Nachhinein noch bewegen oder gegebenenfalls löschen. Die Strecke kommt zustande, indem
so viele solcher Abschnitte eingefügt werden, dass ein realistischer Verlauf der Strecke entsteht. Sind alle notwendigen Punkte gesetzt, kann über den Menü-Punkt "Closed Loop"
der letzte Abschnitt mit dem Initialen verbunden werden. Viele Punkte müssen dann für einen sanfteren Streckenverlauf, oder um einen spannenderen Verlauf zu erhalten,
manuell rotiert und bewegt werden.
Ist die Strecke angepasst, muss ein Camera Actor dem Startabschnitt zugewiesen werden. Da die Kamera dann automatisch dem Streckenverlauf folgt, ist für dieses
Virtual Reality Level kein Controller notwendig.
Ein letzter Punkt der Streckengestaltung besteht in der Regulierung der Geschwindigkeit. Global kann eine Mindestgeschwindigkeit gesetzt werden (diese kann zwar durch
entsprechende Trigger unterschritten werden, nicht aber durch beispielsweise steile Anstiege im Streckenverlauf), allerdings muss jeder Abschnitt für ein realistischeres
Fahrgefühl manuell eingestellt werden.
Im letzten Teil der Modellierung wurden landschaftliche Details, wie etwa ein Teich, Sträucher und Bäume, hinzugefügt, sowie die Beleuchtung, die bisher lediglich aus dem Skylight bestand, erstellt. Aus Performance-Gründen musste die Flora aber leider stark reduziert werden.
Die Demo des Projekts zeigt einen Durchlauf mit dem Rollercoaster, wobei allerdings auf den Sound verzichtet und die Kameraausrichtung während der Fahrt nicht verändert wurde.