Ich arbeite schon seit einiger Zeit an einer 3D-Verfahrenswelt und möchte nun Höhlensysteme hinzufügen. Ich verwende derzeit 2D / 3D Perlin Noise für die Geländegenerierung in Kombination mit Marching Cubes für glattes Gelände. Ich bin nur ratlos, wenn es um lange miteinander verbundene Höhlen geht.
Ich hoffe, mehr wie Minecrafts Höhlensysteme zu bekommen. Sie scheinen sehr verbunden zu sein, verzweigen sich zufällig in fast jede Richtung und fast jeder Punkt in der Höhle würde ein ziemlich kreisförmiges Aussehen mit einem ziemlich gleichen Radius haben (nicht die beste Formulierung, aber nicht ganz sicher, wie man es anders ausdrückt). .
Die größte Herausforderung für die Erzeugung von Höhlen, wie ich sie mir wünsche, ist, dass ich die Welt im Fluge erzeugen möchte. Die Welt wird derzeit Stück für Stück erzeugt, beginnend dort, wo sich der Spieler befindet, und von dort aus nach außen. Ich würde NICHT die Welt erschaffen wollen und dann die Höhlen mit einem Wandermuster, zellularen Automaten usw. ausgraben.
Gibt es dafür bekannte Algorithmen? Wenn ja, möchte jemand mitteilen, wie er etwas Ähnliches tut? Ich würde mich über jede Hilfe sehr freuen.
Ein gutes Beispiel:
quelle
Antworten:
Minecrafts Höhlen werden nach der Perlin-Wurm-Methode erzeugt. Der Generator schlängelt sich durch das Gelände und stürzt einen Tunnel aus. Minecraft verwendet kein 3D-Perlin-Rauschen zur Erzeugung von Höhlen, da es dazu neigt, nicht verbundene Taschen im Gelände zu lassen. Minecraft-Höhlen wurden seit sehr frühen Alpha-Versionen nicht mehr durch 3D-Perlin-Rauschen erzeugt.
Hier sind Höhlen in Gnomescroll, die mit der "Perlin-Wurm" -Methode erzeugt wurden.
Dies sind die Libnoise "Perlin Worms" aus dem Libnoise-Tutorial. Die Technik reproduziert genau die in Minecraft erzeugten Höhlen.
Die Schlangenparameter beeinflussen die Qualität des Höhlensystems und bestimmen, wie vertikal die Höhlen sind und wie schnell sie ihre Richtung ändern. Höhlen in Minecraft Branch und der Radius des Höhlentunnels variiert über die Länge der Höhlen.
Minecraft erzeugt die Höhlen Stück für Stück. Der erforderliche Ansatz ist kompliziert und niemand hat Minecrafts Höhlengenerator bisher perfekt rückentwickelt, trotz des Interesses der Servermodder.
Der wahrscheinlichste Ansatz generiert die Schlangenhöhlen Stück für Stück, wenn die unendliche Karte generiert wird und sich nach außen ausdehnt. Die Höhlen auf dem aktuellen Block sind Funktionen der Höhlensamen auf den nächsten N Blöcken für einige N. Unter Verwendung eines Zufallszahlengenerators, der eine Funktion der Blockkoordinaten zum Aussäen der Höhlen ist, ist es möglich, die Höhlen auf dem aktuellen Block für eine zu berechnen unendliche Karte, während nur die Chunks innerhalb eines endlichen Chunk-Radius ausgewertet werden.
quelle
Ich würde eine Punktewolke in Bereichen erzeugen, in denen das Gelände fest ist - Sie können mit verschiedenen Dichten experimentieren. Dann würde ich einen Algorithmus wie einen Minimum Spanning Tree verwenden, um alle Punkte zu verbinden - dies stellt sicher, dass jeder Bereich erreichbar ist. Dann zeichnen Sie einfach große hohle (aus Luft zusammengesetzte) Bereiche von Knoten zu Knoten (dh eine dicke Linie von Voxeln).
quelle
Die Ausgabe des Game Developer Magazine vom April 2011 geht mit iterativen Perlin-Rauschfunktionen ausführlich darauf ein - siehe den Artikel über den Schöpfer der Welten ab Seite 21.
quelle
Verwenden Sie eine Rauschfunktion, um jedem Block Werte zuzuweisen, um festzustellen, ob er Tunnel hat oder nicht, und um dann zu entscheiden, wo Höhlen platziert werden sollen. Wenn Sie Tunnel verwenden möchten, verwenden Sie einfach mehr Rauschfunktionen (mit unterschiedlichen Ausgangswerten) und bestimmen Sie anhand ihrer Werte, ob es Tunnel gibt. Verwenden Sie anschließend normale "Zeichen" -Funktionen, um die Tunnel zu erstellen. Um alles realistischer zu machen, verwenden Sie mehr Lärm, um zufällige Verschiebungen für die Ursprungspunkte der Höhlen / Tunnel vorzunehmen.
Wenn Sie nicht mehrere Rauschfunktionen verwenden möchten, können Sie größere Entfernungen abfragen, anstatt beispielsweise noise3d (2,2,2) für chunk at (2,2,2) do noise3d (2,2, 16) und verwenden Sie (2,2,16) für einen Wert, (2,2,17) für den zweiten Wert, usw. ... und stimmen Sie dann Ihre Frequenz entsprechend ab, um entweder alle Werte unabhängig zu machen oder sie auf kurzen Skalen zu korrelieren.
Um die Höhlendichte weltweit zu variieren, verwenden Sie eine andere Funktion mit niedrigerer Frequenz, die diese Werte beeinflusst.
Falls dies zu unordentlichen Höhlen führt, erhöhen Sie einfach die Entfernung der miteinander verbundenen Punkte oder stimmen Sie den Algorithmus auf andere Weise ab.
Ich bin nicht sicher, ob Minecraft Höhlen wie diese anbietet (obwohl ich denke, dass dies der Fall ist), aber diese Lösung sollte zufriedenstellende Ergebnisse liefern.
quelle
Obwohl die meisten Höhlen wie die oben genannten den Perlin-Wurm verwenden , möchten manche Menschen dies lieber manuell tun. Auf diese Weise können sie es genau so machen, wie sie es Block für Block wollen. Eine Höhle, die mit dem Perlin-Wurm hergestellt wurde, kann ungenau sein und die Höhle möglicherweise nur 5 Fuß hoch und 6 Fuß breit machen.
quelle