Créer des globes planétaires procéduraux

Distorsion, bruit transparent et comment travailler avec eux.

image

Nous générons une planète


L'une des façons les plus simples de générer une planète est d'utiliser le bruit. Si nous décidons de le choisir, nous avons deux options possibles. Examinons chacun et déterminons le meilleur:

  • Perlin Noise est l'option la plus simple. Le bruit Perlin a été développé par Ken Perlin en 1983, il présente quelques inconvénients - des artefacts visuels et plutôt faible par rapport à d'autres options de vitesse lors de la génération de grandes images.
  • Simplex Noise (Simplex Noise) - a été développé par Ken Perlin en 2001 pour tenter d'éliminer les défauts du bruit Perlin; c'est une solution très digne et rapide, mais avec un sérieux inconvénient: l'utilisation du bruit simplex tridimensionnel est protégée par un brevet, ce qui le rend assez cher.
  • Open Simplex Noise - KDotJPG a été développé avec un seul objectif: créer une version moderne et gratuite du bruit simplex, relativement rapide et sans distorsion.

Parmi ces trois, je préfère personnellement Open Simplex Noise, que j'utilise dans mes projets personnels. Il convient de noter que dans l'implémentation actuelle d'OpenSimplexNoise , des travaux supplémentaires seront nécessaires pour accéder facilement à la balance, aux octaves et aux générateurs . Il y a beaucoup d'informations sur Internet sur ce que fait chacun de ces éléments, et je vous recommande fortement de l'étudier. Cependant, dans mon article, je n'en parlerai pas.


Voici à quoi ressemble Open Simplex Noise avec 16 octaves.

Bruit homogène


