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:
la source
Réponses:
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".
Ce sont les libnoise "Perlin Worms" du tutoriel libnoise. La technique reproduit fidèlement les grottes générées dans Minecraft.
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.
la source
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).
la source
Le numéro d'avril 2011 de Game Developer Magazine donne des détails à ce sujet avec les fonctions de bruit Perlin itératives - voir l'article du créateur de mondes à partir de la page 21.
la source
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.
la source
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.
la source