Generazione procedurale di regioni sull'isola


29

Al momento ho isole che assomigliano a questo:

isola

E voglio suddividerlo proceduralmente in regioni, in questo modo:

isola con regioni

Quale algoritmo fa quello che sto cercando? Hai suggerimenti su come creare regioni coerenti come nell'immagine in basso. Il tuo aiuto è apprezzato.


Come hai ottenuto l'immagine dell'isola in primo luogo? L'hai generato e, in tal caso, come l'hai realizzato?
Vaillancourt

L'ho preso da un generatore di mappe online.
domisum il

Ci scusiamo per il ritardo nell'aggiornamento della mia risposta - ci è voluto più tempo per tornare a casa di quanto inizialmente previsto. Ho aggiunto alcune illustrazioni e collegamenti.
Pikalek,

Se hai ricevuto questo da un generatore online, dovresti guardare il generatore di mappe fantasy di Azgaar . Ha regioni e nomi, con parametri personalizzabili, e WB.SE dice ciao. È un github, quindi potresti essere in grado di controllare il loro codice.
Anoplexian - Ripristina Monica il

Risposte:


40

Nel mondo reale, quei confini provinciali seguiranno spesso caratteristiche geologiche come i fiumi.

Quindi forse un buon approccio sarebbe quello di modellare la geologia dell'isola e far cadere i confini da questo?

Red Blob Games ha alcuni buoni articoli su questo argomento, con risultati piacevoli.

Il suo approccio sembra coinvolgere l'uso della tessellazione del Voronoi e definire i fiumi come i confini tra le celle.

Dai un'occhiata agli altri articoli sul suo sito, ha scritto molto sull'argomento della generazione delle mappe .

isola


3
Si noti che nel mondo reale, le divisioni politiche o amministrative a volte hanno anche divisioni arbitrarie, di solito linee rette (ad esempio lungo linee di latitudine / longitudinale, linee tra picchi di montagna, ecc.).
Pablo H,

2
@PabloH Un buon punto, anche se i bordi diritti sembrano essere un fenomeno post-coloniale dell'era coloniale. Ma dal momento che non conosciamo l'impostazione del problema dei PO, potrebbe essere rilevante
Sentry il

27

Vorrei risolvere questo problema con due passaggi di diagrammi Voronoi:

Primo passaggio: partizionamento della regione

Il primo passaggio userebbe una distribuzione alquanto sparsa dei punti (cioè la distanza tra i punti dovrebbe essere relativamente grande) al fine di dividere approssimativamente l'isola in regioni (vedere la nota sotto relativa alla generazione dei punti). Quindi generare un diagramma Voronoi basato su questi punti. Questo dividerà l'isola in regioni poligonali attorno a ciascun punto, come mostrato di seguito:

inserisci qui la descrizione dell'immagine

Secondo passaggio: randomizzazione dei bordi

Ora che l'isola è stata divisa in regioni, il passo successivo è quello di "sgretolare" i confini tra di loro. Per fare ciò, genera un nuovo livello di punti usando una distribuzione più compatta dei punti (cioè la distanza tra i punti dovrebbe essere piccola) e usa nuovamente questi punti per creare un altro diagramma Voronoi. Successivamente per ciascuna regione più piccola, assegnala a una regione più grande controllandone il punto "seed". Ciò comporterà confini più frastagliati tra le suddivisioni più grandi. Ecco un primo piano di come appare con entrambi i diagrammi Voronoi in atto:

inserisci qui la descrizione dell'immagine

Ed ecco quella stessa area che mostra solo i confini finali:

inserisci qui la descrizione dell'immagine

Commenti su Point Generation

Per quanto riguarda la generazione di punti, mi piace usare una distribuzione di dischi Poisson per ottenere una distribuzione dei punti relativamente bella e uniforme. L'altra opzione comune è quella di ottenere una distribuzione altrettanto uniforme è quella di utilizzare l'algoritmo di Lloyd su una serie di punti casuali "regolari". LLoyd è più facile da codificare, ma può richiedere alcuni tentativi ed errori per determinare quanti passaggi sono necessari per ottenere il risultato desiderato.

Un potenziale problema con questo approccio è che il partizionamento del primo passaggio può generare regioni molto piccole. Se non li desideri nel tuo risultato finale, li fonderei semplicemente con una regione adiacente casuale.

