Comment puis-je générer un terrain de style Worms?

48

Je travaille sur un jeu de style Worms et je souhaite générer du terrain de manière procédurale. J'ai déjà beaucoup travaillé sur le bruit de fond avec Perlin, et c'est ce que j'ai commencé à utiliser pour ce jeu. Le seul problème avec ça, c'est que c'est trop simple et ennuyeux, ce qui me donne quelques collines mais pas la complexité que je veux. J'aimerais avoir des caractéristiques telles que des grottes et des montagnes suspendues et cela ne me dérange pas des îles flottantes et autres. Quelque chose comme ça, mais encore plus fou serait ok:

entrez la description de l'image ici

J'ai d'abord pensé à générer le terrain à l'aide du bruit perlin classique, puis à retirer des éléments pour créer des cavernes, mais ce n'est pas le cas, mais je ne parviens pas à guider le retrait de ces éléments. Existe-t-il des alternatives pour générer un tel terrain?

Xeon06
la source
Le rouge représente-t-il des cavernes ou s'agit-il simplement d'une partie du terrain?
Richard Marskell - Drackir
Cela fait partie du terrain. Je viens de Google cette image, était le plus proche de ce que je veux accomplir. La partie "caverne" pourrait être ce petit trou à droite, si on la continuait plus à l'intérieur du terrain à sa gauche.
Xeon06
@Drackir, a modifié l'image.
Xeon06
Connexe: gamedev.stackexchange.com/questions/6721/… (mais pas un doublon car il semble se concentrer sur la mise en œuvre par rapport aux algorithmes de génération).
Josh
@JoshPetrie en effet. Je suis bon avec la destruction. C'est la génération avec laquelle j'ai des problèmes.
Xeon06

Réponses:

51

Je vous suggérerais de commencer par le bruit 2D Perlin. Quelque chose comme ça:

bruit perlin

Appliquez ensuite un seuil sur l'image, de manière à obtenir plusieurs îles isolées, comme illustré ci-dessous:

bruit perlin avec seuil

J'ai choisi un seuil de 0,04, tout ce qui se trouve au-dessus du seuil serait coloré en bleu. Le reste restant noir. Ensuite, il est temps de déterminer quelles "îles" conserver et lesquelles jeter.

Une approche possible consisterait à parcourir l'image de gauche à droite à différentes hauteurs et à sélectionner des "îles" se croisant en fonction d'une certaine probabilité. Dans l'exemple de l'image, la ligne la plus basse a une probabilité de 100%. Ainsi, chaque île traversée sera sélectionnée (remplie en blanc). La deuxième ligne a une probabilité de 50% et la dernière ligne a une probabilité de 10%.

Une fois que vous avez vos îles marquées comme ça, vous pouvez combler les écarts en appliquant une opération morphologique ( dilater )

îles dilatées

Et il y a un paysage possible.

La "granularité" du bruit va déterminer la taille des détails dans votre monde. Il est donc probablement préférable d'essayer ces valeurs.

De plus, où et avec quelles probabilités vos "lignes de sélection" sont positionnées, le résultat sera très différent. Si vous avez une ligne avec une forte probabilité de "sélectionner" une île près du haut de l'image, vous pouvez alors créer une sorte de paysage de grottes, etc.

bummzack
la source
Merci beaucoup pour la grande réponse détaillée et illustrée! C'est exactement ce que je vais faire.
Xeon06
Auriez-vous des conseils sur la génération d'un tel bruit perlin, avec ce niveau de détail et tel? J'ai essayé toute la soirée et je ne vais nulle part.
Xeon06
@ Xeon06 J'utilisais juste la fonction de bruit Perlin fournie par flash . Les paramètres étaient 24pour baseXet baseY, 1 octave et j'ai choisi de produire du bruit en niveaux de gris et de désactiver "fractal". Dans quelle langue implémentez-vous cela?
Bummzack
Je l'implémente JavaScript. Je suis en train de fouiller le Web pour une bonne mise en œuvre qui donnerait des résultats similaires pendant une semaine mais ne trouve rien.
Xeon06
J'ai posé une autre question concernant la partie bruit perlin gamedev.stackexchange.com/questions/20880/fast-noise-generation
Xeon06
6

Je commencerais par un bruit perlin, filtré avec soin. Vous termineriez avec quelque chose comme dans l'image jointe à la question, avec des îles flottantes. Retirez ensuite les îlots flottants en utilisant un algorithme de comptage comme ceux présentés ici.

Ravachol
la source
Oh je pense que je comprends maintenant. Je dois utiliser le bruit 2D Perlin, pas 1D. Pourriez-vous élaborer sur ce filtrage?
Xeon06
2
Je ne peux pas publier de photos pour le moment, mais je parle simplement d'un simple filtre de seuil à la la-si (0.3> pixelValue> 0.5) KeepIt () ;. Le mot «soigneusement» consiste à obtenir 0,3 et 0,5 juste. Vous pouvez également avoir un dégradé linéaire (ou non), en commençant par l'alpha élevé en haut, puis en atteignant progressivement 0 en bas, de sorte que vous avez de la place pour un ciel et que le sol est en grande partie rempli. J'espère que ça t'as aidé.
Ravachol
@Ravachol Si vous publiez un lien vers une image, une personne plus représentative peut l'ajouter à votre message.
Richard Marskell - Drackir
"if (0.3> pixelValue> 0.5)", je suppose que ceci est juste une faute de frappe, mais il peut être déroutant d'avoir des éléments contradictoires dans votre publication ... Pouvez-vous éditer cela?
jcora
Je n'arrive pas à éditer un commentaire. Lisez "if (0.3 <pixelValue <0.5)", évidemment.
Ravachol
4

J'ai effectivement mis en œuvre cette réponse à partir de bummzack excellente.

Voici les étapes que j'ai fini avec:

  1. Générer une image avec du bruit Perlin
  2. Inondez où vous voulez du terrain
  3. Dilatation + érosion pour éliminer les creux trop petits
  4. Supprimer les régions d'arrière-plan restantes à l'intérieur du terrain
  5. Anti crénelage

Et voici un exemple de résultat: exemple de terrain généré

J'ai écrit un article détaillé sur l'ensemble du processus ici et le code (JavaScript) est open source, vérifiez-le si vous voulez quelque chose de prêt à utiliser;)

Julian Go
la source