Nochmals zu den Voronoi-Diagrammen

Ursprünglicher Autor: Scott Turner
  • Übersetzung
Wie es in den geschrieben wird , die letzten Positionen des Blogs, kämpfte ich um sein Spiel zu bekommen Dragons Abound gewünschte Küsten Detail. Meine Enttäuschung entstand während der Umsetzung der Barriereninseln . Um die Insel so eng wie möglich zu gestalten, habe ich sie an einem Ort breit gemacht - in der Abbildung unten ist jeder Ort ein Delone-Dreieck:


Es war eher unangenehm - und weil die Insel sehr kaputt war und weil die Teile zu groß waren. Es schien, dass mit einer starken Zunahme der Anzahl von Delone-Dreiecken (dh mit einer starken Abnahme ihrer Größe) dieses Problem gelöst würde - aber die Dichte der Dreiecke, die ich brauchte, führte zum Absturz des Browsers.

Ich habe dieses Problem gelöst, indem ich die Landkonturen von der internen Ansicht der Standorte getrennt habe. Dies erlaubte mir, Inseln jeder Größe und Form zu zeichnen, unabhängig vom darunterliegenden Raster der Standorte:


Das Problem ist also gelöst! Dies erlaubte mir, die Barriere-Inseln zu zeichnen, und da die Küstenlinie nun nicht mehr dem Grundraster folgen muss, kann eine detailliertere Küstenlinie in der üblichen Weise erstellt und dann Details hinzugefügt werden.

Aber ... wie fügen wir der Küste Details hinzu? Das ist nicht so einfach, wie Sie vielleicht denken. Da ich eine fraktale Küste erstellen wollte, habe ich die Möglichkeit in Betracht gezogen, Fraktale zu verwenden, die Details zur Küste hinzufügen :


Beim Experimentieren mit den Einstellungen konnte ich der Küste viele Details und Interessantes hinzufügen. Das System konnte jedoch nicht etwas erstellen, das einer solchen Karte ähnelt:


Perlins Rauschen kann eine ähnliche Art von Erleichterung bewirken, wenn ein ausreichend detailliertes Basisraster vorhanden ist. Kann dies jedoch ohne Speicherung der Höhenwerte mit der erforderlichen Auflösung im Basisraster erfolgen (ich weiß, dass dadurch mein Code beschädigt wird)? Bis ich herausgefunden habe, wie es geht. Die Küste ist im Wesentlichen ein Pfad durch alle Punkte, an denen die Perlin-Rauschfunktion einen Nullwert hat. Obwohl wir direkt aus der Perlin-Rauschfunktion den Wert an einem bestimmten Ort (X, Y) lernen können, ist es unmöglich, "alle Orte zu finden, an denen die Funktion den Wert Null hat". Das heißt, es ist schwer zu sehen, wie eine Höhenkontur ohne Basisraster gezeichnet wird.

Schlimmer noch, fragte ich Amitwie es geht, und er wusste auch nicht die Antwort. Es ist eine Sache, wenn ich es nicht sagen kann, aber selbst wenn solch eine intelligente Person keine Antwort geben kann, beginne ich zu denken, dass dies nicht möglich ist. Leider Ich kann der Küste jede Form geben, die ich brauche, aber ich kann die Formen, die ich brauche, nicht ohne ein sehr detailliertes Grundraster bekommen.

Wie kann ich ein Raster mit hoher Auflösung erhalten, ohne den Code zu beschädigen?

Eine der Lösungen, die mir in den Sinn gekommen sind, ähnelt dem, was Azgaar gemacht hatin seinem Kartengenerator - Voronoi-Zellen variabler Größe. Die Grundidee besteht darin, die Dichte (und die Größe zu verringern) des Grundgitters entlang der Küstenlinien zu erhöhen und eine geringere Dichte in Ozeanen und anderen Bereichen beizubehalten, die keine Details erfordern. Mit dieser Option habe ich viele Netzzellen nur in den Bereichen, in denen Sie Details benötigen. Diese Änderung wird in Dragons Abound ziemlich schwer zu implementieren sein , aber ich möchte darüber nachdenken. Auf der anderen Seite war Azgaar selbst nicht sehr zufrieden mit diesem Ansatz , daher sollte dies ebenfalls berücksichtigt werden.