Note finali

Le illustrazioni che ho fornito sono immagini raster, ma questa tecnica funziona anche con rappresentazioni poligonali / vettoriali.


1
Per le planimetrie procedurali questo è quello che faccio, faccio un diagramma Voronoi dai punti all'interno della regione (l'isola), costruisco una griglia (non deve essere rettangolare, nel tuo caso una griglia deformata) che racchiude la stessa regione, quindi calcola le intersezioni booleane della griglia e del Voronoi, calcola le aree e assegna a un albero di dati (elenco di elenchi, array frastagliato, ecc ... qualunque sia la struttura di dati che preferisci) in base alla percentuale 0,6 della cella della griglia più piccola, otterrai alcune celle mancanti, ma puoi confrontare la tua griglia abbattuta con l'originale per trovare e riassegnare il tuo albero.
Felipe Gutierrez,

Hai aggiunto immagini! Questo è esattamente quello che sto facendo per uno scopo diverso
Felipe Gutierrez, il

4

MineCraft lo fa bene e il suo algoritmo di generazione mondiale è stato analizzato e documentato a fondo.

Esistono varie descrizioni dell'algoritmo, una di queste qui: https://github.com/UnknownShadow200/ClassiCube/wiki/Minecraft-Classic-map-generation-algorithm

Il nucleo dell'algoritmo è un generatore di rumore Perlin . Questo controlla direttamente l'elevazione (più o meno, poiché anche il passaggio successivo per scolpire le grotte può cambiare la superficie), così come la generazione del bioma. Qualcosa come il generatore di biomi è probabilmente quello che vuoi usare per creare le tue aree.

(Una vecchia versione di esso) è documentata , fondamentalmente funziona utilizzando due diversi generatori di rumore Perlin, uno per "temperatura", uno per "precipitazione", quindi scegliendo il bioma da quei due. Le variabili stesse (temperatura e precipitazioni) non verranno realmente utilizzate nel gioco in seguito; per esempio, i deserti non hanno pioggia, ma il gioco lo determina dalla proprietà "desert", non dal valore di precipitazione originale.

Esistono vari strumenti online per generare una mappa del bioma da un seme casuale, uno di questi è mineatlas.com . Immagino che, internamente, utilizzino un server Java che utilizza le classi interne di MineCraft stesso; Non so se il loro codice sorgente sia disponibile direttamente.


4

Un tipico algoritmo utilizzato, ad esempio, da Azgaar ( codice sorgente ). È più o meno così:

  1. dividere la tua massa terrestre in aree più piccole, ad esempio attraverso triangolazione delauny o cellule voronoi.
  2. determinare (casualmente o altrimenti) le posizioni "iniziali" per le vostre culture, regni, religioni o qualsiasi altra cosa che si desidera simulare.
  3. determinare (in modo casuale o meno) un "fattore di crescita" per ciascuno di essi. Più differenza hai nei fattori di crescita, meno uniforme sarà la tua mappa finale.
  4. Ora scorre i tuoi regni (ecc.) E, in base al fattore di crescita, falli sparire nelle tessere circostanti e vuote fino a riempire l'intera mappa.
  5. Probabilmente vuoi finire con un po 'di raddrizzamento dei bordi, cambiando le celle che hanno un solo vicino nel loro colore e sono circondate da un altro diverso da quel colore.

3

Se sei interessato a farlo in formato vettoriale piuttosto che su approcci basati su raster, qualche tempo fa ho scritto un post sul blog praticamente esattamente questo.

http://blog.particracy.com/worlds-and-their-geography/

L'idea è di iniziare con una mesh (di solito Voronoi) e far crescere le regioni in modo concentrico da punti seminati casualmente che sono sufficientemente distanziati.


2

Che domanda divertente :) Questo approccio è un po 'basato sulle celle di Vornoi ma la metrica della distanza non è abbastanza euclidea (ho usato il potere di 1.5 invece di 2.0) e ha una casualità incorporata. Potrebbe saltare sull'acqua che non è l'ideale.

Le regioni vicine possono essere unite per ottenere forme più interessanti, qui ho usato gli N vicini più vicini per determinarlo.

Se sei interessato, posso approfondire e condividere il codice Python.

mappa 1 mappa 2

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.