Generazione procedurale fluviale o stradale per terreni infiniti


28

Dovrei dire percorsi, non strade, perché penso più in stile medievale. Inoltre, non cerco realismo. La risposta che sto cercando sarà quella di adattarmi allo stampo che descrivo piuttosto che al realismo.

Sto cercando un metodo per generare strade / fiumi procedurali in un modo sinuoso, ma voglio farlo per un sistema di tipo di terreno infinito. Proprio come il rumore del perlin genera i BLOB, voglio generare segmenti di linea di lunghezza casuali (possibilmente lunghezza infinita).

Sono a conoscenza di strategie come la risposta suggerita trovata qui , tuttavia si basa su un punto iniziale e finale specificato per funzionare, non ho un punto iniziale e finale specificati. Mi piacerebbe poter semplicemente chiamare una funzione usando coordinate arbitrarie e fare in modo che ritorni se le coordinate specifiche fanno parte del fiume / strada.

Non voglio richiedere che il terreno venga generato in anticipo. Ciò include una mappa di altezza (come quella usata per simulazioni di pioggia o simili). Inoltre, non vorrei richiedere un punto iniziale / finale.

Esiste un tale algoritmo o modifica di un algoritmo di rumore che qualcuno potrebbe conoscere per realizzare ciò che sto cercando di spiegare?

Il più vicino a cui sono arrivato finora sono i frattali a più punte, se sto usando il nome correttamente. Sto solo prendendo il valore assoluto del rumore di valore (supponendo che sia ridimensionato da -1 a +1) e impostando una soglia. Il mio problema principale con questo è che le linee si sovrappongono troppo spesso, sono per lo più circolari, a volte convergono per formare grandi laghi che è pulito ma indesiderato, e spesso volte lo spessore delle linee varia troppo.

Ecco una foto di ciò che ho finora in 2D, ma a una frequenza molto alta per mostrare più dettagli:

inserisci qui la descrizione dell'immagine


poiché i fiumi "scorrono", potrebbe essere facile determinare i fiumi semplicemente usando il rumore per determinare il punto di origine, dopodiché usa semplicemente i dati grezzi della mappa di altezza per determinare il percorso.
Guerra,

le strade potrebbero essere un po 'più impegnative, ho considerato la costruzione di strade in base all'uso, se un giocatore / tutti i giocatori avessero camminato regolarmente su un terreno, sarebbe diventato un percorso.
Guerra,

1
@ user19142 OK, non un duplicato allora. Potresti trovare un certo uso anche da questa domanda / risposta: gamedev.stackexchange.com/questions/53400/… E includerò di nuovo i link precedenti come "correlati" gamedev.stackexchange.com/questions/45403/… gamedev. stackexchange.com/questions/29044/… gamedev.stackexchange.com/questions/31263/…
MichaelHouse

4
Penso che le strade non saranno molto credibili se generate con il rumore. Le strade sono create dall'intelligenza anziché dalla fisica e dal tempo. Sebbene a volte possano assomigliarsi a vicenda, sono abbastanza diversi da non poter utilizzare lo stesso algoritmo per entrambi.
MichaelHouse

1
Le strade di quel progetto erano linee di contorno che seguivano altezze specifiche, quindi potresti generarle localmente. Ha funzionato lì, ma le mappe di altezza non sono state generate con il rumore di Perlin.
tra il

Risposte:


11

Solo la mia idea di archiviare ciò che vuoi senza (molto) precomputazione e la possibilità di un mondo infinito.

Il primo aspetto dell'algoritmo è l'uso dei diagrammi Voronoi . Dividi il tuo mondo in griglie, ogni griglia ha un indirizzo nella forma (xgrid, ygrid). Per ogni cella in cui è necessario creare strade, si inseriscono le variabili xgrid e ygrid in una funzione hash che restituisce un numero CellSeed . Si utilizza CellSeed come seme per un generatore di numeri casuali che genera le coordinate dei punti per il diagramma Voronoi.

Ora è necessario cercare i bordi del diagramma e i nodi in cui si scontrano più bordi. È inoltre possibile memorizzare le informazioni in un grafico per un accesso più semplice.

Dopo questo passaggio è possibile cercare percorsi attraverso la rete validi.

Per percorsi validi ora puoi creare le strade (hanno bordi di sharph).

Nota : è inoltre necessario generare le coordinate del diagramma Voronio per tutte le celle Neighbour in modo da non avere bordi sui bordi della cella.

Se non si desidera i bordi di sharph, è possibile calcolare il punto medio di ciascuna connessione e utilizzare la direzione come tangente per un'interpolazione più bezier tra due bordi nel grafico.

Informazioni sull'uso dei diagrammi Voronoi

