Montag, 22. Oktober 2012

Von grünen Hügeln

Heute setzen wir unsere kleine Reihe mit der 3D-Variante von Simplex Noise fort. Mit ihr ist es möglich, *Trommelwirbel* dreidimensionale Landschaften zu erzeugen.

Für die Erzeugung der Beispiele benutzte ich ein kleines Kommandozeilen-Tool namens tilegen3d, das seinerseits auf die Noise3D-Funktion aus meiner simplexnoise-Go-Bibliothek zurückgreift, die ich schon in der letzten Ausgabe vorgestellt habe. Zur Visualisierung der Ergebnisse wurde die Freie Software ParaView verwendet.

Simplex Noise ist für mehr als zwei Dimensionen definiert, insbesondere auch für drei. In diesen Fall wird eine gegebene Raumkoordinate des auf ein en skalaren Wert aus dem Intervall -1 bis 1 abgebildet. Stellt man diese Werte dann jeweils durch Grauwerte da, sieht das für einen Raumbereich exemplarisch wie in nebenstehender Abbildung aus.
Man kann zwar nicht in den Würfel hineinschauen, aber die Strukturen an der Oberfläche setzen sich im Inneren fort.

Wie hilft uns das jetzt bei der Erstellungen von Landschaften? Wie erwähnt, entsprechende die einzelnen Grauwerte einer Zahl zwischen -1 (schwarz) und 1 (weiß). Man kann jetzt einen Schwellwert festlegen, unter dessen Betrag ein Raumpunkt nicht mehr in die Darstellung übernommen wird und quasi ein Loch in der Struktur hinterlässt. Der Einfachheit halber habe ich den Bereich [-1, 1] mittels Addition von 1 und teilen durch 2 auf das Intervall [0, 1] abgebildet und in obigem Beispiel einen Schwellwert von 0,3 angenommen, unterhalb dessen alle zugehörigen Raumpunkte ignoriert werden. Das führt zum links stehenden Ergebnis. Und - oh Wunder - es sind Höhlen und Tunnel in unserem virtuellen Berg entstanden. Das rechte Bild zeigt einem kleineren Raumausschnitt, der den Effekt etwas deutlicher hervorhebt.

Da wir nun in der Lage sind, dass Innere eines Berges zu generieren, stellt sich die Frage, wie es mit der Oberfläche aussieht. Hier zeigt es sich als Vorteil, dass wir den Wertebereich in den Bereich von Null bis Eins verschoben haben. Befinden wir uns nun übertage, kann man von vereinfacht annehmen, dass statisch betrachtet "oben" (im Sinne am oberen Ende der Raumauschnittes) die Wahrscheinlichkeit auf Erde, Fels etc. zu treffen unter normalen Umständen gleich Null ist. "Unten" auf dem Boden ist sie indes Eins. Dazwischen wird in einem Gradienten  der Wahrscheinlichkeitswert langsam zwischen diesen beiden Extremen variieren.

Betrachtet man jetzt das punktuelle Ergebnis der Simplex Noise-Funktion auch als Wahrscheinlichkeit, kann man diese mit dem Erde/Luft-Gradienten mutiplizieren und erhält wieder eine Zahl zwischen Null und Eins, die man anschließend gegen den Schwellwert halten kann.

Das tilegen3d-Tool erlaubt die Angabe es beliebigen Luft-Start- und eines Boden-Endwertes. Dazwischen wird ein linearer Gradient aufgespannt. Dies erlaubt es, die Steigung so anzupassen, um bei Bedarf unterschiedlich hohe Hügel zu erzeugen.
Ein typisches Ergebnis sieht wie nebenstehend aus.


Dies soll es fürs erste in Punkto Generierung von Landschaften gewesen sein. Wir kommen ggf. später noch mal auf das Thema zurück, denn für ein echtes Minecraft-Szenario fehlen doch einige wichtige Aspekte wie zum Beispiel das Verteilen von mehren Materialien wie Sand, Kies, Fels, Erde, etc. Des weiteren führt diese einfache Anwendung von Simplex Noise partiell zu nicht realistischen Landschaftsformen wie kleinen, in der Luft schwebenden Felsbrocken. Die Wahrscheinlichkeit ist auf dem Gradienten halt nicht ganz Null ;-) Aber diese Feinjustierungen heben wir uns für später auf.

Im folgenden geht der Fokus weg von der Küchenmathematik hin zur Informatik. Ich plane, mich mit den Datenstrukturen auseinander zu setzen, die benötigt werden, um auch große Welten effizient verwalten zu können.

Bleiben Sie dran.

Keine Kommentare:

Kommentar veröffentlichen