Parallel dazu wollte ich die Gründe für das Versagen des Browsers bei der Verarbeitung von Dreiecken untersuchen. Chrome-Entwicklertools lieferten detaillierte Informationen zur Leistung. Ich bin keineswegs ein Experte für die Verwendung dieser Tools, aber viele Funktionen sind so einfach, dass sie jeder verstehen kann. Wenn Sie wissen möchten, wie viel Speicher insgesamt im Programm verwendet wird, finden Sie auf der Registerkarte Speicher Informationen zum aktuell verwendeten Datenträger:


In diesem Fall habe ich die Azgaar-Webseite geöffnet, und sie benötigt bescheidene 20 MB Speicher. Mit diesem Tool können Sie herausfinden, wie viel Speicherplatz die Drachen im Überfluss benötigen , und den Punkt bestimmen, an dem die Registerkarte ausfällt.

Der grundlegende Parameter, der die Auflösung des zugrundeliegenden Gitters in Dragons Abound steuert, wird "npts" (Anzahl der Punkte) genannt. Für jeden Einheitsbereich der Karte (Karten von Regionen, die ich normalerweise als Beispiele verwende, haben einen Bereich von 1 Einheit) Dragons Abound erstellt eine bestimmte Anzahl von Basisrasterpositionen. Normalerweise verwende ich 16K (16384) für npts. Dies bedeutet, dass jede Position des Gitters bei einem Standard-Zoomfaktor etwa 70 quadratische Pixel des Bildschirms entspricht.


Die genaue Menge des verwendeten Speichers hängt natürlich von der Karte ab, aber für die oben gezeigte 16K-Punkt-Karte benötigen Sie ungefähr 92 MB:


Das ist weniger als ich erwartet hatte und ehrlich gesagt eine eher bescheidene Zahl.

Wenn Sie die Anzahl der Punkte im Basisraster verdoppeln, erhöht sich der Speicher auf 138 MB:


Die Größe des belegten Speichers hat sich nicht verdoppelt, da ein Teil dieses Speichers von Ressourcen und anderen Datenstrukturen belegt ist, deren Größe sich nicht geändert hat. 16 KB zusätzliche Punkte "wiegen" etwa 50 MB Speicher, dh jeder Punkt des Ergebnisses benötigt etwa 3 KB Speicher. Das ist mehr als ich erwartet hatte, aber im Allgemeinen ist das Volumen immer noch recht bescheiden. Auf einem Computer mit 64 GB Arbeitsspeicher sind 150 MB kaum wahrnehmbar.

Nach einigen weiteren Verdopplungen stellte ich fest, dass die Registerkarte mit Dragons Abound normalerweise bei etwa 128.000 Punkten abstürzt. Wenn Sie es fangen, bevor es herausfliegt, und den Speicher überprüfen, sehen Sie Folgendes:


Ich nahm an, dass die Registerkarte aufgrund von Speicherauslastung fehlschlägt, das Problem liegt jedoch normalerweise nicht im Speicher. Warum stürzt die Registerkarte ab? Der einzige Hinweis ist, dass die Registerkarte nicht abstürzt, bis die Zuordnung abgeschlossen ist. Dies ist wahrscheinlich ein Hinweis darauf, dass beim Rendern ein Absturz auftritt.

Es ist logisch anzunehmen, dass die SVG I-Erstellung den Browser-Renderer aufgrund seiner Größe oder Komplexität überlastet. Zunächst kann ich herausfinden, wie viele SVG-Elemente ich erstellt habe. In D3 kann ich die Gesamtzahl der erstellten SVG-Elemente ermitteln svg.selectAll('*').size().

