Flüsse in einem Raster rendern

8

Ich habe eine zufällige Höhenkarte erstellt und jetzt möchte ich Flüsse erstellen. Ich habe einen Algorithmus basierend auf einem * erstellt, um Flüsse von Gipfeln zum Meer fließen zu lassen, und jetzt bin ich auf der Suche nach einem eleganten Algorithmus, um sie zu rendern.

Es ist ein quadratisches 2D-Kartenraster. Die Zellen, die der Fluss pases, haben einen einfachen ganzzahligen Wert mit dieser Form: rivernumber && pointOrder. Dh: 10, 11, 12, 13, 14, 15, 16 ... 1 + N für den ersten Fluss, 20,21,22,23 ... 2 + N für den zweiten usw. Dies wird in der erstellt Die Generierungszeit des Kartenrasters wird nur einmal ausgeführt, wenn die Welt generiert wird.

Ich wollte jeden Fluss als Vektor behandeln, aber es gibt ein Problem: Wenn derselbe Fluss Zweige hat (weil ich etwas Lärm mache, um Zweige zu erzeugen), kann ich die Punkte nicht einfach der Reihe nach verbinden.

Die zweite Alternative besteht darin, einen komplexen Algorithmus zu generieren, bei dem jeder Punkt analysiert wird, geprüft wird, ob der nächste kein Zweig ist, wenn dies der Fall ist, ein anderer Algorithmus ausgelöst wird, der sich um den Zweig kümmert, und dann zum Hauptfluss zurückkehrt usw. Sehr komplex und unelegant.

Vielleicht gibt es eine Lösung im Algorithmus zur Erzeugung der Welt oder im Algorithmus zur Flusswiedergabe, die in diesen Fällen häufig verwendet wird und die mir nicht bekannt ist.

Irgendwelche Tipps? Vielen Dank!!

Gabriel A. Zorrilla
quelle
Ich denke, Sie könnten einige Algorithmen verwenden, die für die Labyrinth-Erzeugung verwendet werden, und einfach einige Egdes schneiden, um eine realistischere Flusskarte zu erstellen.
Ali1S232
1
Ich habe den Flussweg, weiß aber nicht, wie ich mit Ästen umgehen soll, wenn ich sie rendere und Punkte verbinde.
Gabriel A. Zorrilla
Haben Sie einen Punkt am Zusammenfluss (Treffpunkt zweier Flüsse), der als eine besondere Art von Knoten behandelt wird?
Die kommunistische Ente
1
Ich habe einmal einen Artikel über das Erstellen von Straßen auf einer Tilemap gesehen. Es wurden Kacheln ausgewählt, basierend darauf, auf welchen Nachbarkacheln auch Straßeneigenschaften vorhanden sind. Es wurden ungefähr 16 verschiedene Kacheln erstellt (einschließlich aller Rotationen). Dieser Schritt wurde nur während der Szenengenerierung ausgeführt. Ich weiß nicht, ob Sie das Gleiche tun könnten oder nicht.
Ali1S232
4
Können Sie uns einen Screenshot mit einigen Skizzen darüber geben, um besser zu zeigen, was Sie versuchen zu tun?
AttackingHobo

Antworten:

1

Dieses Tutorial / Game Dev-Blog bietet eine hervorragende Methode zum Generieren von Flüssen und sie rendern sehr gut. Ich bin mir nicht sicher, ob dies in Ihrer Situation effektiv angewendet werden kann, da Sie einen anderen Ansatz gewählt haben (und eine gitterbasierte Karte haben), aber es lohnt sich auf jeden Fall, einen Blick darauf zu werfen.

dlras2
quelle
Das ist wirklich schön.
Tim Holt
1
Weitere Details, die nützlich sein können: Flüsse in diesem Projekt fließen von Bergen in die Ozeane. Das Volumen nimmt zu, wenn es bergab fließt, und Flüsse, die sich verbinden, addieren ihr Volumen. Die Linienbreite auf der Karte ist das Quadrat des Volumens. Jeder Ort im Fluss zeigt bergab; Eine Gabelung im Fluss bedeutet, dass zwei oder mehr Stellen auf dieselbe Abfahrtsstelle zeigen. Ich denke, dies könnte auch in einem Raster verwendet werden.
Amitp
0

Eine Sache, die Sie tun können, ist, jeden einzelnen Knoten selbst behandeln zu lassen. Machen Sie einen Pass darüber, wenn nach der Generierung, aber vor dem Anzeigen, und geben Sie jedem Flussquadrat eine Liste der Ein- und Ausgänge (niedrigere Anzahl, gleicher Fluss) und Ausgänge (höhere Anzahl, gleicher Fluss).

Anhand dieser Daten sollten Sie in der Lage sein, herauszufinden, wo sich die Eingänge und Ausgänge befinden (das Speichern der relativen Position würde wahrscheinlich helfen), und Sie können von dort aus den Fluss dieses Platzes anhand der Verbindungen rendern. Der einfachste Weg, eine Verzweigung durchzuführen, besteht darin, die Ein- / Ausgänge mit der Mitte des Platzes zu verbinden.

Die grafische Darstellung kann auf viele verschiedene Arten erfolgen, und Sie haben nicht genügend Informationen über die Verwendung angegeben, damit ich eine direkt empfehlen kann. Stattdessen möchte ich nur einen Weg erwähnen , der ein Partikelsystem beinhaltet, bei dem jedes Wassersegment dynamisch "bergab" fließt.

Lassen Sie das Wurzelquadrat an jedem seiner Eingänge eine Anzahl von "Wasserstücken" beginnen und diese zufällig aus den verfügbaren Ausgängen bei der Erstellung auswählen. Wenn es den Ausgang erreicht, spawne eins an dem Plättchen, das es am Eingang getroffen hat, und bringe das Wasserstück an den Anfang seines Quadrats zurück. Da es bereits auf dem nächsten Quadrat erscheint (dies nur einmal pro Stück in einem Quadrat) und Sie die Einstellungen und Berechnungen bereits kennen (nicht erneut randomisieren), können Sie dieses Stück mit sehr wenig Schleife in seinem Quadrat schleifen lassen Berechnung, und wenn Sie wollten, wahrscheinlich mit einem Shader.

Dies hat den Vorteil, dass Ihre Flüsse nach Abzweigungen auch zu kleineren Flüssen fließen können und die beiden resultierenden Flüsse nicht gleich groß sein müssen. Es wird einen Moment dauern, bis sich der Fluss von oben nach unten vollständig besiedelt hat, aber der resultierende Effekt sollte recht angenehm sein, da Sie am Ende so etwas haben könnten, einfach basierend darauf, welche Knoten Flüsse haben.

10--10--6--6--2--2
    |      |     
    4--4   4
       |   |
       4---6--6--6
       |  
       2

Abhängig von Startwert und Code kann es auch bei jeder Ausführung anders aussehen, selbst wenn die Knotenplatzierung gleich ist.

Hoffe, dieses Beispiel ist irgendwo in der Richtung, die Sie suchen.

Lunin
quelle