Wie wird eine 3D-Perlin-Rauschfunktion zum Generieren von Gelände verwendet?


20

Ich kann meinen Kopf mit einer 2D-Perlin-Rauschfunktion umwickeln, um den Höhenwert zu generieren, aber ich verstehe nicht, warum eine 3D-Perlin-Rauschfunktion verwendet wird. In Notchs Blog http://notch.tumblr.com/post/3746989361/terrain-generation-part-1 erwähnte er die Verwendung einer 3D-Perlin-Rauschfunktion für die Geländegenerierung in Minecraft. Weiß jemand, wie das gemacht würde und warum es nützlich wäre? Wenn Sie x-, y- und z-Werte übergeben, bedeutet dies nicht, dass Sie bereits die Höhe haben?

Antworten:


19

2D-Perlin-Rauschen ist gut für Höhenkarten, aber in diesem Fall scheint er keine Höhenkarte zu verwenden. Stattdessen hat er ein 3D-Gitter, in dem jede Zelle leer sein kann. Dies ermöglicht Höhlen und solche Formationen, bei denen die Bodenhöhe für einen gegebenen 2D-Ort kein einziger Wert ist.


14

Anstatt die "Bodenhöhe" abzutasten, habe ich den Geräuschwert als "Dichte" behandelt, wobei alles, was niedriger als 0 ist, Luft ist und alles, was höher als oder gleich 0 ist, Boden ist.

Einfach ausgedrückt, wird für jede Stelle, an der sich ein Block befinden kann, eine Rauschfunktion ausgewertet, und wenn sie> 0 ist, wird ein Block platziert. Die Rauschfunktion von Notch wird verzerrt, indem die Höhe vom Wasserstand zum Wert addiert wird. Aus diesem Grund sind die unteren Bereiche größtenteils fest (die Höhe ist negativ, also ist die Höhe + das Rauschen ebenfalls negativ) und die oberen Bereiche sind größtenteils leer (die Höhe ist positiv, also die Höhe) + Rauschen ist auch positiv).

Es gibt wahrscheinlich eine zusätzliche Alchemie, um zu entscheiden, welche Art von Block erzeugt wird, und um Höhlen zu schnitzen. Aber ich denke, es hängt nicht direkt mit dieser Rauschfunktion zusammen.

Beachten Sie auch, dass diese Methode für Notch funktioniert, da Minecraft ein voxelbasiertes Terrain hat. Wenn Sie versuchen würden, dies in einer polygonbasierten Welt umzusetzen, würde es nicht ausreichen, nur die Rauschfunktion abzutasten. Sie müssen einen Algorithmus verwenden, um Samples in eine Oberfläche zu verwandeln und Polygone zu erstellen, die sich dieser Oberfläche annähern. Ein solcher Algorithmus ist das Marschieren von Würfeln .


8

3D-Lärm wird obligatorisch, wenn das Gelände Höhlennetzwerke und Überhänge benötigt.

Um eine Isofläche aus Dichteinformationen zu extrahieren, sind die 2 beliebtesten Techniken Marching Cubes (MC) und das neuere Dual Contouring (DC). Die benötigte Datenstruktur ist je nach gewählter Methode sehr unterschiedlich.

Wie bereits erwähnt, ist der Artikel zu GPU Gems 3 von Geiss ein sehr lehrreicher Ausgangspunkt für das Verständnis und die Implementierung von MC-Terrains auf der GPU.

Da die Dichtedaten von MC-Voxeln nur an den Rändern von Voxeln verbleiben können, kann der klassische MC das Volumen konturieren, ohne scharfe Kantenmerkmale beizubehalten. DC hat diesen Nachteil nicht, da die Dichteinformationen als 3D-Punkt (QEF-Minimierer) ausgedrückt werden, der sich an einer beliebigen Stelle im Voxel befindet, plus dem Vorzeichen an jeder Ecke.

Andererseits leidet MC nicht unter sich selbst schneidenden Flächen, da alle erzeugten Dreiecke in ihren entsprechenden Voxeln eingeschlossen sind, während DC zusätzliche Berechnungen benötigt, um Schnittpunkte zwischen erzeugten Flächen zu verhindern. DC-Autoren haben dieses Problem in einer verbesserten Version ihres Algorithmus behoben.