Beim Ausführen von 16.000 Punkten und Überprüfen der Anzahl der SVG-Elemente wurde Folgendes angezeigt:


32.000 Punkte haben 65457 Elemente und 128.000 Punkte - 258823. Jeder dem Basisraster hinzugefügte Punkt fügt der Karte zwei Elemente hinzu. Ich glaube, ich habe die Ursache des Problems gefunden.

Jeder Punkt des Basisrasters fügt SVG-Elemente hinzu, da Dragons Abound Land (und Wasser) rendert . Das Land wird gerendert, indem jede Basisposition als gefülltes Polygon gezeichnet und anschließend alle verwischt werden. Dies ermöglicht es Dragons Abound , dem Land ein schönes Muster zu verleihen oder die Höhe von Sushi zu verwenden, um Sushi mit 3D-Schattierung zu rendern, wie hier gezeigt:


Sie können die Land- und Ozeanvisualisierung deaktivieren, um zu überprüfen, wie viele SVG-Elemente erstellt werden. Bei 256.000 Punkten:


Wow, die Anzahl der SVG-Elemente ist deutlich gesunken. Wie ich gehofft habe, wird die Karte jetzt ohne Fehler dargestellt. Wenn Sie also das Raster nicht für das Rendern von Sushi und Wasser verwenden, können Sie ein viel dichteres Raster als zuvor erstellen.

Wenn ich nun ein viel dichteres Voronoi-Gitter habe, möchte ich prüfen, ob es mir möglich ist, die notwendigen Landentlastungselemente wie Küsteninseln zu erzeugen. Das dichte Voronoi-Netz wirft andere Probleme auf (insbesondere bei Flüssen). Daher werde ich alles außer den Küsten trennen, um das Testen zu beschleunigen und mich darauf zu konzentrieren. Hier ist das ursprüngliche Rendern einer bestimmten Küste mit 256 K Punkten und mit Standardrauschen:


Es stellt sich heraus, dass die Karte gut dargestellt wird und bereits eine viel schönere Küste entsteht.

Auch ohne sorgfältige Anpassung war das Ergebnis viel besser. Lärm erzeugt die Arten von fraktalen Küsten und Küsteninseln, die ich auf der Karte oben angegeben habe.

Hier sind die Inseln mit einer Steigerung von 300%:


Mit einer solchen Erhöhung können Sie die Artefakte von Dreiecken aus dem Basisraster sehen, aber Inseln können auch interessante Formen erzeugen. Sie können Anti-Aliasing (wie in der aktuellen Kartenversion) verwenden, um einige der auffälligsten Dreieck-Artefakte zu beseitigen. Bei normaler Vergrößerung bietet dies eine weniger robuste Küstenlinie, beseitigt aber auch einige kleine Details:


Muss wahrscheinlich die Einstellung vornehmen, um den Mittelweg zu erreichen.

Die meisten prozeduralen Sushi-Generatoren verwenden Perlin-Rauschen, um eine Höhenkarte zu erstellen. Es ist notwendig, geeignete Geräuschparameter zu finden, einen Startwert auszuwählen und dann den Geräuschwert an jedem Ort (x, y) zum Einstellen der Landmasse zu verwenden. Wenn Sie mehr Details zur Küste benötigen, können Sie die Geräuschparameter einfach anpassen.

Allerdings Dragons Abound nicht das Land auf diese Weise erstellen. (Oder zumindest nicht nur solche erstellen .) In Dragons AboundEs gibt viele verschiedene Möglichkeiten, Sushi zu kreieren. Obwohl sie alle in unterschiedlichem Maße Lärm verwenden, erzeugen nur sehr wenige von ihnen Land direkt aus Lärm. Das Spiel verfügt beispielsweise über ein Verfahren zum Erstellen einer Insel, die eine Maske für die Insel (normalerweise eine Ellipse) erstellt, Rauschen verwendet, um der Ellipse eine natürlichere Form zu geben, und dann verschiedene Rauschen verwendet, um die Maske grob zu füllen. Jede spezifische Karte wird normalerweise durch eine Kombination mehrerer unterschiedlicher Verfahren erstellt. Daher ist das Hinzufügen von Details durch Einstellen der Rauschparameter für Dragons Abound nicht besonders geeignet.

