Entwicklertagebuch
Meersimulation in Anno 1404

 

Im zweiten Teil des Entwicklertagebuchs stellen wir euch die Simulation des Meeres vor. Da in Anno 1404 ein Großteil der Welt aus Wasser besteht und die Schifffahrt eine entscheidende Rolle innerhalb des Spiels einnimmt, liegt ein besonderes Augenmerk auf der Darstellung des Wassers. Aber was macht die Darstellung von Wasser so besonders? Zu den wichtigsten Merkmalen zählen unter anderem die Wellenform, die Wellenbewegung, die Reflektion von Licht und die Brechung sowie Absorption von Licht innerhalb des Wassers. Weiterhin existieren innerhalb einer Welt verschiedene Klimazonen, die sich durch unterschiedliche Wellen und Farbgebungen bemerkbar machen. Damit alle diese Merkmale realisiert werden können, muss die Simulation in mehrere Schritte aufgeteilt werden.

Refraktion & Reflektion

Zur Realisierung der Brechung bzw. Reflektion der Umgebung müssen vorerst die sogenannte Refraction- und Reflection-Map gefüllt werden. Die Refraction- bzw. Reflection-Map kann man sich als zwei Texturen vorstellen, in die alle Objekte sowie die Landschaft hinein gezeichnet werden. In einem späteren Schritt können die zwei Texturen dann auf das Wasser projiziert werden und realisieren damit die Brechung der Umgebung unterhalb des Wassers sowie die Spiegelung der Umgebung über dem Wasser. Allerdings werden nicht alle Objekte in beide Texturen gerendert, sondern auf diese aufgeteilt. Alle Objekte, die sich oberhalb des Meeresspiegels befinden, werden an diesem gespiegelt und in die Reflection-Map gezeichnet. Objekte unterhalb des Meeresspiegels werden hingegen in die Refraction-Map gezeichnet und erhalten außerdem eine erweiterte Beleuchtung, die sich in Form von “Caustics“ bemerkbar macht. Durch die Berechnung von Caustics simuliert die Engine Lichtstrahlen, die durch das Wasser gebündelt werden und damit einige Bereiche innerhalb des Wassers aufhellt und andere wiederum abdunkelt. Zusätzlich wird dabei Licht absorbiert je tiefer es in das Wasser eindringt.


Wellensimulation

Die darauf folgenden Schritte dienen der Generierung des Wellengangs. Dabei unterscheidet die Engine zwischen zwei Wellenarten: die Standardwellen und die „dynamischen“ Wellen. Im Gegensatz zu den Standardwellen entstehen dynamische Wellen durch den Einfluss von Objekten. So ermöglicht diese Technik zum Beispiel die Realisierung des Fahrwassers von Schiffen oder die Darstellung spezieller Brandungseffekte.

Wie zur Simulation der Refraktion und Reflektion benötigen auch die dynamischen Wellen eine Textur, die Dynamic-Wave-Map. Anstatt, wie normalerweise üblich, dort Farben von Objekten zu speichern, verwendet die Dynamic-Wave-Map ihre Farbkanäle um Informationen über die dynamischen Wellen zu speichern. Dazu zählt z.B. die Höhe der Welle und wie viel Schaum die Welle erzeugt. Aus diesem Grund werden in die Dynamic-Wave-Map nur spezielle Effekte gezeichnet und keine Objekte. Nach dem Erstellen der Dynamic-Wave-Map wird der Wellengang des Meeres mit den dynamischen Wellen kombiniert und innerhalb einer Displacement-Map gespeichert. Während dieser Berechung kann der Wellengang verändert werden, unter anderem die Höhe der Wellen oder deren Geschwindigkeit. Dadurch kann die Engine von ruhiger See (flache langsame Wellen) bis hin zur rauen See (mit spitzen und sehr hohen Wellen) jeden Meereszustand darstellen und zur Laufzeit ändern.

Rendering

Im letzten Schritt folgt das eigentliche Rendering der Wassergeometrie. Damit das Rendering möglichst effizient vonstatten geht, wird die Geometrie nur innerhalb des sichtbaren Bereichs dargestellt. Dazu wird ein Grid (Gitternetz) mit Hilfe des Kamera-Frustums (Blickfeld der Kamera) auf die Meeresoberfläche projiziert. Dieses Grid besitzt immer die gleiche Struktur, unabhängig davon, wie nah sich die Kamera am Wasser befindet. Durch den Einsatz dieser Technik werden eine detaillierte Darstellung und eine konstante Leistung für das Rendering erreicht.

Schließlich werden alle vorherigen Schritte im letzten Schritt kombiniert. Dazu wird zuerst die Geometrie anhand der erzeugten Displacement-Map verändert, wodurch sie ihre Wellenform annimmt. Zusätzlich wird die Refraction- und Reflection-Map auf das Wasser projiziert, die Beleuchtung für das Wasser berechnet, der Schaum generiert und dem Meer seine Farbe gegeben.


Interaktion

Verbessert wurde nicht nur die Darstellung des Wassers, sonder ebenfalls dessen Interaktion mit den Objekten. Dies stellt insofern ein Problem dar, weil alle Schritte zur Berechnung des Wassers, einschließlich der Berechnungen des Wellengangs, auf der GPU ausgeführt werden. Die Positionierung und Ausrichtung der Objekte hingegen werden von der Engine ausgeführt, also auf der CPU. Um die Interaktion zu ermöglichen, muss deshalb jeder Punkt auf dem Wasser von der Engine reproduzierbar sein. Ist dies möglich, kann die Position sowie die Ausrichtung der Objekte dem Wellengang angepasst werden, wodurch beispielsweise Schiffe und Treibgut sanft mit den Wellen schaukeln.

See

Die Darstellung der Seen erfolgt nach einem ähnlichen Prinzip wie die des Meeres. Allerdings verfügen Seen über keinen hohen Wellegang, weshalb die Simulation der Wellen stark vereinfacht wurde und beim Rendering auf ein projiziertes Grid verzichtet wird. Im Gegensatz zur Engine von Anno 1701 kann die neue Engine mehrere Seen auf unterschiedlichen Höhenlagen darstellen, ohne das Probleme bei der Darstellung von Refraktion und Reflektion entstehen.

von Sven Janusch (Software Developer, Related Designs)

 

               

© © 2015 Ubisoft Entertainment. All Rights Reserved. Anno 2205, Ubisoft and the Ubisoft logo are trademarks of Ubisoft Entertainment in the US and/or other countries.
Anno, Blue Byte and the Blue Byte logo are trademarks of Ubisoft GmbH in the US and/or other countries.
Datenschutz | Nutzungsbedingungen | Impressum | Kontakt | Jobs | Presse | Händler | Support | Über Ubisoft