Verzerrung, nahtloses Rauschen und wie man damit arbeitet.Wir erzeugen einen Planeten
Eine der einfachsten Möglichkeiten, einen Planeten zu erzeugen, ist die Verwendung von Rauschen. Wenn wir uns dafür entscheiden, haben wir einige mögliche Optionen. Schauen wir uns die einzelnen an und ermitteln Sie die besten:
- Perlin Noise ist die einfachste Option. Das Perlin-Rauschen wurde 1983 von Ken Perlin entwickelt. Es weist einige Nachteile auf - visuelle Artefakte und die Geschwindigkeit bei der Erzeugung großer Bilder sind im Vergleich zu anderen Optionen eher gering.
- Simplex Noise (Simplex Noise) - 2001 von Ken Perlin entwickelt, um die Defekte des Perlin-Rauschens zu beseitigen Dies ist eine sehr wertvolle und schnelle Lösung, jedoch mit einem schwerwiegenden Nachteil: Die Verwendung von dreidimensionalem Simplex-Rauschen ist durch ein Patent geschützt, was es ziemlich teuer macht.
- Open Simplex Noise - KDotJPG wurde mit einem einfachen Ziel entwickelt: eine moderne und kostenlose Version von Simplex Noise zu erstellen, relativ schnell und ohne Verzerrung.
Von diesen dreien bevorzuge ich persönlich Open Simplex Noise, das ich in meinen persönlichen Projekten verwende. Es ist erwähnenswert, dass in der aktuellen OpenSimplexNoise-Implementierung zusätzliche Arbeit erforderlich ist, um einen einfachen Zugriff auf
Skalierung, Oktaven und Generatoren zu erhalten . Im Internet gibt es viele Informationen darüber, was jedes dieser Elemente bewirkt, und ich empfehle Ihnen dringend, es zu studieren. In meinem Artikel werde ich jedoch nicht darüber sprechen.
So sieht Open Simplex Noise mit 16 Oktaven aus.Nahtloses Geräusch
Das Rauschen ist endlos, was bedeutet, dass, wenn wir einfach eine Leinwand mit einem Seitenverhältnis von 2: 1 erstellen, um eine
Projektion mit gleichem Abstand zu erhalten , diese nicht
überlagert wird, wenn
sie einer Kugel überlagert wird (ich bedanke mich bei dieser erstaunlichen Website), sondern auf einer horizontalen Naht und an den Polen große Unterschiede.
Lärm ohne Nähte.Beachten Sie die riesigen Nähte, die auftraten, als das Rauschen auf die Kugel angewendet wurde.Es gibt viele Möglichkeiten, dies zu beheben.
In diesem hervorragenden Beitrag von Red Blob Games
[ Übersetzung auf Habré] war es beispielsweise ausreichend, eine Insel mit einer Funktion zu generieren, die den Abstand zum Zentrum als Variable empfängt und die Höhe 0 an den Rändern festlegt, um die Nähte zu minimieren.
Dies ist jedoch nicht das, was wir brauchen. Wir wollen einen Planeten mit der Möglichkeit der Existenz des Nord- und Südpols erzeugen, und dafür benötigen wir komplexere mathematische Berechnungen.
Sphärische Überlagerung
Eine Methode, mit der sphärische Planeten erzeugt werden können, besteht darin, die kartesischen Koordinaten unserer Leinwand in sphärische Koordinaten umzuwandeln, basierend auf diesen Koordinaten Rauschen zu erzeugen und das Rauschen dann wieder in kartesische Koordinaten umzuwandeln und auf die Leinwand anzuwenden.
Diese Implementierung hat jedoch ihre Grenzen, deren Ursachen in einem
erstaunlichen Beitrag von Ron Valstar aufgezeigt werden . Das Wichtigste ist, dass die Formen der Kontinente in diesem Fall äußerst seltsam und verzerrt aussehen. Daher werden wir diese Option nicht verwenden.
Überlagerung mit sphärischem Rauschen. Seltsame Formen und Verzerrungen machen die Kontinente ziemlich hässlich.Aber zumindest gibt es keine Nähte mehr.Kubische Überlagerung
Als Ergebnis habe ich die zweite Methode verwendet, die aus einem Beitrag von Ron Valstar und einer Reihe von Artikeln von acko
Making Worlds stammt . Sie beschreiben die Erzeugung eines Globus durch die Erzeugung eines Würfels und seine "Inflation", als wäre es ein Ballon, bis er ein Beispiel für die Form einer Kugel war.
Bild von acko.net genommen. Es erklärt das Konzept einer kubischen Karte auf einfache visualisierte Weise.Jetzt müssen wir nur noch sechs Gesichter erzeugen, was recht einfach ist. Es gibt viele Möglichkeiten, dies zu tun.
Am Ende habe ich beschlossen, ein Array zu erstellen und es mit Daten zu füllen. Ich habe die 2D-Koordinaten der Leinwand in die 3D-Koordinaten des Würfels konvertiert und dann für jede dieser 3D-Koordinaten Rauschen generiert, sodass ich sie auf dem entsprechenden 2D-Koordinatenwert gespeichert habe.
Auf diese Weise können wir eine kubische Karte erstellen, die
mit dem wunderbaren Code von Bartosz leicht in eine Projektion
mit gleichem Abstand konvertiert werden kann.
Algorithmus erzeugte kubische Karte.Äquidistante Transformation einer kubischen Karte.Ein kubischer Kartenglobus, der auf maptoglobe.com gerendert wurde.Wie Sie sehen können, hat eine äquidistante Karte viel schönere Formen, und wenn sie einer Kugel überlagert wird, erzeugt sie ähnliche Ergebnisse wie die sphärische Überlagerung, ohne all ihre Nachteile. Übrigens kann eine äquidistante Projektion von verschiedenen Programmen, beispielsweise
NASA G.Projector ,
problemlos in nahezu jeden Kartentyp konvertiert werden.
Abschließend
Das Erzeugen eines ganzen Planeten kann wie eine entmutigende Aufgabe erscheinen, und obwohl Rauschen bei korrekter Verwendung ein ziemlich mächtiges Werkzeug ist, hat es seine eigenen Probleme, mit denen Menschen seit vielen Jahrhunderten konfrontiert sind, wie das Überlagern eines Globus auf einer 2D-Leinwand mit minimaler Verzerrung.
Die von mir vorgeschlagene Lösung erzeugt sehr grob erzeugte Planeten, die tektonische Platten, Flüsse, Inselketten und sogar Berge nicht berücksichtigen, und kann daher nur als Demonstration oder als Grundlage für komplexere Simulationen verwendet werden.
Tatsächlich wird nur eine Wertematrix in einem bestimmten Wertebereich erstellt. Für Graustufenbilder ist dies 0-255. Die Werte werden dann in ein Pixel konvertiert, das ein Bild ähnlich dem ersten Bild in Graustufen erstellt, oder in ein Bild im Bereich von -11000 bis 8000, um den realen Höhenunterschied zu simulieren. Anschließend werden die Pixel gemäß den Höhenintervallen gefärbt
(z. B. Werte ab 0) 5 sind sandfarben gefärbt, um die Küste zu simulieren) .
Beim Aufbau des Universums verwendete Gott Mathematik auf höherer Ebene.
- Paul Dirac