Für meine Zwecke ist es besser, das Problem aus einem etwas anderen Blickwinkel zu betrachten. Wenn ich eine definierte Höhenkarte habe, die die Landmassen definiert, wie kann ich dann Details zu den Rändern dieser Landmassen hinzufügen? Dies kann uns glauben machen, dass wir die Kanten der Landmassen erkennen und den Rest der Karte usw. maskieren müssen. Andererseits macht es mir nichts aus, dem Rest der Karte weitere Details hinzuzufügen. Wenn das Land etwas unebener ist oder der Meeresboden etwas rauer ist, ist dies normal.

Was bedeutet das Hinzufügen von Teilen zur Küstenlinie? Die Küstenlinie ist einfach eine Konturlinie, in der die Höhenkarte einen Nullwert hat. (Der Wert ist willkürlich, aber dieses Prinzip wird in jedem prozeduralen Sushi-Generator verwendet.) Um diese Linie detaillierter zu machen, müssen Sie das Land neben diesen Konturlinien ein wenig nach oben und unten verschieben, um einfache Küstenlinien zu erschweren Inseln und so weiter. Dies sollte jedoch nicht zufällig geschehen, ich möchte, dass die Änderungen natürlich erscheinen. Wir fassen das Ganze zusammen und es scheint, als müssten Sie der gesamten Karte ein wenig Rauschen hinzufügen. Und genau das habe ich in dem oben gezeigten Beispiel getan.

Natürlich sollte dies sorgfältig geschehen, um die entstandenen Massen nicht zu löschen und keine anderen Probleme zu verursachen. Grundsätzlich muss ich drei Parameter konfigurieren.

Der erste ist der Maßstab des Geräusches. Die Skala ist nur eine Reihe von Werten für dieses Rauschen. In unserem Fall möchte ich einige Bereiche absenken und einige nach oben erhöhen, sodass der Wertebereich von negativ bis positiv sein sollte. Ich möchte jedoch keine neuen Berge hinzufügen oder einen Ozean weit entfernt von der vorhandenen Küstenlinie erstellen, daher werde ich den maximalen (absoluten) Lärmwert auf einen kleinen Bruchteil der Standardlandhöhe legen.

Der zweite Parameter ist die Hauptfrequenz des Rauschens. Die Frequenz bestimmt, wie schnell sich das Rauschen innerhalb des Ortes ändert. Das niederfrequente Rauschen ändert sich sehr langsam, sodass ein positiver Bereich mit niederfrequentem Rauschen die gesamte Karte erfassen kann (vorausgesetzt). Hochfrequentes Rauschen ändert sich schnell, so dass ein positiver Bereich mit hochfrequentem Rauschen die Größe einer kleinen Insel haben kann. In unserem Fall bestimmt die Hauptgeräuschfrequenz die größten Elemente des Reliefs, die wir im Geräusch sehen werden. Das heißt, wenn ich möchte, dass das Rauschen kleine Inseln zu der Karte hinzufügen kann (aber nicht größer als diese), muss ich eine Hauptfrequenz auswählen, die der Größe einer kleinen Insel entspricht.

