Génération de grottes avec vers Perlin

12

J'essaie actuellement de générer un Minecraft comme un terrain de voxel avec 3D Simplex Noise et je veux également implémenter des grottes.

J'ai trouvé la méthode de Perlin Worms dans ce fil, qui génère de très bons résultats. Cependant, je n'ai aucune idée de la façon de le générer bloc par bloc. Est-ce possible ou existe-t-il des alternatives qui produisent un ver semblable à une grotte, morceau par morceau?

Edit: C'est le problème que je ne sais pas résoudre.

Edit2: C'est le résultat de la combinaison du bruit multifractal strié 2D avec une carte de hauteur de bruit simplex. A encore besoin de quelques ajustements, mais c'est à peu près le résultat que je voulais. Merci à Byte56.

user000user
la source
Si possible, vous devez utiliser des formules directes pour la génération de terrain. Si vous pouvez calculer un voxel simplement en fonction de ses coordonnées et sans informations sur les adjacentes, les morceaux ne sont plus un problème. Si vous souhaitez utiliser des vers Perlin, qui, je suppose, ne peuvent pas être calculés individuellement pour chaque voxel, jetez un œil au dernier paragraphe de la réponse acceptée à la question que vous avez liée.
danijar
1
En gros, c'est ma question. Le terrain de base est facile à calculer avec juste les coordonnées données, mais je ne sais pas comment calculer, qu'il y ait une grotte ou non.
user000user

Réponses:

5

La plupart des algorithmes de bruit perlin vous permettront de récupérer la valeur du bruit à n'importe quel endroit donné, avec quelque chose comme noise(x,y,z). Il est donc assez simple de générer du bruit morceau par morceau. Tout ce que vous devez faire est de passer la position globale, au lieu de la position de bloc.

for(int i = 0; i < CHUNKMAX_X; i++)
    for(int j = 0; j < CHUNKMAX_Y; j++)
        for(int k = 0; k < CHUNKMAX_Z; k++)
            if(isSolid(perlinNoise.get(chunkPosition.x + i,
                                         chunkPosition.y + j,
                                         chunkPosition.z + k))
                thisChunk[i,j,k] = new Voxel(solid);
            else
                thisChunk[i,j,k] = new Voxel(air);

Vous pouvez donc voir que nous générons un terrain pour le bloc, en itérant sur les limites du bloc et en vérifiant si cette position globale est solide ou non. Il s'agit probablement de la même méthodologie que vous utilisez pour générer le terrain en général.

perlinNoise.getprend une position globale et rend sa densité. Où isSolidserait juste un simple test pour voir si le voxel est "suffisamment dense" pour se qualifier pour le solide.

perlinNoise.getpeut être plus complexe qu'un simple algorithme de bruit. Vous pouvez avoir des contrôles basés sur la profondeur du voxel dans votre monde. Par exemple, si le voxel est en dessous de ce que vous avez décidé d'être "au niveau du sol de base absolu", alors il peut utiliser l'algorithme des vers perlin pour renvoyer une densité, s'il est au-dessus de la base absolue, il peut utiliser une fonction de densité normale pour vous donner terrain plus varié. Je recommanderais cependant un mélange entre les deux.

La combinaison de différentes fonctions de bruit Perlin est juste quelque chose avec laquelle vous devez jouer et voir ce qui fonctionne. Il est préférable de configurer votre environnement de sorte que vous puissiez simplement modifier certaines valeurs et échanger à chaud le terrain sans avoir besoin de recharger votre jeu. Bonne expérimentation.

MichaelHouse
la source
2
Merci d'avoir répondu. Cependant, je ne sais pas comment utiliser Perlin ou Simplex Noise "ordinaire" pour créer des grottes de type ver. Ils sont soit sphériques, mis à l'échelle dans une direction ou pas très longs. Et pour l'algorithme Perlin Worms, je ne sais pas comment déterminer si la position actuelle est à l'intérieur d'un ver, sans connaître la position de la tête.
user000user
1
L'algorithme des vers ne repose pas sur la connaissance de la "position de la tête". D'après ce que vous dites, il semble que votre problème ne réside pas dans la génération de bruit morceau par morceau. Il existe des didacticiels sur la question que vous avez liée pour implémenter les vers Perlin. Comment générer un terrain "régulier" peut être trouvé ici .
MichaelHouse
La génération de terrain de base avec 3D Simplex Noise fonctionne bien, mais je ne sais pas comment déterminer la position / le segment d'un ver à l'intérieur d'un morceau. D'après ce que j'ai compris, vous donnez au ver une position de tête et n segments et calculez l'angle entre les segments avec la fonction de bruit. Voici une image qui pourrait mieux expliquer, quel est mon problème: lien .
user000user
2
Il existe différents types de bruit. Utiliser une position de tête et en découler est une méthode. Si vous regardez vers le bas de cette page , vous trouverez du bruit qui crée le genre de bruit que vous souhaitez sans avoir besoin d'une position de tête au préalable.
MichaelHouse
Merci pour l'astuce. J'ai implémenté le bruit multifractal 3D Ridged, cependant, le résultat avec lui était plutôt insatisfaisant. Je vais essayer de le combiner en 2D avec une carte de hauteur 2D, puis de faire un nouveau rapport. Cela peut créer plus de grottes ressemblant à des vers.
user000user
3

Je pense que c'est ainsi que cela fonctionne dans Minecraft. Chaque ver a une longueur maximale (appelons-le M). Les têtes de chaque ver sont calculées en fonction de la position des morceaux. Lorsque vous effectuez le rendu de chaque morceau, vous devez vérifier tous les morceaux dans un Mrayon et suivre tous leurs vers. Ce n'est pas idéal en termes de performances, mais cela fonctionne.

Tom Dalling
la source