Wie entferne ich schwimmendes Gelände, wenn es mit 3D Perlin Noise erzeugt wird?

10

Ich verwende derzeit 3D Perlin Noise, um zufälliges Terrain in Kombination mit Marching Cubes zu generieren.

Mein Problem scheint darin zu liegen, die Rauschfunktion zu skalieren, um angemessene Höhen in meinem Gelände zu erreichen. Wenn nur eine Oktave verwendet wird, werden offensichtlich alle Punkte in Bezug auf das Rauschen interpoliert, was zu ziemlich glatten Daten führt. Um jedoch Überhänge / Höhlen / gezacktes Gelände zu erhalten, muss ich mehrere Oktaven mit unterschiedlichen Amplituden verwenden und / oder die resultierenden Werte auf meine maximale Höhe der Karte skalieren.

Ich vermisse vielleicht etwas, aber durch die Verwendung von Marschwürfeln mit 3D-Perlin-Rauschen bekomme ich regelmäßig schwebende Geländestücke.

Irgendwelche Ideen, wie ich das korrigieren könnte oder ob es andere Rauschfunktionen gibt, mit denen ich Ergebnisse erzielen könnte, wie ich sie beschreibe? Ich möchte Hügel / Täler / Berge / Seen / etc. Es sind keine schwebenden Bits erforderlich, die vom Rest der Karte getrennt sind. Ich glaube, dies ist ein ähnliches Problem wie bei Minecraft, wenn es Gelände gibt, das gelegentlich nach der Generation am Himmel schwebt.

Danke für jede Hilfe, Mythics

Mythik
quelle

Antworten:

9

Wahrscheinlich besteht die einzige Möglichkeit, schwimmendes Gelände vollständig zu beseitigen, darin, die Konnektivität zu testen. Abhängig von der Größe Ihrer Karte kann dies eine Option sein. Sie können dies tun, indem Sie den Basispunkt auswählen, wie den tiefsten Punkt Ihrer Welt. Stellen Sie dann sicher, dass alle Ihre Voxel entweder:

  1. Mit der Basis verbunden.
  2. Verbunden mit einem Voxel, das mit der Basis verbunden ist.

Wahrscheinlich würde es ziemlich gut funktionieren, an einem bekannten verbundenen Punkt (wie dem Grund Ihrer Welt) zu beginnen und dann eine breite erste Durchquerung verbundener Voxel durchzuführen. Stellen Sie sicher, dass Sie Voxel unterwegs als verbunden markieren. Sie können dies pro Block tun.

Darüber hinaus gibt es kostengünstigere Möglichkeiten, das schwimmende Gelände zu minimieren, aber nicht vollständig zu entfernen.

  • Gradientenvorspannung : Sie können die Platzierung fester Voxel mit einem Gradienten beeinflussen. Die Gradientenfunktion würde etwas stark abfallen, wenn Sie sich über dem "Bodenniveau" befinden. Dieser Artikel befasst sich mit der Verwendung eines Verlaufs und enthält einige weitere nützliche Tipps.

  • Höhenkartenrauschen : Sie können stattdessen Rauschen als Höhenkarte erzeugen. Dies würde die Überhänge und Höhlen entfernen, aber Sie können diese mit einer zusätzlichen subtraktiven Rauschschicht simulieren.

  • Weniger lautes Rauschen : Verwenden Sie weniger Oktaven in Ihrem Geländegeräusch und erzeugen Sie subtraktives Rauschen, um Überhänge und Höhlen zu erhalten.

MichaelHouse
quelle
Das Gelände kann möglicherweise nur durch den angrenzenden Block verbunden werden, wenn es sich um einen Überhang handelt.
Loren Pechtel
@Loren: Das ist aber vollkommen in Ordnung. Solange Sie mit der Engine Chunks anhand des vollständigen Index adressieren können, funktioniert dies ohne Probleme.
Phil
@LorenPechtel Ich sage, Sie können es pro Block tun, aber Sie müssten benachbarte Blöcke überprüfen, wenn Sie sich am Rand eines Blocks befinden. Dies kann zu einem Problem werden, wenn neues Terrain generiert wird und der benachbarte Block nicht generiert wurde. Wenn Sie in eine Situation geraten, in der Sie möglicherweise schwimmendes Gelände haben, können Sie entweder den angrenzenden Block generieren oder den Rauschalgorithmus verwenden, um die Voxel zu analysieren, bis Sie "Grundgestein" oder eine bekannte Verbindung zum aktuellen Block finden.
MichaelHouse
0

Es mag zu spät sein, um zu antworten, aber ich begann jetzt mit dieser Sache der Voxel-Terrain-Generierung, mit Perlin Noise, und fand einen Weg, das Terrain ohne diese schwebenden Teile zu erstellen. Ich denke, dass dies Ihnen helfen kann. Um das Gelände zu erstellen, erstelle ich zuerst eine Höhenkarte, bevor ich die Pixel aus dieser Höhenkarte lese. Nun kommt der interessante Teil, ich lese den "Helligkeits" -Wert (eigentlich ist der Graustufenwert) jedes Pixels auf dieser Höhenkarte und das gibt mir die Höhe für diesen bestimmten Teil der Karte, um dann das Gelände zu erstellen, von dem ich annehme, dass diese Höhenkarte ist Mein Terrain von oben betrachtet. Wenn also der Graustufenwert eines Pixels (nachdem es auf meinem Terrain "maxHeight" abgebildet wurde) auf dieser Höhenkarte ist, sagen wir 30, Das bedeutet, dass ich an diesem bestimmten Punkt meines Geländes nur 30 Voxel in der y-Achse erzeugen werde, und dies gibt mir ein Gelände ohne schwebende Teile. Wenn Sie Höhlen usw. möchten, können Sie ein anderes Geräusch auf das Original (unter der Oberfläche) anwenden, um diese Höhlen zu erstellen. Hoffe das funktioniert bei dir.

Sammael
quelle
1
Ich glaube, dies ähnelt dem zweiten Punkt in meiner obigen Antwort.
MichaelHouse