Comment une fonction de bruit perlin 3D est-elle utilisée pour générer un terrain?


20

Je peux envelopper ma tête en utilisant une fonction de bruit perlin 2d pour générer la valeur de hauteur, mais je ne comprends pas pourquoi une fonction de bruit perlin 3d serait utilisée. Dans le blog de Notch, http://notch.tumblr.com/post/3746989361/terrain-generation-part-1 , il a mentionné l'utilisation d'une fonction de bruit perlin 3D pour la génération de terrain sur Minecraft. Est-ce que quelqu'un sait comment cela serait fait et pourquoi cela serait utile? Si vous passez des valeurs x, y et z, cela ne signifie-t-il pas que vous avez déjà la hauteur?

Réponses:


19

Le bruit perlin 2D est bon pour les cartes de hauteur, mais dans ce cas, il semble qu'il n'utilise pas de carte de hauteur. Au lieu de cela, il a une grille 3D, où n'importe quelle cellule peut être vide. Cela permet des grottes et de telles formations, où la hauteur du sol n'est pas une valeur unique pour un emplacement 2D donné.


14

Au lieu d'échantillonner la «hauteur du sol», j'ai traité la valeur du bruit comme la «densité», où tout ce qui est inférieur à 0 serait de l'air, et tout ce qui serait supérieur ou égal à 0 serait du sol.

Autrement dit, pour chaque endroit où un bloc peut être, une fonction de bruit est évaluée, et si elle est> 0, un bloc est placé. La fonction de bruit de Notch est biaisée en ajoutant la hauteur du niveau de l'eau à sa valeur, c'est pourquoi les zones inférieures sont principalement solides (la hauteur est grande négative, donc la hauteur + le bruit est également négative) et les zones supérieures sont principalement vides (la hauteur est grande positive, donc la hauteur + le bruit est positif aussi).

Il y a probablement une alchimie supplémentaire pour décider du type de bloc à générer et pour creuser des grottes. Mais je suppose que ce n'est pas directement lié à cette fonction de bruit.

Notez également que cette méthode fonctionne pour Notch car Minecraft a un terrain basé sur les voxels. Si vous tentiez de réussir cela dans un monde basé sur des polygones, il ne suffirait pas d'échantillonner la fonction de bruit. Vous devez utiliser un algorithme pour transformer les échantillons en une surface et créer des polygones qui se rapprochent de cette surface. Un tel algorithme marche des cubes .


8

Le bruit 3D devient obligatoire si le terrain a besoin de réseaux de grottes et de surplombs.

Pour extraire une isosurface à partir des informations de densité, les 2 techniques les plus populaires sont les Marching Cubes (MC) et la nouvelle Dual Contouring (DC). La structure de données nécessaire est assez différente selon la méthode choisie.

Comme mentionné précédemment, l'article de Geiss sur les GPU Gems 3 est un point de départ très instructif pour comprendre et implémenter des terrains MC sur le GPU (notez que son approche MC fonctionne entièrement sur le GPU et nécessite au moins SM4 - compatible GS).

Étant donné que les données de densité sur les voxels MC ne peuvent rester que sur les bords du voxel, le MC classique peut contourner le volume sans conserver les caractéristiques des arêtes vives. DC ne souffre pas de cet inconvénient car les informations de densité sont exprimées sous la forme d'un point 3D (minimiseur QEF) posé n'importe où à l'intérieur du voxel plus le signe à chaque coin.

En revanche, MC ne souffre pas de faces auto-intersectées car tous les triangles générés sont enfermés dans leurs voxels correspondants, tandis que DC a besoin de calculs supplémentaires pour éviter les intersections entre les faces générées. Les auteurs de DC ont résolu ce problème dans une version améliorée de leur algorithme.

http://www.cs.wustl.edu/~taoju/research/interfree_paper_final.pdf

http://www.cs.berkeley.edu/~jrs/meshpapers/SchaeferWarren2.pdf

Ce boursier propose également une approche probablement plus propre basée sur une analyse convexe / concave pour éviter les auto-intersections. Il utilise également de meilleures règles de fractionnement en quad pour aider à préserver l'orientation du bord:

http://www2.mae.cuhk.edu.hk/~cwang/pubs/TRIntersectionFreeDC.pdf

Classic MC n'est pas non plus «prêt à l'emploi» et peut nécessiter une correction des fissures s'il est exécuté sur des octrees sans restriction. DC ne souffre pas de ce dernier problème.

Voici un aperçu assez agréable et complet de la plupart des techniques d'extraction de maillage: http://www.cs.berkeley.edu/~jrs/mesh/

Une approche octree / voxel est intrinsèquement "CSG-friendly", ce qui facilite la planification d'une stratégie de niveau de jeu parfaitement "destructible", mais si l'on doit implémenter tout cela dans un jeu, la profondeur d'octree devra également être tronconique -dépendant.

Si l'intégralité du contenu tient dans la mémoire ou est correctement diffusée, les données peuvent également être utilisées pour le rendu AO et le calcul de la physique / des collisions.


"Le bruit 3D devient obligatoire si le terrain a besoin de réseaux de grottes et de surplombs." Obligatoire? Comme dans, c'est le seul moyen de générer des grottes et des surplombs? Nan. Je génère une carte de hauteur à partir du bruit perlin 2D, puis je sculpte des grottes et des surplombs en tant qu'étape distincte, pour un aspect plus naturel. Il est trompeur pour les jeunes développeurs de jeux en herbe de dire que c'est la SEULE façon de générer des grottes et des surplombs dans un monde généré de manière procédurale.
Domarius

5

Je suppose, dans cet exemple particulier, qu'il a utilisé la valeur z pour déterminer quel type de matériau: substrat rocheux, pierre, saleté ou air.


-3

Minecraft utilise l'algorithme des cubes en marche pour générer un terrain 3D. Je n'ai pas de référence pour cela, je suis désolé. Je ne sais pas exactement de quoi Notch parlait quand il a mentionné la fonction Perlin Noise - peut-être une graine pour l'algorithme des cubes en marche. Plus d'infos ici:

Et un excellent article GPU Gems si vous êtes intéressé par la marche des cubes:


2
Marching cubes est un algorithme pour générer un maillage à partir d'un champ scalaire. Cela signifie qu'il doit d'abord avoir des données, puis il génère un maillage pour s'adapter aux données. Ce n'est pas pour générer des données ou du terrain.
MichaelHouse

-6
for (int x = 0; x < Width) 
{
  for (int y = 0; y < Depth) 
  {
    for (int z = 0; z < Height) 
    {
      if(z < Noise2D(x, y) * Height) 
      {
        Array[x][y][z] = Noise3D(x, y, z)
      } else {
        Array[x][y][z] = 0
      }
    } 
  } 
} 

2
-1; Même avec la clarification que vous avez ajoutée, c'est une très mauvaise réponse, elle n'explique pas clairement le but de l'extrait de code ni son impact sémantique sur les données résultantes, et elle ne répond pas à la plupart des questions que l'utilisateur avait réellement.

J'ai édité le code, et maintenant?
Maxim DC

Cela explique comment le bruit 3D est utilisé pour créer le terrain, c'est correct à mon avis
Maxim DC

Expliquez ensuite cela dans votre réponse et répondez aux questions de l'utilisateur. Sinon, c'est une réponse de code mort.
Tom 'Blue' Piddock
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.