Le bruit est infini, ce qui signifie que si nous créons simplement une toile avec un rapport d'aspect 2: 1 pour obtenir une projection également espacée , elle ne sera pas bouclée lorsqu'elle sera superposée à une sphère (j'exprime ma gratitude à ce site Web étonnant), mais à une couture horizontale et aux pôles d'énormes différences.

image

Bruit créé sans coutures.

image

Remarquez les énormes coutures qui sont apparues lorsque le bruit a été appliqué à la sphère.

Il existe de nombreuses façons de résoudre ce problème; Par exemple, dans cet excellent article de Red Blob Games, il suffisait simplement de générer une île en utilisant une fonction qui reçoit la distance au centre en tant que variable et définit la hauteur 0 sur les bords pour minimiser les coutures.

Cependant, ce n'est pas ce dont nous avons besoin. Nous voulons générer une planète avec la possibilité de l'existence des pôles nord et sud, et pour cela nous aurons besoin de calculs mathématiques plus complexes.

Superposition sphérique


Une méthode qui peut générer des planètes sphériques consiste à convertir les coordonnées cartésiennes de notre canevas en coordonnées sphériques, à générer du bruit en fonction de ces coordonnées, puis à reconvertir le bruit en coordonnées cartésiennes et à l'appliquer au canevas.

Cependant, cette implémentation a ses limites, dont les causes sont présentées dans un article étonnant de Ron Valstar . Plus important encore, les formes des continents dans ce cas semblent extrêmement étranges et déformées, et nous n'utiliserons donc pas cette option.

image

Superposition de bruit sphérique. Des formes étranges et des distorsions rendent les continents assez laids.

image

Mais au moins, il n'y a plus de coutures.

Superposition cubique


En conséquence, j'ai utilisé la deuxième méthode, tirée d'un article de Ron Valstar et d'une série d'articles par acko Making Worlds . Ils décrivent la génération d'un globe à travers la génération d'un cube et son «gonflage», comme s'il s'agissait d'un ballon, jusqu'à ce qu'il soit un exemple de la forme d'une sphère.


Image prise sur acko.net. Il explique le concept d'une carte cubique d'une manière simple et visualisée.

Maintenant, nous avons juste besoin de générer six faces, ce qui est assez simple, il existe de nombreuses façons de le faire.

À la fin, j'ai décidé de créer un tableau et de le remplir avec des données. J'ai converti les coordonnées 2D du canevas en coordonnées 3D du cube, puis généré du bruit pour chacune de ces coordonnées 3D afin de les enregistrer dans la valeur de coordonnées 2D correspondante.

//Z STATIC for(int y = 0; y < cubeFaceSize; y++) { for(int x = 0; x < cubeFaceSize * 2; x++) { //Generates FRONT if(x < cubeFaceSize) { cubeMap[cubeFaceSize+x][cubeFaceSize+y] = noise.noise3D(x, y, 0); } //Generates BACK else { cubeMap[cubeFaceSize*3+(x-cubeFaceSize)][cubeFaceSize+y] = noise.noise3D(cubeFaceSize-(x-cubeFaceSize), y, cubeFaceSize); } } } //X STATIC for(int y = 0; y < cubeFaceSize; y++) { for(int x = 0; x < cubeFaceSize * 2; x++) { //Generates LEFT if(x < cubeFaceSize) { cubeMap[x][cubeFaceSize+y] = noise.noise3D(0, y, cubeFaceSize-x); } //Generates RIGHT else { cubeMap[cubeFaceSize*2+(x-cubeFaceSize)][cubeFaceSize+y] = noise.noise3D(cubeFaceSize, y, x-cubeFaceSize); } } } //Y STATIC for(int y = 0; y < cubeFaceSize * 2; y++) { for(int x = 0; x < cubeFaceSize; x++) { //Generates TOP if(y < cubeFaceSize) { cubeMap[cubeFaceSize+x][y] = noise.noise3D(x, 0, cubeFaceSize-y); } //Generates BOTTOM else { cubeMap[cubeFaceSize+x][cubeFaceSize*2+(y-cubeFaceSize)] = noise.noise3D(x, cubeFaceSize, y-cubeFaceSize); } } } 

De cette façon, nous pouvons créer une carte cubique qui peut facilement être convertie en une projection également espacée en utilisant le merveilleux code écrit par Bartosz .

image

Carte cubique générée par l'algorithme.

image

Transformation équidistante d'une carte cubique.

image

Un globe de carte cubique rendu sur maptoglobe.com .

Comme vous pouvez le voir, une carte équidistante a des formes beaucoup plus belles, et lorsqu'elle est superposée à une sphère, elle crée des résultats similaires à la superposition sphérique, sans tous ses inconvénients. Soit dit en passant, la projection équidistante peut être facilement convertie par différents programmes, par exemple, NASA G.Projector , en presque n'importe quel type de carte.

En conclusion


Générer une planète entière peut sembler une tâche intimidante, et bien que le bruit lorsqu'il est utilisé correctement soit un outil assez puissant, il a ses propres problèmes auxquels les gens sont confrontés depuis de nombreux siècles, tels que la superposition d'un globe sur une toile 2D avec une distorsion minimale.

La solution que j'ai proposée crée des planètes très grossièrement générées qui ne prennent pas en compte les plaques tectoniques, les rivières, les chaînes d'îles et même les montagnes, et ne peuvent donc être utilisées que comme démonstration ou comme base pour des simulations plus complexes.

En fait, il ne crée qu'une matrice de valeurs dans une certaine plage de valeurs. Pour les images en niveaux de gris, c'est 0-255. Les valeurs sont ensuite converties en un pixel qui crée une image similaire à la première image en niveaux de gris, ou en une image dans la plage de -11000 à 8000 pour simuler la différence de hauteur réelle, après quoi les pixels sont colorés en fonction des intervalles de hauteur (par exemple, des valeurs de 0 5 sont colorés en sable pour simuler la côte) .

Dans la construction de l'univers, Dieu a utilisé des mathématiques de niveau supérieur.

- Paul Dirac

Source: https://habr.com/ru/post/fr448324/


All Articles