Höhlengeneration mit Perlin-Würmern

11

Ich versuche gerade, mit 3D Simplex Noise ein Minecraft-ähnliches Voxel-Terrain zu generieren und möchte auch Höhlen implementieren.

Ich habe die Methode von Perlin Worms in diesem Thread gefunden, die wirklich schöne Ergebnisse generiert. Ich habe jedoch keine Ahnung, wie ich es Stück für Stück generieren soll. Ist dies möglich oder gibt es Alternativen, die Stück für Stück einen ähnlichen Wurm wie eine Höhle produzieren?

Bearbeiten: Dies ist das Problem, das ich nicht lösen kann.

Bearbeiten2: Dies ist das Ergebnis der Kombination von 2D Ridged Multifractal Noise mit einer Simplex Noise-Höhenkarte. Muss noch angepasst werden, aber das ist so ziemlich das Ergebnis, das ich wollte. Vielen Dank an Byte56.

user000user
quelle
Wenn möglich, sollten Sie direkte Formeln für die Geländegenerierung verwenden. Wenn Sie ein Voxel nur anhand seiner Koordinaten und ohne Informationen über benachbarte berechnen können, sind Chunks kein Problem mehr. Wenn Sie Perlin-Würmer verwenden möchten, die vermutlich nicht für jedes Voxel einzeln berechnet werden können, lesen Sie den letzten Absatz in der akzeptierten Antwort auf die von Ihnen verknüpfte Frage.
Danijar
1
Grundsätzlich ist das meine Frage. Das Grundgelände ist einfach mit nur den angegebenen Koordinaten zu berechnen, aber ich weiß nicht, wie ich berechnen soll, ob es eine Höhle gibt oder nicht.
user000user

Antworten:

5

Mit den meisten Perlin-Rauschalgorithmen können Sie den Rauschwert an einem bestimmten Ort mit so etwas wie abrufen noise(x,y,z). Dies macht es ziemlich trivial, Rauschen Stück für Stück zu erzeugen. Alles, was Sie tun müssen, ist die globale Position anstelle der Blockposition zu übergeben.

for(int i = 0; i < CHUNKMAX_X; i++)
    for(int j = 0; j < CHUNKMAX_Y; j++)
        for(int k = 0; k < CHUNKMAX_Z; k++)
            if(isSolid(perlinNoise.get(chunkPosition.x + i,
                                         chunkPosition.y + j,
                                         chunkPosition.z + k))
                thisChunk[i,j,k] = new Voxel(solid);
            else
                thisChunk[i,j,k] = new Voxel(air);

Sie sehen also, wir generieren Terrain für den Chunk, indem wir über die Chunk-Grenzen iterieren und prüfen, ob diese globale Position solide ist oder nicht. Dies ist wahrscheinlich dieselbe Methode, mit der Sie das Gelände im Allgemeinen generieren.

perlinNoise.getnimmt eine globale Position ein und gibt ihre Dichte zurück. Wo isSolidwäre nur ein einfacher Test, um zu sehen, ob das Voxel "dicht genug" ist, um sich für fest zu qualifizieren.

perlinNoise.getkann komplexer sein als nur ein einfacher Rauschalgorithmus. Sie können Überprüfungen basierend auf der Tiefe des Voxels in Ihrer Welt durchführen lassen. Befindet sich das Voxel beispielsweise unter dem von Ihnen festgelegten "absoluten Grundbodenniveau", kann es mithilfe des Perlin-Würmer-Algorithmus eine Dichte zurückgeben. Wenn es über der absoluten Basis liegt, kann eine normale Dichtefunktion verwendet werden abwechslungsreicheres Gelände. Ich würde jedoch eine Mischung zwischen den beiden empfehlen.

Das Kombinieren verschiedener Perlin-Rauschfunktionen ist nur etwas, mit dem Sie spielen und sehen müssen, was funktioniert. Am besten richten Sie Ihre Umgebung so ein, dass Sie nur einige Werte ändern und das Gelände im laufenden Betrieb austauschen können, ohne Ihr Spiel neu laden zu müssen. Viel Spaß beim Experimentieren.

MichaelHouse
quelle
2
Danke für die Antwort. Ich weiß jedoch nicht, wie ich "normale" Perlin- oder Simplex-Geräusche verwenden soll, um die wurmartigen Höhlen zu schaffen. Sie sind entweder kugelförmig, in eine Richtung skaliert oder nicht sehr lang. Und für den Perlin Worms-Algorithmus weiß ich nicht, wie ich feststellen kann, ob sich die aktuelle Position innerhalb eines Wurms befindet, ohne die Kopfposition zu kennen.
user000user
1
Der Wurmalgorithmus beruht nicht auf der Kenntnis der "Kopfposition". Wie Sie sagen, besteht Ihr Problem anscheinend nicht darin, Rauschen Stück für Stück zu erzeugen. Es gibt Tutorials zu der Frage, die Sie für die Implementierung von Perlin-Würmern verlinkt haben. Wie „normale“ Terrain zu erzeugen , kann hier gefunden .
MichaelHouse
Die grundlegende Geländegenerierung mit 3D-Simplex-Rauschen funktioniert einwandfrei, aber ich weiß nicht, wie ich die Position / das Segment eines Wurms in einem Block bestimmen soll. Nach meinem Verständnis geben Sie dem Wurm eine Kopfposition und n Segmente und berechnen den Winkel zwischen den Segmenten mit der Rauschfunktion. Hier ist ein Bild, das besser erklären kann, was mein Problem ist: Link .
user000user
2
Es gibt verschiedene Arten von Geräuschen. Es gibt eine Methode, eine Kopfposition zu verwenden und von dort aus zu folgen. Wenn Sie unten auf dieser Seite nachsehen , werden Sie ein Geräusch finden, das das gewünschte Geräusch erzeugt, ohne dass Sie zuerst eine Kopfposition benötigen.
MichaelHouse
Danke für den Hinweis dazu. Ich habe das 3D Ridged Multifractal Noise implementiert, das Ergebnis war jedoch eher unbefriedigend. Ich werde versuchen, es in 2D mit einer 2D-Höhenkarte zu kombinieren und dann erneut zu berichten. Dies kann zu mehr wurmartigen Höhlen führen.
user000user
3

Ich denke, so funktioniert es in Minecraft. Jeder Wurm hat eine maximale Länge (nennen wir es M). Die Köpfe jedes Wurms werden basierend auf der Blockposition berechnet. Wenn Sie jeden Block rendern, müssen Sie alle Blöcke innerhalb eines MRadius überprüfen und allen Würmern folgen. Es ist nicht ideal in Bezug auf die Leistung, aber es funktioniert.

Tom Dalling
quelle