Come viene utilizzata una funzione di rumore perlin 3d per generare terreno?


20

Posso avvolgere la testa usando una funzione di rumore perlin 2d per generare il valore dell'altezza, ma non capisco perché una funzione di rumore perlin 3d venga utilizzata. Nel blog di Notch, http://notch.tumblr.com/post/3746989361/terrain-generation-part-1 , ha menzionato l'uso di una funzione di rumore perlin 3d per la generazione del terreno su Minecraft. Qualcuno sa come sarebbe fatto e perché sarebbe utile? Se stai passando i valori x, ye z, questo non significa che hai già l'altezza?

Risposte:


19

Il rumore 2D perlin è buono per le mappe di altezza, ma in questo caso sembra che non stia usando una mappa di altezza. Invece ha una griglia 3D, in cui qualsiasi cella può essere vuota. Ciò consente grotte e tali formazioni, dove l'altezza del suolo non è un valore singolo per una determinata posizione 2D.


14

Invece di campionare l '"altezza del suolo", ho trattato il valore del rumore come la "densità", dove qualsiasi cosa inferiore a 0 sarebbe aria e qualsiasi cosa superiore o uguale a 0 sarebbe terra.

In poche parole, per ogni posto in cui può essere presente un blocco, viene valutata una funzione di rumore e se è> 0, viene posizionato un blocco. La funzione del rumore di Notch è distorta aggiungendo l'altezza dal livello dell'acqua al suo valore, ecco perché le aree inferiori sono per lo più solide (l'altezza è grande negativa, quindi anche l'altezza + il rumore è negativo) e le aree più alte sono per lo più vuote (l'altezza è grande positiva, quindi l'altezza + anche il rumore è positivo).

Probabilmente c'è qualche alchimia aggiuntiva per decidere quale tipo di blocco viene generato e per scolpire grotte. Ma suppongo che non sia direttamente correlato a questa funzione di rumore.

Si noti inoltre che questo metodo funziona per Notch perché Minecraft ha un terreno basato su voxel. Se si provasse a farlo in un mondo basato su poligoni, semplicemente campionare la funzione del rumore non sarebbe sufficiente. Devi usare un algoritmo per trasformare i campioni in una superficie e creare poligoni che si avvicinano a questa superficie. Uno di questi algoritmi sono i cubi in marcia .


8

Il rumore 3D diventa obbligatorio se il terreno necessita di reti di grotte e sporgenze.

Per estrarre un'isosuperficie dalle informazioni sulla densità, le 2 tecniche più popolari sono Marching Cubes (MC) e il più recente Dual Contouring (DC). La struttura dei dati necessaria è abbastanza diversa a seconda del metodo scelto.

Come accennato in precedenza, l'articolo GPU Gems 3 di Geiss è un punto di partenza molto istruttivo per la comprensione e l'implementazione di terreni MC sulla GPU (si noti che il suo approccio MC funziona interamente sulla GPU e richiede almeno SM4 - compatibile con GS).

Poiché i dati di densità sui voxel MC possono rimanere solo sui bordi del voxel, MC classico può contornare il volume senza preservare le caratteristiche dei bordi nitidi. DC non presenta questo inconveniente poiché le informazioni sulla densità sono espresse come un punto 3D (minimizer QEF) che si trova in qualsiasi punto all'interno del voxel più il segno in ogni angolo.

D'altra parte, MC non soffre di facce che si intersecano da sole perché tutti i triangoli generati sono racchiusi nei loro corrispondenti voxel, mentre DC ha bisogno di calcoli aggiuntivi per evitare intersezioni tra facce generate. Gli autori di DC hanno affrontato questo problema in una versione migliorata del loro algoritmo.

http://www.cs.wustl.edu/~taoju/research/interfree_paper_final.pdf

http://www.cs.berkeley.edu/~jrs/meshpapers/SchaeferWarren2.pdf

Questo collega propone anche un approccio probabilmente più pulito basato sull'analisi convessa / concava per evitare autointersezioni. Utilizza anche regole di suddivisione del quad migliori per aiutare a preservare l'orientamento del bordo:

http://www2.mae.cuhk.edu.hk/~cwang/pubs/TRIntersectionFreeDC.pdf

Inoltre, il MC classico non è "privo di crepe" e può richiedere patch crack se eseguito su oculari senza restrizioni. DC non soffre di quest'ultimo problema.

Ecco un bel sondaggio completo e completo sulla maggior parte delle tecniche di estrazione di mesh: http://www.cs.berkeley.edu/~jrs/mesh/

Un approccio octree / voxel è intrinsecamente "CSG-friendly", che semplifica la pianificazione di una strategia a livello di gioco completamente "distruttibile", ma se è necessario implementare tutto questo in un gioco, anche la profondità dell'octree dovrà essere frustum -dipendente.

Se tutto il materiale si adatta alla memoria o viene trasmesso correttamente, i dati possono anche essere utilizzati per il rendering di AO e il calcolo della fisica / collisioni.


"Il rumore 3D diventa obbligatorio se il terreno necessita di reti di grotte e sporgenze." Obbligatorio? Come in, questo è l'unico modo per generare grotte e strapiombi? No. Sto generando una mappa di altezza dal rumore del perlin 2D e quindi intagliando grotte e strapiombi in essa come un passaggio separato, per un aspetto più naturale. È fuorviante per i giovani sviluppatori di giochi in erba affermare che questo è l'UNICO modo per generare grotte e strapiombi in un mondo generato proceduralmente.
Domario

5

La mia ipotesi, in quel particolare esempio, è che abbia usato il valore z per determinare quale tipo di materiale: roccia fresca, pietra, sporco o aria.


-3

Minecraft utilizza l'algoritmo dei cubi in marcia per generare terreno 3D. Non ho referenze per questo, mi dispiace. Non sono sicuro di cosa stesse parlando Notch quando ha menzionato la funzione Perlin Noise, forse un seme per l'algoritmo dei cubi in marcia. Maggiori informazioni qui:

E un ottimo articolo sulle gemme GPU se sei interessato ai cubi in marcia:


2
Marching cubes è un algoritmo per generare una mesh da un campo scalare. Ciò significa che deve prima avere i dati, quindi genera una mesh per adattarli. Non è per la generazione di dati o terreno.
MichaelHouse

-6
for (int x = 0; x < Width) 
{
  for (int y = 0; y < Depth) 
  {
    for (int z = 0; z < Height) 
    {
      if(z < Noise2D(x, y) * Height) 
      {
        Array[x][y][z] = Noise3D(x, y, z)
      } else {
        Array[x][y][z] = 0
      }
    } 
  } 
} 

2
-1; Anche con il chiarimento che hai aggiunto, questa è una risposta piuttosto negativa, non spiega chiaramente lo scopo dello snippet di codice né il suo impatto semantico sui dati risultanti e non affronta la maggior parte delle domande che l'utente ha effettivamente posto.

Ho modificato il codice, che ne dici adesso?
Maxim DC

Spiega come il rumore 3D viene utilizzato per creare il terreno, questo è corretto secondo me
Maxim DC

Quindi spiegalo nella tua risposta e affronta le domande poste dall'utente. Altrimenti è una risposta deadcode.
Tom 'Blue' Piddock,
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.