Terrain Generation in der Cube2 Engine

Die Cube2-Engine verfügt über einen exzellenten in-game Map-Editor. Basierend auf einem Octree, können Cubes auf allen sechs Seiten deformiert werden. Das Format spart nicht nur Platz auf der Festplatte, sondern auch im Arbeitsspeicher. Damit ist es möglich große 3D-Welten auch auf resourcenschwacher Hardware darzustellen. Da die Welt jedoch nicht einfach aus einer Menge von Vertices besteht, ist die Implementierung eines Terrain Generators deutlich aufwändiger.

Der grundlegende Algorithmus ist Simplex-Noise, eine Weiterentwicklung von Perlin-Noise. Vorteil des Algorithmus gegenüber seinem Vorgänger ist es, dass er in höheren Dimensionen deutlich performanter ist. Das Ergebnis des Algorithmus ist eine Höhenmap für entweder 2D oder 3D. Wird Simplex-Noise für 2D generiert, bekommt man pro x,y-Koordinate einen Höhenwert, also den z-Wert. Somit erhält man eine hügelige Landschaft. Wird Simplex-Noise jedoch für 3D generiert, bekommt man einen Dichtewert pro x,y,z-Koordinate. Dieser Dichtewert bewegt sich zwischen einem Minimum und einem Maximum, üblicherweise zwischen 0 und 1. Setzt man einen Grenzwert, beispielsweise 0.5, kann man zwischen solidem Gestein und Luft unterscheiden. Ein Dichtewert an einer Position x,y,z ist Gestein, wenn er den Grenzwert unterschreitet, ansonsten Luft. Außerdem ist es möglich das Spektrum zwischen 0 und 1 in mehrere Segmente aufzuteilen, um beispielsweise mehrere Schichten unterschiedlichen Gesteins zu erzeugen. Tiefere Schichten bestehen beispielsweise aus Granit, höhere Schichten aus Erde.

Um Höhen- und Dichtewerte in der Cube-Engine zu nutzen, muss die Map in gleich große Blöcke eingeteilt werden. Der Wert entscheidet darüber, ob ein Block erstellt wird oder ob der Platz frei bleibt. Diese Welt ist jedoch eine Klötzchenwelt und damit ist der Realitätsgehalt sehr niedrig. Die Blöcke mussen nun noch interpoliert werden, um nahtlos aneinander anzuschließen. Dazu ist ein weiterer Algorithmus zuständig: Marching Cubes. Dabei werden die Blöcke weiter in kleinere Blöcke zerlegt und für jeden kleineren Block bestimmt, wie die Oberfläche des größeren Blocks diesen kleineren Block durchschneidet. Abhängig davon wird eine von 15 möglichen Deformationen durchgeführt. Damit ist die Geometrie erzeugt.

Um Lichter zu setzen, wird wiederum der Dichtewert bemüht. Es wird derjendige Punkt ausgewählt, der in der Mitte einer Höhle, d.h. garantiert in der Luft und in einiger Entfernung zu einer Wand, ist. Dies erreicht man indem man wiederum einen Grenzwert bestimmt, der deutlich größer ist, als der Grenzwert zwischen Gestein und Luft, aber etwas niedriger als das Maximum. Außerdem wird ein Minimalabstand zwischen den erzeugten Lichter eingehalten um eine gleichmäßigere Ausleuchtung zu erzielen.