Rendering di fiumi in una griglia


8

Ho creato una mappa di altezza casuale e ora voglio creare fiumi. Ho creato un algoritmo basato su un * per far fluire i fiumi dalle vette al mare e ora sono alla ricerca di un algoritmo elegante per renderli.

È un 2D, quadrato, mapgrid. Le celle che il fiume ha un valore intero semplice con questa forma: rivernumber && pointOrder. Vale a dire: 10, 11, 12, 13, 14, 15, 16 ... 1 + N per il primo fiume, 20,21,22,23 ... 2 + N per il secondo, ecc. Questo viene creato nel mappa tempo di generazione della griglia e viene eseguito solo una volta, quando il mondo viene generato.

Volevo trattare ogni fiume come un vettore, ma c'è un problema, se lo stesso fiume ha dei rami (perché metto un po 'di rumore per generare rami), non posso semplicemente collegare i punti in ordine.

La seconda alternativa è quella di generare un algoritmo complesso in cui analizza ogni punto, controlla se il successivo non è un ramo, in tal caso attiva un altro algoritmo che si occupa del ramo, quindi ritorna sul fiume principale, ecc. Molto complesso e inelegante.

Forse esiste una soluzione nell'algoritmo di generazione mondiale o nell'algoritmo di rendering del fiume che viene comunemente usato in questi casi e di cui non sono a conoscenza.

Qualche consiglio? Grazie!!


Immagino che potresti usare alcuni algoritmi usati per la generazione del labirinto e tagliare alcuni egdes per creare una mappa fluviale più realistica.
Ali1S232,

1
Ho il percorso del fiume, ma non so come gestire i rami durante il rendering, collegando i punti.
Gabriel A. Zorrilla,

Hai un punto alla confluenza (punto di incontro di due fiumi) che viene trattato come un tipo speciale di nodo?
Il comunista Duck il

1
Una volta ho visto un articolo sulla creazione di come rendere le strade su una piastrella. Ha selezionato le tessere in base alle quali le tessere vicine hanno anche proprietà stradali. ha creato qualcosa intorno a 16 tessere diverse (comprese tutte le rotazioni). questo passaggio è stato fatto solo durante la generazione della scena. non so se potresti fare la stessa cosa o no.
Ali1S232,

4
Puoi darci uno screenshot con alcuni schizzi su di esso per mostrare meglio cosa stai cercando di fare?
Attaccando

Risposte:


1

Questo blog di sviluppo tutorial / gioco offre un metodo eccellente per generare fiumi e rende molto bene. Non sono sicuro che questo possa essere applicato efficacemente nella tua situazione, dato che hai adottato un approccio diverso (e hai una mappa basata sulla griglia), ma vale la pena esaminarlo, di sicuro.


È molto carino.
Tim Holt,

1
Maggiori dettagli che potrebbero essere utili: i fiumi in quel progetto scorrono dalle montagne agli oceani. Il volume aumenta mentre scorre in discesa e i fiumi che si uniscono aggiungono i loro volumi. La larghezza della linea sulla mappa è il sqrt del volume. Ogni posizione nel fiume punta in discesa; un bivio nel fiume significa che due o più posizioni indicano lo stesso punto in discesa. Penso che questo potrebbe essere usato anche su una griglia.
entro il

0

Una cosa che potresti fare è far gestire ogni singolo nodo. Passaci sopra dopo la generazione ma prima di visualizzare e dai a ogni piazza del fiume un elenco di ingressi (numero inferiore, stesso fiume) ed uscite (numero più alto, stesso fiume).

Da questi dati dovresti essere in grado di capire dove si trovano l'ingresso (i) e le uscite (la memorizzazione della posizione relativa sarebbe probabilmente utile) e da lì puoi renderizzare il fiume di quel quadrato in base alle connessioni. Il modo più semplice per creare una diramazione è collegare gli ingressi / le uscite al centro della piazza.

La rappresentazione grafica di questo potrebbe essere presa in molti modi diversi, e tu non mi hai dato abbastanza informazioni sul suo uso da consigliarmi direttamente; così invece citerò solo un modo che coinvolge un sistema particellare in cui ogni segmento di acqua scorre dinamicamente "in discesa".

Chiedi al riquadro radice di iniziare un certo numero di "pezzi d'acqua" in ciascuno dei suoi ingressi e fai decidere casualmente dalle uscite disponibili al momento della creazione. Quando colpisce l'uscita, genera uno alla tessera che ha colpito all'ingresso e riporta il pezzo d'acqua all'inizio del suo quadrato. Dal momento che è già stato generato nel riquadro successivo (esegui questa operazione una sola volta per pezzo in un riquadro) e conosci già le impostazioni e i calcoli (non ri-randomizzare), puoi lasciare che questo pezzo passi in loop nel suo quadrato con pochissimo calcolo e, se lo si desidera, probabilmente usando uno shader.

Questo ha il vantaggio di lasciare che i tuoi fiumi vadano anche a fiumi più piccoli dopo i rami, e i due fiumi risultanti non devono avere le stesse dimensioni. Ci vorrà un momento perché il fiume si popoli completamente dall'alto verso il basso, ma l'effetto risultante dovrebbe essere piuttosto piacevole in quanto potresti finire con qualcosa del genere semplicemente in base a quali nodi hanno fiumi.

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

Inoltre, a seconda del seed e del codice, potrebbe avere un aspetto diverso ogni volta che lo esegui, anche se la disposizione dei nodi era la stessa.

Spero che questo esempio sia da qualche parte lungo le linee che stai cercando.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.