2009-09-19 21 views
14

Sto cercando alcuni algoritmi che mi consentono di generare una mappa del terreno 2D realistica. Con realismo intendo quella persona considererà tale mappa come una "normale" mappa del terreno, non creata artificialmente. Non voglio creare una mappa fotorealistica. Solo qualcosa di simile alle mappe che possono essere visualizzate in un atlante geografico.Generazione di mappe geografiche 2D realistiche

Finora sto utilizzando perlin noise per la mappa di altezza e quindi sto aggiungendo laghi, fiumi, montagne, paludi e così via. Si può guardare come appare sulla foto qui sotto:

Terrain map http://www.freeimagehosting.net/uploads/1f1e9372bf.png

non sono felice con esso. Non è realistico ma non riesco a capire qualcosa di meglio da solo. Il tempo non è una questione quindi gli algoritmi possono essere pesanti computazionali.

Grazie per il vostro tempo.

Dopo edit:

Penso di aver trovato un articolo che può essere utile: http://portal.acm.org/citation.cfm?id=1255047.1255077

Tuttavia non può essere ottenuto gratuitamente, quindi sono ancora in cerca di risposte o idee.

+4

Non riesco a trovare l'articolo che volevo, ma fondamentalmente ha usato un sistema di colline basate sulla località per generare belle isole. È probabilmente collegato a qui: http://pcg.wikidot.com/articles Ma io cba attraverso tutti loro. – Pod

+0

+1 per l'ottimo collegamento. Grazie per le risorse Pod. Li trovo davvero utili. – Wodzu

+0

Non hai detto perché non è realistico, qualifica ciò di cui non sei soddisfatto in quei rendering, i fiumi, i bordi, le forme ... non mi piace il rapporto tra verde e blu, troppo verde non dà contrasto, e il i fiumi sono lo fi ... quindi almeno aggiungi più acqua o alcune informazioni sull'altezza come spiagge, delta, picchi ecc. e più coste. –

risposta

2

Il terreno è creato da una miriade di cause diverse su molte scale temporali diverse. Per creare veramente un terreno realistico, dovresti simularli.

Nel termine "breve", l'idrosfera determina la maggior parte delle caratteristiche. Probabilmente puoi iniziare con un terreno voxel/particle/heightmap/mesh contenente le principali caratteristiche (catene montuose ecc.) E trattarlo come immutabile, quindi post-elaborarlo con una pletora di simulazioni di acqua. Avrai bisogno di calcolare dove saranno i fiumi e i laghi, come eroderanno il paesaggio di base e dove formeranno i depositi. Se dovessi scrivere questo codice probabilmente inizierei con un mondo voxel in 3D.

Questo sarebbe un compito gigantesco e sono sicuro che ci sono molti trucchi disponibili per generare tipi di terreno specifici che impiegano millisecondi anziché minuti. Che tipo di terreno stai cercando di creare? Montagnoso? Pianura? Industrializzati? Foresta? Deserto? Arcipelago?

Per farla breve: se vuoi un terreno che sia realistico per gli umani (che tendono ad essere, dopo tutto, esperti su questo genere di cose), dovrai crearlo simulando i processi geologici effettivi.

5

Ho giocato con la generazione del terreno prima. Supponendo che l'obiettivo sia un bitmap ho trovato un modo per rendere le cose come i fiumi e in generale farlo sembrare migliore: l'erosione.

Una volta che il terreno generato da altri mezzi lo ha eroso un po ': hai bisogno del mondo espresso come altezza dei pixel. Prendi un punto sulla mappa e sposta un'unità di altezza al vicino più basso. Sposta il cursore su questo vicino e ripeti finché non si muove. Ripeti per altri pixel.

Per fare in modo che i fiumi contino il numero di volte che si attraversa una posizione spostando i bit verso il basso. I punti più colpiti sono i fiumi.

Follow-up: Non stavo erodendo ogni pixel tanto semplicemente come un numero elevato di pixel casuali fino a quando non ha resistito abbastanza. La ragione per cui effettivamente li si sta erodendo è che questo porta i bit in basso e riempie i buchi. Senza di ciò non ci possono essere fiumi in quanto vi saranno morti che intrappolano il flusso - i pixel fluenti riempiono qualsiasi piccolo buco e rendono i canali di lavoro funzionanti.

Mi spiace non posso dare alcun campione, questo era molti anni fa e mentre il vecchio codice è probabilmente in giro da qualche parte non so dove cercare.

+0

