Comment générer des grottes qui ressemblent à celles de Minecraft?


34

Je travaille sur un monde procédural 3D depuis un certain temps et je souhaite commencer à ajouter des systèmes de grottes. J'utilise actuellement 2D / 3D Perlin Noise pour la génération de terrain, en combinaison avec les Marching Cubes pour un terrain plus lisse. Je suis juste pris de court quand il s'agit de longues grottes interconnectées.

J'espère obtenir quelque chose de plus semblable aux systèmes de grottes de Minecraft. Ils semblent être très connectés, se ramifient au hasard dans presque toutes les directions, et presque n'importe quel point de la grotte aurait un aspect assez circulaire avec un rayon assez égal dans l'ensemble (pas le meilleur libellé, mais pas tout à fait sûr de le dire autrement). .

Le plus grand défi pour générer des grottes comme je le veux est que je veux générer le monde à la volée. Le monde est généré morceau par morceau actuellement, à partir de l'endroit où se trouve le joueur et il en sort vers l'extérieur. Je ne voudrais PAS générer du monde, puis creuser les cavernes en utilisant un motif errant, des automates cellulaires, etc.

Y at-il des algorithmes bien connus qui peuvent être utilisés pour cela? Si oui, est-ce que quelqu'un veut partager comment il fait quelque chose de similaire? J'apprécierais grandement toute aide.

Un bon exemple: enter image description here


5
Regardez ici et faites défiler.
William Mariager

Au cours des 24 derniers mois, un magazine de développeurs de jeux a débattu en profondeur de la manière dont vous essayez de faire ce que vous essayez de faire. Je frapperais leur site.
Joey Green

@ JoeyGreen Quel est le nom du magazine? Ou avez-vous un lien vers leur site?
Jumpnett

1
C'est ce qu'on appelle le magazine des développeurs de jeux. gdmag.com . Vous pouvez vous abonner et obtenir les versions pdf du magazine pour les 10 dernières années. Si vous vous inscrivez, il existe un moyen de rechercher les numéros précédents et de trouver celui que vous souhaitez.
Joey Green

Réponses:


30

Les grottes de Minecraft sont générées par la méthode des "vers de Perlin". Le groupe électrogène sillonne le terrain et creuse un tunnel. Minecraft n'utilise pas de bruit 3d perlin pour la génération de cavernes, car il a tendance à laisser des poches non connectées sur le terrain. Les grottes Minecraft n’ont pas été générées par le bruit 3d Perlin depuis les toutes premières versions d’Alpha.

Voici les grottes de Gnomescroll générées à partir de la méthode "ver de ver".

Gnomescroll Cave System First Person View 1

Gnomescroll Cave System First Person View 2

Gnomescroll Cave System Third Person View 2

Ce sont les libnoise "Perlin Worms" du tutoriel libnoise. La technique reproduit fidèlement les grottes générées dans Minecraft.

Linoise Tutorial Perlin Worms

Les paramètres de serpenting affectent la qualité du système de grottes et déterminent leur verticalité et leur vitesse de changement de direction. Les grottes situées dans la branche de Minecraft et le rayon du tunnel de la grotte varient sur la longueur des grottes.

Minecraft génère les grottes sur une base morceau par morceau. L’approche requise est compliquée et personne n’a pour le moment réussi à obtenir le générateur de cavernes de Minecraft, malgré l’intérêt manifesté par les modeurs de serveurs.

L’approche la plus plausible génère les grottes de serpents segment par segment lorsque la carte infinie est générée et s’étend vers l’extérieur. Les grottes sur le bloc actuel sont des fonctions des graines de grotte sur les N blocs les plus proches pour certains N. En utilisant un générateur de nombres aléatoires qui est une fonction des coordonnées du bloc pour ensemencer les grottes, il est possible de calculer les grottes sur le bloc actuel pour une carte infinie tout en évaluant uniquement les morceaux dans un rayon de morceau fini.


3
Pouvez-vous ajouter des informations ou des ressources pour en savoir plus sur ce problème des "vers Perlin"?
David Gouveia

1
Ceci est un tutoriel sur les "vers de perlin
HaltingState

