Come rimuovere il terreno galleggiante quando generato con 3D Perlin Noise?


10

Attualmente sto usando il 3D Perlin Noise per generare terreno casuale in combinazione con Marching Cubes.

Il mio problema sembra risiedere nel ridimensionare la funzione del rumore per ottenere altezze ragionevoli nel mio terreno. Se viene utilizzata solo un'ottava, tutti i punti relativi al rumore vengono ovviamente interpolati, il che si traduce in dati abbastanza fluidi. Tuttavia, per ottenere sporgenze / grotte / terreno frastagliato, devo usare più ottave con ampiezze variabili e / o ridimensionare i valori risultanti alla mia altezza "massima" che desidero della mappa.

Potrei mancare qualcosa, ma usando cubi in marcia con rumore di perlin 3D, ottengo regolarmente frammenti di terreno fluttuanti.

Qualche idea su come potrei correggerlo o se ci sono altre funzioni di rumore che potrei usare per ottenere risultati come sto descrivendo? Sto cercando colline / valli / montagne / laghi / ecc. Non sono necessari bit mobili separati dal resto della mappa. Credo che questo sia un problema simile a quello che ha Minecraft quando ha un terreno che galleggia nel cielo di tanto in tanto di generazione in generazione.

Grazie per qualsiasi aiuto, Mythics

Risposte:


9

Probabilmente l'unico modo per sbarazzarsi completamente del terreno galleggiante è testare la connettività. A seconda della dimensione della tua mappa, potrebbe essere un'opzione. Puoi farlo selezionando il punto base, come il fondo del tuo mondo. Quindi assicurati che tutti i tuoi voxel siano:

  1. Collegato alla base.
  2. Collegato a un voxel collegato alla base.

Probabilmente partire da un punto collegato noto (come il fondo del tuo mondo), quindi fare una prima traversata di voxel collegati funzionerebbe abbastanza bene. Assicurati di contrassegnare i voxel come connessi mentre sei in viaggio. Puoi farlo per pezzo.

Inoltre, ci sono modi meno costosi per ridurre al minimo, ma non rimuovere completamente il terreno galleggiante.

  • Distorsione del gradiente : è possibile distorcere il posizionamento di voxel solidi con un gradiente. La funzione gradiente cadrà in qualche modo bruscamente dopo essere sopra il "livello del suolo". Questo articolo parla dell'uso di una sfumatura e contiene alcuni altri suggerimenti.

  • Disturbo della mappa dell'altezza : è possibile generare invece rumore come mappa dell'altezza. Ciò eliminerebbe le sporgenze e le grotte, ma è possibile simulare quelle con un ulteriore livello di rumore sottrattivo.

  • Rumore meno rumoroso : usa meno ottave nel rumore del tuo terreno e genera rumore sottrattivo per ottenere sporgenze e grotte.


Il terreno potrebbe essere collegato solo attraverso il pezzo adiacente se è una sporgenza da lì.
Loren Pechtel,

@Loren: Va benissimo però. Fintanto che il motore ti consente di indirizzare i blocchi per indice completo, funzionerebbe senza problemi.
Phil

@LorenPechtel Dico che puoi farlo per pezzo, ma dovresti controllare i pezzi adiacenti quando sei sul bordo di un pezzo. Questo può diventare un problema quando si genera un nuovo terreno e non è stato generato il blocco adiacente. Quando vieni in questa situazione in cui hai un potenziale terreno fluttuante, puoi generare il blocco adiacente o utilizzare l'algoritmo noise per analizzare i voxel fino a trovare "roccia fresca" o una connessione nota al blocco corrente.
MichaelHouse

0

potrebbe essere troppo tardi per rispondere, ma stavo iniziando ora con questa cosa di generazione del terreno voxel, con Perlin Noise e ho trovato un modo per creare il terreno senza quei pezzi galleggianti. Penso che questo possa aiutarti. Quindi, per creare il terreno, per prima cosa creo una mappa di altezza di quella che leggo i pixel da quella mappa di altezza. Ora arriva la parte interessante, ho letto il valore di "luminosità" (in realtà è la scala di grigi) di ciascun pixel su quella mappa di altezza e che mi dà l'altezza per quella particolare parte della mappa, quindi per creare il terreno suppongo che questa mappa di altezza sia il mio terreno visto dall'alto, quindi se il valore della scala di grigi di un pixel (dopo essere stato mappato sul mio terreno "maxHeight") su quella mappa di altezza è, diciamo 30, ciò significa che in quel punto specifico del mio terreno genererò solo 30 voxel sull'asse y e questo mi darà un terreno senza parti fluttuanti. Se vuoi grotte e così via, puoi creare un altro rumore sull'originale (sotto la superficie) per creare quelle grotte. Spero che questo funzioni per te.


1
Credo che questo sia simile al secondo punto elenco nella mia risposta sopra?
MichaelHouse
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.