Come posso generare terreno in stile Worms?


48

Sto lavorando a un gioco in stile Worms e voglio generare terreno proceduralmente. In precedenza ho fatto molta generazione del terreno usando il rumore del perlin, e questo è quello che ho iniziato a usare per questo gioco. L'unico problema è che è troppo semplice e noioso, dandomi alcune colline ma non la complessità che desidero. Mi piacerebbe avere caratteristiche come grotte e montagne sospese e non mi dispiace isole galleggianti e simili. Qualcosa del genere, ma anche più folle sarebbe ok:

inserisci qui la descrizione dell'immagine

Ho pensato di generare prima il terreno usando il classico rumore perlinico, quindi semplicemente rimuovere le parti per creare grotte e cosa no, ma sto avendo problemi a guidare la rimozione di quelle parti. Esistono alternative alla generazione di un simile terreno?


Il rosso rappresenta le grotte o è solo una parte del terreno?
Richard Marskell - Drackir,

Fa parte del terreno. Ho solo Google quell'immagine, era il più vicino a ciò che voglio realizzare. La parte "grotta" potrebbe essere quel piccolo buco a destra, se fosse continuato più all'interno del terreno alla sua sinistra.
Xeon06,

@Drackir, modificato l'immagine.
Xeon06,

Correlati: gamedev.stackexchange.com/questions/6721/… (ma non un duplicato in quanto sembra focalizzarsi sull'implementazione rispetto agli algoritmi di generazione).
Josh

@JoshPetrie davvero. Sto bene con la distruzione. È la generazione con cui ho problemi.
Xeon06,

Risposte:


51

Ti suggerirei di iniziare con il rumore Perlin 2D. Qualcosa come questo:

Perlin rumore

Quindi applicare una soglia sull'immagine, in modo da ottenere diverse isole isolate, come mostrato qui:

rumore perlin con soglia

Ho scelto una soglia di 0,04, tutto sopra la soglia sarebbe colorato di blu. Il resto rimane nero. Quindi, è tempo di determinare quali "isole" tenere e quali buttare via.

Un possibile approccio sarebbe quello di scorrere l'immagine da sinistra a destra a varie altezze e selezionare "isole" intersecanti data una certa probabilità. Nell'immagine di esempio, la linea più bassa ha una probabilità del 100%, quindi ogni isola che attraversa sarà selezionata (riempita di bianco). La seconda riga ha una probabilità del 50% e la riga più in alto ha una probabilità del 10%.

Dopo aver contrassegnato le isole in questo modo, puoi colmare le lacune nel mezzo applicando un'operazione morfologica ( dilatare )

isole dilatate

E c'è un paesaggio possibile.

La "granularità" del rumore determinerà quanto piccoli saranno i dettagli nel tuo mondo. Quindi è probabilmente meglio sperimentare questi valori.

Anche dove e con quali probabilità sono posizionate le "linee di selezione", il risultato sarà molto diverso. Se hai una linea vicino alla parte superiore dell'immagine con un'alta probabilità di "selezionare" un'isola, puoi costruire una sorta di paesaggio rupestre, ecc.


Grazie mille per l'ottima risposta dettagliata e illustrata! Questo è esattamente quello che farò.
Xeon06,

Avresti qualche consiglio sulla generazione di tale rumore perlin, con questo livello di dettaglio e simili? Ho provato tutta la serata e non arrivo da nessuna parte.
Xeon06,

@ Xeon06 Stavo solo usando la funzione di rumore Perlin fornita dal flash . I parametri erano 24per baseXe baseY, 1 ottava e ho scelto di emettere rumore in scala di grigi e disabilitato "frattale". In che lingua lo stai implementando?
Bummzack,

Lo sto implementando JavaScript. Ho flagellato il web per una buona implementazione che avrebbe dato risultati simili per una settimana ma non riuscivo a trovare nulla.
Xeon06,

Ho fatto un'altra domanda relativa alla parte relativa al rumore di Perlin gamedev.stackexchange.com/questions/20880/fast-noise-generation
Xeon06

6

Comincerei con un rumore di perlin, filtrato con cura. Finiresti con qualcosa di simile all'immagine allegata alla domanda, con isole galleggianti. Juste rimuove successivamente le isole galleggianti usando un algoritmo di conteggio come quelli discussi qui


Oh, penso di averlo capito adesso. Devo usare il rumore perlin 2D, non 1D. Potresti approfondire questo filtro?
Xeon06,

2
Non posso pubblicare foto in questo momento, ma sto solo parlando di un semplice filtro di soglia à-la if (0.3> pixelValue> 0.5) KeepIt () ;. La parte "attentamente" riguarda il fatto di ottenere 0,3 e 0,5 giusti. Potresti anche avere un gradiente lineare (o meno), che inizia con l'alfa alta in alto, arrivando gradualmente a 0 in basso, quindi hai spazio per un cielo e il terreno è per lo più pieno. Spero che aiuti.
Ravachol,

@Ravachol Se pubblichi un link a un'immagine, qualcuno con più rappresentanti può aggiungerlo al tuo post per te.
Richard Marskell - Drackir il

"if (0.3> pixelValue> 0.5)", suppongo che questo sia solo un errore di battitura, ma può essere confuso avere cose contraddittorie nei tuoi post ... Puoi per favore modificarlo?
jcora,

Non riesco a modificare un commento. Leggi "if (0.3 <pixelValue <0.5)", ovviamente.
Ravachol,

4

In realtà l'ho implementato partendo dalla risposta eccellente di bummzack.

Ecco i passaggi che ho concluso con:

  1. Genera un'immagine con rumore Perlin
  2. Riempi dove vuoi un po 'di terreno
  3. Dilatazione + erosione per rimuovere le cavità troppo piccole
  4. Rimuovi le restanti regioni di sfondo all'interno del terreno
  5. Anti aliasing

E questo è un esempio del risultato: esempio di terreno generato

Ho scritto un articolo dettagliato sull'intero processo qui e il codice (JavaScript) è open source, verificalo se vuoi qualcosa pronto per l'uso;)

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.