Comment supprimer un terrain flottant lorsqu'il est généré avec 3D Perlin Noise?

10

J'utilise actuellement 3D Perlin Noise pour générer un terrain aléatoire en combinaison avec Marching Cubes.

Mon problème semble résider dans la mise à l'échelle de la fonction de bruit pour obtenir des hauteurs raisonnables sur mon terrain. Si une seule octave est utilisée, tous les points par rapport au bruit sont évidemment interpolés, ce qui donne des données assez lisses. Cependant, pour obtenir des surplombs / grottes / terrain irrégulier, je dois utiliser plusieurs octaves avec des amplitudes variables et / ou mettre à l'échelle les valeurs résultantes à ma hauteur `` max '' que je veux de la carte.

Je manque peut-être quelque chose, mais en utilisant des cubes de marche avec du bruit perlin 3D, j'obtiens régulièrement des morceaux de terrain flottants.

Des idées sur la façon dont je pourrais corriger cela ou s'il y a d'autres fonctions de bruit que je pourrais utiliser pour obtenir des résultats comme je le décris? Je veux des collines / vallées / montagnes / lacs / etc. Pas besoin de bits flottants séparés du reste de la carte. Je crois que c'est un problème similaire à celui de Minecraft quand il a un terrain qui flotte juste dans le ciel de temps en temps lors de sa génération.

Merci pour toute aide, Mythics

Mythiques
la source

Réponses:

9

La seule façon de se débarrasser complètement du terrain flottant est probablement de tester la connectivité. Selon la taille de votre carte, cela peut être une option. Vous pouvez le faire en choisissant un point de base, comme le bas de votre monde. Assurez-vous ensuite que tous vos voxels sont:

  1. Connecté à la base.
  2. Connecté à un voxel connecté à la base.

Commencer probablement à un point connecté connu (comme le bas de votre monde), puis faire une première traversée étendue de voxels connectés fonctionnerait plutôt bien. Assurez-vous que vous marquez les voxels comme connectés pendant que vous partez. Vous pouvez le faire par morceau.

De plus, il existe des moyens moins coûteux de minimiser, mais pas de supprimer complètement le terrain flottant.

  • Biais de dégradé : vous pouvez biaiser le placement des voxels solides avec un dégradé. La fonction de gradient tomberait quelque peu brusquement une fois que vous êtes au-dessus du "niveau du sol". Cet article parle de l'utilisation d'un dégradé et propose d'autres astuces intéressantes.

  • Bruit de la carte de hauteur : vous pouvez plutôt générer du bruit sous forme de carte de hauteur. Cela supprimerait les surplombs et les grottes, mais vous pouvez simuler ceux avec une couche de bruit soustractive supplémentaire.

  • Moins de bruit : utilisez moins d'octaves dans le bruit de votre terrain et générez du bruit soustractif pour obtenir des surplombs et des grottes.

MichaelHouse
la source
Le terrain ne peut être connecté via le bloc adjacent que si c'est un surplomb de là.
Loren Pechtel
@ Loren: C'est parfaitement bien. Tant que le moteur vous permet de traiter les morceaux par index complet, cela fonctionnera sans problème.
Phil
@ LorenPechtel Je dis que vous pouvez le faire par morceau, mais vous devez vérifier les morceaux adjacents lorsque vous êtes sur le bord d'un morceau. Cela peut devenir un problème lors de la génération d'un nouveau terrain et n'a pas généré le morceau adjacent. Lorsque vous arrivez à cette situation où vous avez un terrain flottant potentiel, vous pouvez soit générer le bloc adjacent, soit utiliser l'algorithme de bruit pour analyser les voxels jusqu'à ce que vous trouviez «substrat rocheux» ou une connexion connue au bloc actuel.
MichaelHouse
0

il est peut-être trop tard pour répondre, mais je commençais maintenant avec cette chose de génération de terrain voxel, avec Perlin Noise et j'ai trouvé un moyen de créer le terrain sans ces pièces flottantes. Je pense que cela peut vous aider. Donc, pour créer le terrain, je génère d'abord une carte de hauteur que je lis les pixels de cette carte de hauteur. Vient maintenant la partie intéressante, j'ai lu la valeur de "luminosité" (en fait la gamme de gris) de chaque pixel sur cette carte de hauteur et cela me donne la hauteur pour cette partie particulière de la carte, puis pour créer le terrain, je suppose que cette carte de hauteur est mon terrain vu de dessus, donc si la valeur en niveaux de gris d'un pixel (après avoir été mappé sur mon terrain "maxHeight") sur cette carte de hauteur est, disons 30, cela signifie que dans ce point spécifique de mon terrain, je ne générerai que 30 voxels sur l'axe y et cela me donnera un terrain sans parties flottantes. Si vous voulez des grottes et ainsi de suite, vous pouvez appliquer un autre bruit sur l'original (sous la surface) pour créer ces grottes. J'espère que cela fonctionne pour toi.

Sammael
la source
1
Je crois que cela est similaire au deuxième point de ma réponse ci-dessus?
MichaelHouse