http://www.cs.wustl.edu/~taoju/research/interfree_paper_final.pdf

http://www.cs.berkeley.edu/~jrs/meshpapers/SchaeferWarren2.pdf

Dieser Kollege schlägt auch einen wahrscheinlich saubereren Ansatz vor, der auf einer konvexen / konkaven Analyse basiert, um Selbstüberschneidungen zu vermeiden. Er verwendet auch bessere Quad-Splitting-Regeln, um die Ausrichtung der Kante zu erhalten:

http://www2.mae.cuhk.edu.hk/~cwang/pubs/TRIntersectionFreeDC.pdf

Der Classic MC ist auch nicht sofort "rissfrei" und erfordert möglicherweise ein Riss-Patching, wenn er auf uneingeschränkten Octrees ausgeführt wird. DC leidet nicht unter diesem letzten Problem.

Hier ist eine schöne und vollständige Übersicht über die meisten Maschenextraktionstechniken: http://www.cs.berkeley.edu/~jrs/mesh/

Ein Octree / Voxel-Ansatz ist an sich "CSG-freundlich", was es einfacher macht, eine ordentliche, vollständig "zerstörbare" Strategie auf Spielebene zu planen, aber wenn man all dies in einem Spiel implementieren muss, muss die Octree-Tiefe auch stumpf sein -abhängig.

Wenn das gesamte Material in den Speicher passt oder korrekt gestreamt wird, können die Daten auch zum Rendern von AO und zum Berechnen von Physik / Kollisionen verwendet werden.


"3D-Lärm wird obligatorisch, wenn das Gelände Höhlennetze und Überhänge benötigt." Verpflichtend? Wie in ist dies der einzige Weg, um Höhlen und Überhänge zu erzeugen? Nee. Ich erstelle eine Höhenkarte aus 2D-Perlinrauschen und schnitze dann Höhlen und Überhänge als separaten Schritt ein, um ein natürlicheres Aussehen zu erhalten. Es ist irreführend für angehende junge Spieleentwickler zu sagen, dass dies der EINZIGE Weg ist, um Höhlen und Überhänge in einer prozedural erzeugten Welt zu erzeugen.
Domarius

5

In diesem speziellen Beispiel schätze ich, dass er den z-Wert verwendet hat, um zu bestimmen, um welche Art von Material es sich handelt: Grundgestein, Stein, Schmutz oder Luft.


-3

Minecraft verwendet den Marschwürfel-Algorithmus, um 3D-Gelände zu generieren. Ich verstehe das nicht, tut mir leid. Ich bin mir nicht sicher, wovon Notch sprach, als er die Perlin Noise-Funktion erwähnte - vielleicht ein Keim für den Marschwürfel-Algorithmus. Mehr Infos hier:

Und ein großartiger GPU Gems-Artikel, wenn Sie sich für Marching Cubes interessieren:


2
Marching Cubes ist ein Algorithmus zum Erzeugen eines Netzes aus einem Skalarfeld. Das heißt, es müssen zuerst Daten vorhanden sein, und dann wird ein Netz generiert, das den Daten entspricht. Es ist nicht für die Generierung von Daten oder Gelände.
MichaelHouse

-6
for (int x = 0; x < Width) 
{
  for (int y = 0; y < Depth) 
  {
    for (int z = 0; z < Height) 
    {
      if(z < Noise2D(x, y) * Height) 
      {
        Array[x][y][z] = Noise3D(x, y, z)
      } else {
        Array[x][y][z] = 0
      }
    } 
  } 
} 

2
-1; Selbst mit der Klarstellung, die Sie hinzugefügt haben, ist dies eine ziemlich schlechte Antwort, die weder den Zweck des Code-Snippets noch dessen semantische Auswirkungen auf die resultierenden Daten klar erklärt und die meisten Fragen, die der Benutzer tatsächlich hatte, nicht beantwortet.

Ich habe den Code bearbeitet, wie wäre es jetzt?
Maxim DC

Es erklärt, wie 3D-Rauschen verwendet wird, um Gelände zu erstellen. Dies ist meiner Meinung nach korrekt
Maxim DC,

Erklären Sie dies in Ihrer Antwort und beantworten Sie die Fragen, die der Benutzer hatte. Ansonsten ist es eine Deadcode-Antwort.
Tom 'Blue' Piddock
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.