Grazie Loren. Non sono sicuro di aver capito bene. Devo erodere ogni pixel sulla mappa? Questo è in qualche modo paragonabile a solo per un esempio che inizia in cima alla collina locale e che scende in una determinata direzione. Con "scendendo" intendo la ricerca di pixel vicini con altitudine inferiore o uguale. E continua fino a quando la condizione non viene violata. Questo è quello che sto facendo ora (ma non abbasserò l'altitudine) e potresti vedere i risultati. Sarebbe bello se potessi vedere alcuni screenshot dal tuo generatore. – Wodzu

+0

@Wodzu, penso che il suggerimento di Loren sia la direzione giusta per te. E no non devi erodere ogni pixel; ma dovresti spostarne alcuni (spostali, il sedimento è anche importante per la forma). Vedi l'immagine http://markjstock.org/pages/builder.html per "erode". – Unreason

1

Il mio metodo in Terra3D era di generare valori di altezza casuali e quindi di eseguire 3 passaggi di livellamento con un piccolo rimodellamento scritto nell'algoritmo. Il rimodellamento fa sì che il terreno sotto la linea di galleggiamento si sposti verso il basso un po 'e tutto al di sopra della linea di galleggiamento si alzi un po'. L'effetto però è un sacco di colline e piccoli laghi. E quello potrebbe non essere quello che stai cercando esattamente.

Tuttavia, non sono convinto che il principio dietro al mio metodo non possa essere utilizzato per ottenere ciò che si desidera. Dovresti semplicemente scrivere alcune condizioni nell'algoritmo di rimodellamento/levigatura. Ad esempio, riducendo la quantità di levigatura sul terreno a quote più elevate si creerà un aspetto più roccioso. E poi scrivere un algoritmo di smoothing (o gaussiano) più complesso che si estende ulteriormente per le quote più basse potrebbe tirare insieme quei laghi per formare fiumi naturali.

Ecco il codice per la generazione del terreno in Terra3D nel caso in cui si è interessati:

// GENERATE TERRAIN 
    for (i = 0; i < MAX; i++) 
    {  
    for (i2 = 0; i2 < MAX; i2++) 
    { 
     if (i<10 || i2<10 || i>MAX-10 || i2>MAX-10) 
     field[i][i2].y=0; 
     else 
     field[i][i2].y=(GLfloat(rand()%151)-75)/50+(field[i-1][i2-1].y+field[i-1][i2].y+field[i-1][i2+1].y+field[i-1][i2-2].y+field[i-1][i2+2].y)/5.05; 
    } 
    } 

    // SMOOTH/RESHAPE TERRAIN 
    for (int cnt = 0; cnt < 3; cnt++) 
    { 
    for (int t = 1; t < MAX-1; t++) 
    { 
     for (int t2 = 1; t2 < MAX-1; t2++) 
     { 
     field[t][t2].y = (field[t+1][t2].y+field[t][t2-1].y+field[t-1][t2].y+field[t][t2+1].y)/4; 

     if (cnt == 0) 
     { 
      if (field[t][t2].y < -1 && field[t][t2].y > -1-.5) field[t][t2].y -= .45, field[t][t2].y *= 2; 
      else if (field[t][t2].y > -1 && field[t][t2].y < -1+.5) field[t][t2].y += .5, field[t][t2].y /= 5; 
     } 
     } 
    } 
    } 

E 'il codice sciatta che ho scritto circa 10 anni fa. Terra3D è stato un lungo processo di apprendimento e sperimentazione al buio per produrre il tipo di effetti che stavo cercando. Ma forse ti sarà d'aiuto.

+1

Oh mio Dio quel menu sul tuo sito web era fastidioso! –

+1

Ah sì, ho creato quel menu quando avevo 18 anni. Haha, basta abbassare un po 'il volume. ;) –

+0

Grazie Steve per il tuo interesse e per il codice. Sto ancora lavorando al mio generatore! Il tuo codice è buono per un simulatore di volo 3D perché in questo tipo di giochi l'utente è soddisfatto avendo alcuni laghi e montagne. A lui non importa molto della struttura del terreno e della sua logica. Tuttavia, sto cercando di realizzare qualcosa di diverso. Se apri un album geografico e guardi il terreno, vedi che è casuale, ma comforma anche alcune regole. f.e. un fiume cade dalle montagne a qualche lago o mare, o le montagne sono disposte in alcuni gruppi. – Wodzu

1

So che questa è una domanda molto vecchia, ma sto rispondendo a questo per le persone future alla ricerca di un buon generatore di terreno, come lo ero io. Usa la versione gratuita di World Machine 2. È un generatore di terreno che può fare esattamente quello che stai chiedendo e altro ancora. È stato utilizzato dai professionisti per generare immagini, terreni 3D in 3D e persino per mappe come quello che stai suggerendo. Si noti che la versione gratuita è solo per usi non commerciali.

+0

A proposito, il sito Web è www.world-machine.com –

+0

Libero è molto limitato sulle dimensioni della mappa E genera la mappa solo una volta (o quante volte si preme il pulsante "genera"), che non è molto soddisfacente quando si desidera una mappa generata a caso nella propria applicazione :) –

+0

Grazie Felipe M. La domanda è vecchia, ma sono comunque interessato a qualsiasi aiuto. Ti sto dando +1 per la tua risposta perché il generatore di terreno per il quale hai dato il link, produce un terreno davvero bello. Tuttavia, questo terreno non ha ancora alcun senso logico;) Ok, può generare una montagna e un po 'd'acqua. Ma sta generando un "grappolo" degli stessi oggetti. Dove sono laghi, fiumi e altre montagne? Questi "oggetti" devono essere posizionati sulla mappa in modo naturale, come farebbe la madre natura :) Ad esempio: il fiume scorre da una montagna all'altra. – Wodzu