Sie denken vielleicht, dass dies einfach ist (messen Sie einfach eine kleine Insel und ordnen Sie diese Größe der Hauptfrequenz zu). Die Frequenz wird jedoch in den Koordinaten der Rauschfunktion gemessen und nicht in den Koordinaten der Karte! Eine typische Rauschfunktion kann an jeder Koordinate ein Intervall von 0 bis 255 haben, und eine Karte kann an jeder Koordinate ein Intervall von -1 bis 1 haben. Schlimmer ist, dass die Rauschkoordinaten minimiert werden und viele Rauschbenutzer dies nicht merken. Das Konvertieren von einer Einheit in eine andere und das Identifizieren geeigneter Frequenzen ist verwirrend. Daher ist es in der Regel am einfachsten, mit Frequenzintervallen zu experimentieren und dasjenige auszuwählen, das die Kartenelemente mit der gewünschten Größe erstellt.

Der dritte Parameter ist die Anzahl der Oktaven des Rauschens. Oktaven sind zusätzliche Geräuschschichten. Jede Schicht verdoppelt normalerweise die Frequenz und halbiert die Geräuschskala. Das heißt, jede neue Ebene fügt Reliefelemente hinzu, die zweimal kleiner als die vorherige Ebene sind, aber auch zweimal schwächer. Das heißt, Sie müssen die Anzahl der Oktaven auswählen und die kleinsten Elemente angeben, die wir benötigen. Dazu müssen Sie möglicherweise die Skalierung des Rauschens anpassen, da es in der höchsten Oktave noch stark genug ist, um auf der Karte angezeigt zu werden. Da ich dies absichtlich mache, um die Küsten sehr kompliziert zu gestalten, werde ich einige Oktaven Rauschen verwenden.

Lassen Sie uns es einrichten. Zuerst werde ich eine Beispielkarte ohne zusätzliches Rauschen erzeugen:


Offensichtlich ist dies eine langweilige Küste mit glatten Linien und nur ein paar großen Inseln. Hier ist die gleiche Küste mit der ursprünglichen Geräuschprobe:


Der Lärm hat die Form der Karte erheblich verändert und große Landstücke in den Ozean und umgekehrt verwandelt. Es gibt auch viele Inseln, darunter weit ins Meer. All dies weist darauf hin, dass das Ausmaß des Rauschens zu groß ist. Die größten individuellen Geländeelemente, die durch Lärm hinzugefügt werden, sollten der Größe der kleinen Inseln der ursprünglichen Karte entsprechen. Dies ist wahrscheinlich die maximale neue Größe der Elemente, was beweist, dass die Grundfrequenz des Rauschens grob richtig gewählt ist. Schließlich wurden viele kleine Details bis zu den Grenzen der Anzeigegröße angezeigt, und dies zeigt, dass genügend Oktaven vorhanden sind. (Die Anzahl der Oktaven ist jedoch möglicherweise mehr als notwendig. Dies hat keinen Einfluss auf das Erscheinungsbild der Karte, ist jedoch ineffizient.) Es scheint, dass Sie die Rauschskala grundsätzlich anpassen müssen.

Das Tuning-Geräusch ist eine ziemlich komplizierte Operation, weil ich möchte, dass dieses Geräusch hauptsächlich bei einer Höhenlinie mit Höhe = 0 auf Land und Wasser wirkt. Das heißt, ich brauche eine relativ kleine Skala, aber es ist nicht klar, wie man die richtige Zahl wählt, weil In verschiedenen Karten variiert die Höhenverteilung. Die Lösung besteht darin, schnell eine geeignete Skala auszuwählen. Sie können alle absoluten Werte der Höhen auf der Karte nehmen, sie sortieren und den Grenzpunkt finden, an dem 10% der Positionen um null ausgewählt werden. Alle diese Stellen fallen in das Intervall (angenommen) [-0,05, 0,05], und dann kann ich den Wert 0,05 verwenden, um den Maßstab des hinzugefügten Rauschens zu bestimmen.