Per archiviare città come strutture stradali i punti della funzione pseudo casuale possono essere allineati su una griglia, in modo che i modi siano rettangolari.

Per strade più come contea, i punti devono essere più non ordinati.

diagramma da Wikipedia

Informazioni sulla funzione Pseudo casuale per generare le posizioni dei punti per i diagrammi Voronoi

Può essere una normale funzione casuale o un set Hammersley per una distribuzione più uniforme e non uniforme dei punti.


Hai qualche esempio di funzione hash? Ho lo stesso obiettivo (un mondo infinito che usa il voronoi per le strade) ma non riesco a capire come dovrebbe essere fatto. Ogni lib vorioi che posso trovare si aspetta le coordinate di un riquadro che delimita immediatamente lo scopo.
BotskoNet,

No, la funzione hash serve solo per assegnare un inizio alla cella. Può essere qualcosa di banale come x * prime1 + y * prime2 + z * prime3. Laddove i numeri primi non sono uguali tra loro e idealmente grandi, dovresti calcolare qui con numeri interi / non firmati a 64 bit. Non è un problema se la lib usa un rettangolo di selezione, perché per ogni cella devi solo consolare tutti i punti nella cella più tutti i punti delle celle di vicinato (che sono 8 celle di vicinato).
Quonux,

Probabilmente ti imbatterai in problemi di precisione con precisione singola se la lib usa la precisione singola o se usi la precsione singola. Per aggirare il problema se la lib usa solo la precisione singola e non si fa come segue: prima di convertire le posizioni in precisione singola sottrarre la posizione globale della cella centrale da esse, quindi inserirla come float nella lib, quindi trasformare il risultati indietro.
Quonux,

In realtà non ho mai implementato questo algoritmo ma la funzione hash può essere davvero banale.
Quonux,

8

Per la creazione di strade (e città), il miglior documento che ho trovato è questo:

Modellistica procedurale delle città di Y Parish e P Müller

Questo utilizza il sistema L e può generare modelli di strade statunitensi e dell'UE. Se non vuoi generare strade per un'intera città, puoi semplicemente generare le strade principali. Può contenere una mappa di altezza, una mappa dell'acqua e una mappa della densità di popolazione in input.


+1 solo perché mi è piaciuto il giornale. Davvero non si adattava a come volevo tentare di generare strade / sentieri / fiumi MENTRE generando dinamicamente il terreno.
Mitici il

6

La sezione "Generazione di strade 3D" http://vterrain.org/Culture/Roads/ contiene alcune informazioni sulla generazione di strade .

Il problema con le strade è che collegano punti di riferimento (anche se spesso seguono il terreno invece di andare dritto da A a B).

Personalmente, genererei il terreno, quindi posizionerei i fiumi (magari usando l'erosione, vedi http://vterrain.org/Water/ sezione "idrogeologia"), quindi posizionerei le città in luoghi dove ha senso (ad esempio vicino a un fiume o altro fonte di acqua, o in un luogo dove l'acqua potrebbe essere trasportata utilizzando acquedotti o torri e condotte d'acqua) e infine generare strade tra le città.

Per renderlo più facile da usare in un mondo procedurale, è possibile creare punti intermedi sul terreno in cui le strade avrebbero più probabilità di andare quando generati in quel luogo, quindi collegare i punti intermedi se una strada viene effettivamente creata in quel luogo.


4

Innanzitutto, i fiumi e le strade sono molto diversi. Le strade tendono a seguire isoline (stessa / simile elevazione) - il motivo è che è molto più facile viaggiare su strade che non salgono o scendono molto. I fiumi, d'altra parte, viaggiano perpendicolarmente alle isoline / isocline (in discesa). I fiumi si formano in bacini (raccolte di montagne che scorrono tutte verso il basso in una determinata valle) e tendono a formare strutture simili ad alberi. Inoltre, le strade viaggiano spesso perpendicolari ai fiumi, al fine di formare ponti logici. L'idea migliore è prima di generare fiumi e quindi creare strade logiche (cioè strade tra le città). Purtroppo non ho tempo di approfondire i dettagli, ma spero che questo ti porti sulla strada giusta.

Potrebbe sembrare ovvio, ma guarda le mappe di Google su vari tipi di terreno e strade; avrai un'idea migliore di come dovrebbero apparire.


1
Ho modificato di nuovo la domanda per renderlo più chiaro che non sono interessato al realismo da nessuna parte quanto sono nel modo in cui l'algoritmo dovrebbe funzionare. Apprezzo comunque la risposta, sebbene principalmente per alcuni dei termini utilizzati. Prova a pensare al mio desiderio più come infiniti scarabocchi di lunghezza casuale che possono essere generati con i dati minimi necessari (come la mappa di altezza).
Mitici
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.