Ce n'est pas nécessaire, mais si vous pouviez élaborer sur ce dernier paragraphe, je l'apprécierais beaucoup. Pour générer un ver, je suppose que vous auriez besoin d'un point de départ par ver, qui devrait se situer à moins de N morceaux d'un joueur, où N est la longueur maximale d'un ver.
Mythics

3
Exactement. Chaque ver a un point de départ et est terminé s’il erre au-delà d’un certain rayon de morceau. Il existe un générateur de nombres aléatoires qui génère de manière déterminante une séquence de nombres pseudo aléatoires qui est fonction des coordonnées du bloc. Ces nombres aléatoires déterminent où et combien de vers proviennent de ce nœud. Les vers peuvent aussi se ramifier. La charge de calcul est réduite si les vers sont plus "locaux" et ne peuvent pas s'aventurer plus qu'un petit rayon de morceau.
HaltingState

Peut-être pas exactement ce que je voulais entendre, mais ce à quoi je m'attendais. Merci encore HaltingState. :)
Mythics

7

Je générerais un nuage de points dans des zones où le terrain est solide - vous pouvez expérimenter avec différentes densités. Ensuite, j'utiliserais un algorithme, tel qu'un arbre recouvrant minimum, pour connecter tous les points. Cela garantirait que chaque zone soit accessible. Ensuite, dessinez simplement de grandes zones creuses (composées d’air) d’un noeud à l’autre (c’est-à-dire une ligne épaisse de voxels).


Je ne comprends peut-être pas exactement ce que vous entendez par là, mais comment pourrais-je le faire à la volée, morceau par morceau, à mesure que le monde génère?
Mythics

Une solution possible consiste à générer l'arbre de recouvrement minimal au sein de chaque bloc séparément, puis à connecter chaque bloc en recherchant les deux nœuds les plus proches entre les deux. Une fois qu'un bloc est rempli avec votre algorithme de terrain par défaut, vous pouvez le creuser autour de l'arbre de recouvrement minimal.
Gavan Woolery

1
Une autre solution (plus facile), bien que moins efficace et probablement plus "bruyante", consiste à utiliser le mouvement brownien pour tracer une trajectoire (un peu comme une fourmi creusant au hasard).
Gavan Woolery


1

Utilisez une fonction de bruit pour attribuer des valeurs à chaque bloc afin de déterminer s’il existe ou non des tunnels, puis utilisez-les pour décider où placer les grottes. Si vous voulez des tunnels, utilisez simplement plus de fonctions de bruit (avec des graines différentes) et utilisez leurs valeurs pour déterminer s'il existe des tunnels. Après cela, utilisez les fonctions de "dessin" ordinaires pour créer les tunnels. Pour que tout soit plus réaliste, utilisez plus de bruit pour effectuer un déplacement aléatoire des points d’origine desdites grottes / tunnels.

Si vous ne souhaitez pas utiliser plusieurs fonctions de bruit, vous pouvez sonder à des distances plus grandes - par exemple, plutôt que de faire noise3d (2,2,2) pour le bloc à (2,2,2) ne noise3d (2,2, 16) et utilisez (2,2,16) pour une valeur, (2,2,17) pour la deuxième valeur, etc., puis réglez votre fréquence en conséquence pour rendre toutes les valeurs indépendantes ou en corrélation à courte échelle.

Pour faire varier la densité de grottes dans le monde, utilisez une autre fonction, de fréquence inférieure, qui influera sur lesdites valeurs.

Si cela aboutit à des cavernes en désordre, augmentez simplement la distance desdits points interconnectés ou accordez l’algorithme.

Je ne sais pas si Minecraft fait des grottes comme celle-ci (bien que je le pense), mais cette solution devrait donner des résultats satisfaisants.


-5

here is

Bien que la plupart des grottes comme celles ci-dessus utilisent le ver Perlin , certaines personnes préfèrent le faire manuellement. De cette façon, ils peuvent le faire comme ils le veulent, bloc par bloc. Une grotte faite en utilisant le ver Perlin peut être imprécise et ne la rend que 5 pieds de haut et 6 pieds de large, cela peut être inexact car vous pourriez le vouloir 10 pieds de haut et 15 pieds de large.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.