(Ich schreibe „Definitionen“, weil Sie aus verschiedenen Gründen nicht einfach 0.05 verwenden können. Zuerst müssen Sie Land in Wasser umwandeln.) Wenn Sie beispielsweise 0,002 bis -0,05 hinzufügen, werden keine sichtbaren Änderungen an der Karte vorgenommen. Das Intervall sollte also weit über 0,05 liegen Wenn ich einen erheblichen Anteil von Standorten mit einer Höhe von -0,05 von Wasser in Land umwandeln möchte, sind die Geräuschfunktionen nicht gleichmäßig verteilt , sodass bei einer Skala von 0,05 die Geräuschfunktion niemals einen Wert von 0,05 ergibt. In der Praxis besteht die Schwierigkeit darin Die Skala sollte viel größer sein als die größten Werte, die wir oft genug sehen wollen.)

Nachdem ich experimentiert hatte, habe ich einen Wert gefunden, der die Küsten komplexer macht, ohne sie wesentlich zu verändern, und außerdem eine kleine Anzahl von Inseln bildet:


Wie immer können diese Parameter im Spiel eine Reihe von Werten annehmen, so dass ich eine Vielzahl von Karten erhalten kann: von Karten mit relativ glatten Küsten bis zu Karten mit gebrochenen und schwierigen Küsten. Als ich dem Programm erlaubte, Werte aufzunehmen, erhielt ich folgendes Ergebnis:


Die Küsten sind eher glatt, aber die zusätzliche Komplexität des Mittelmaßstabs und eine ausreichende Anzahl neuer Inseln sind immer noch ein großer Teil.

Als ich fraktale Küstenlinien implementierte, erkannte ich die Fähigkeit, den Fraktalisierungsgrad mithilfe der Rauschfunktion zu steuern, sodass einige Bereiche glatte Küsten haben und andere komplex sind. Ich dachte, dass dies die Attraktivität der Karte erheblich erhöhen würde und dass sie weniger „erzeugt“ aussehen würde, deshalb werde ich diese Funktion hier hinzufügen. Die Idee ist ziemlich einfach: Bevor ich der Karte Küstengeräusche hinzufüge, multipliziere ich sie mit der Ausgabe der zweiten Geräuschfunktion, die von Null bis 1 variiert. Wenn diese Funktion klein ist, werden kleine Details zu den Küstenlinien hinzugefügt. Wenn es nahe bei 1 liegt, werden zusätzliche Details hinzugefügt. Wenn Sie den Maßstab der zweiten Rauschfunktion auswählen, die sich auf der Karte langsam ändert, werden einige Bereiche mit komplexen Küstenlinien angezeigt, einige mit einfachen und logischen Übergängen zwischen ihnen:


Hier habe ich die Küstenparameter mit großen Werten gemacht, damit der Unterschied klarer wird. Im Nordosten sehen wir eine wilde, raue Küste und im Westen glattere Strände.

Wir haben also die Küstenliniengeneration deutlich verbessert, aber ich kann immer noch keine Karte mit so vielen Delone-Dreiecken generieren. Ich zeige nur Konturkarten, da viele andere Kartenelemente beschädigt sind. Muss es reparieren.

Der Rest des Programms funktioniert nicht so gut mit so vielen Delone-Dreiecken (bei aktuellen Einstellungen von 256K). Das Hauptproblem ist, dass es Drachen gibtzieht Land und Wasser durch Zeichnen aller einzelnen Dreiecke und diese Anzahl von SVG-Elementen führt zum Absturz des Browsers. Also musste ich das Sushi-Rendering komplett ausschalten. Es gibt wahrscheinlich einen Weg, um dieses Problem zu umgehen, aber so viele Dreiecke schaffen andere Probleme. Beispielsweise müssen einige Teile des Programms die gesamte Map verarbeiten. Jeder von ihnen wird an 256K-Positionen sechzehn Mal langsamer als an 16K-Standorten. Es gibt auch Teile im Code (z. B. ein neues Niederschlagsmodell), die beim Arbeiten mit so vielen Dreiecken brechen. Durch die Schaffung eines solch detaillierten Rasternetzes gewinnen wir nichts - nachdem die Küste erstellt wurde, wird durch die zusätzliche Komplexität nichts besser. Also, obwohl ich mir das Programm ansehen und diese Bereiche reparieren konnte

Wie oben erwähnt, Azgaar bereits ausgegeben arbeitet die Rasterauflösung Voronoi zugrunde liegenden Karten zu ändern. Er erkannte die Möglichkeit, die Netzauflösung während des Erzeugungsprozesses im laufenden Betrieb zu ändern, das heißt, er könnte beispielsweise die Dichte von Standorten entlang der Küste erhöhen. Die lokale Dichteänderung hat jedoch ihre Nachteile - insbesondere werden entlang der Grenze merkwürdig geformte Dreiecke erzeugt. Später äußerte Azgaar die Ansicht, dass das System zu komplex sei und die Anstrengung nicht wert sei. Azgaar weiß normalerweise, wovon er spricht, also werde ich sein Wort dafür nehmen, und ich werde nicht versuchen, das fertige Gitter neu zu verpacken.

Stattdessen habe ich ein zweites Gitter mit der gewünschten (niedrigeren) Auflösung erstellt und dann die Höhenkarte in dieses neue Gitter kopiert. (Vergiss nicht, dass Drachen im Überfluss sindJetzt werden die Küstenlinien vom Raster getrennt, sodass sie nach ihrer Erstellung nicht mehr von dem genau passenden Raster abhängig sind. Mach es etwas komplizierter. Da das ursprüngliche Raster eine wesentlich höhere Auflösung als das neue hat, werden viele Positionen im ursprünglichen Raster an einem Ort im neuen Raster überlagert. Jeder dieser Quellorte hat auf der Höhenkarte eine andere Höhe. Wie kann ich sie kopieren? Verwenden Sie den Mittelwert? Oder die maximale (minimale) Höhe?

Für den Anfang werde ich einfach einen zufälligen Ort auswählen, um zu sehen, ob das neue Raster mit dem Rest des Programms funktioniert:


Alles war überraschend gut. Ein kleiner Fehler tritt auf, wenn neue Orte nicht ordnungsgemäß als Land, Strand oder Wasser gekennzeichnet sind. Nachdem das Problem jedoch gelöst wurde, funktionierte die Kartenerstellung einwandfrei. Kleinere Mängel müssen behoben werden (z. B. das Label Palmanor, das auf dem Wasser herauskam), aber im Großen und Ganzen sieht alles gut aus. Sogar die winzigen Inseln sind wunderschön geworden.

Am Ende entschied ich mich, dass durch die Verringerung der Auflösung des Voronoi-Gitters jeder Standort der Durchschnitt der Basisstandorte sein würde. Dies scheint eine vernünftige Entscheidung zu sein und kann bei Bedarf jederzeit geändert werden. Dieses Bild zeigt, wie Küstenlinien vom fertigen Raster getrennt wurden:


Zusammenfassend: Dragons Abound verwendet beim Erzeugen einer Höhenkarte ein Delone-Dreiecksraster mit sehr hoher Auflösung. Nach Abschluss des Vorgangs identifiziert Dragons Abound Küstenlinien, indem Übergänge von negativen zu positiven Werten in der Höhenkarte verfolgt werden. Dann kopiert das Spiel das hochauflösende Gitter in ein viel kleineres Gitter und ermittelt im Durchschnitt die Standorte, die an einem Ort des neuen Gitters liegen. Als nächstes wird das hochauflösende Gitter verworfen, und der Rest der Prozedurgenerierung und -visualisierung wird auf dem niedrigauflösenden Gitter fortgesetzt. Eine interessante Frage ist, ob die Verwendung des Delaunay-Netzes zu diesem Zeitpunkt von Wert ist. Es kann sich lohnen, einfach in ein Raster von Sechsecken oder ähnliches zu kopieren.

Jetzt auch beliebt: