Je suis sûr que vous connaissez tous des jeux comme Dwarf Fortress - des étendues sauvages et des terres générées par des procédures. Quelque chose comme ça, tiré de cet article très utile.
Cependant, je me demandais comment je pourrais appliquer cela à une échelle beaucoup plus grande; on pense à l'échelle de Minecraft (n'est-ce pas quelque chose comme 8 fois la taille de la surface de la Terre?). Pseudo-infini, je pense que le meilleur terme serait.
L'article parle du bruit fractal perlin. Je ne suis en aucun cas un expert en la matière, mais je comprends l'idée générale (c'est une sorte de bruit généré de manière aléatoire qui est semi-cohérent, donc pas seulement des valeurs de pixels aléatoires).
Je pourrais simplement définir la taille des régions X par X, ajouter des éléments de type chargement de région et générer un bruit par une région. Mais cela ne ferait que créer d'énormes quantités d'îles.
À l’autre extrême, je ne pense pas pouvoir réellement générer une nappe supermassive de bruit perlin. Et ce ne serait qu'une grande île, je pense.
Je suis à peu près sûr que le bruit de Perlin, ou un peu de bruit, serait en quelque sorte la solution. Je veux dire, la carte est vraiment belle. Et vous pouvez remplacer l'asci par des tuiles et obtenir quelque chose de très joli.
la source
Réponses:
Je pense que je comprends mieux ce que vous demandez maintenant.
Le bruit n'est pas aléatoire - il a une apparence aléatoire, mais il est complètement basé sur une formule mathématique et peut être répété. Toutes les informations sont encodées dans la formule. Cela signifie que vous pouvez avoir une formule qui couvre potentiellement une zone infinie et utilisez-la simplement sur les coordonnées de la zone dont vous avez besoin. Lorsque vous avez besoin d'une zone adjacente, il vous suffit de réutiliser la formule sur les nouvelles coordonnées et, étant donné que la formule génère des valeurs continues, les zones se rejoignent de manière transparente.
Voici un exemple simplifié, utilisant le sinus au lieu du bruit perlin pour la génération de hauteur, et imaginant que le monde est infini sur l’axe des X, mais qu’il n’ya qu’une unité de hauteur sur les axes Y et Z.
La formule est:
height(x,y) = sin(x/20)
Le jeu commence et nous générons des hauteurs pour les environs, c.-à-d. (0,0) à (9,0):
[0.0, 0.05, 0.10, 0.15, 0.20, 0.25, 0.30, 0.34, 0.39, 0.43]
Nous avons une colline qui monte vers la droite. Disons que nous allons jusqu'au bout et devons générer les valeurs de (10,0 à 19,0) maintenant:
[0.48, 0.52, 0.56, 0.61, 0.64, 0.68, 0.72, 0.75, 0.78, 0.81]
Remarquez que la colline continue à monter régulièrement et que la valeur de (10,0) découle bien de celle de (9,0). Cela est dû au fait que la fonction sinus est continue, ce qui signifie que si vous lui introduisez 2 nombres adjacents, vous obtiendrez 2 résultats adjacents - pour une certaine définition de adjacente. Ainsi, si vous utilisez les coordonnées de votre monde comme paramètres de la fonction qui définit votre monde, vous obtiendrez un paysage continu qui s'agencera, peu importe la quantité ou la quantité générée à la fois. Lorsque vous générez de nouvelles pièces, elles découlent automatiquement des pièces existantes, car les hauteurs sont déjà prédéterminées.
Si le monde ne va pas changer, vous n'avez même pas besoin de stocker quoi que ce soit, car vous pouvez calculer exactement quelle est la hauteur à tout moment de la formule. Évidemment, avec quelque chose comme Minecraft, le monde est totalement déformable, il vous suffit donc de sauvegarder chaque morceau au fur et à mesure que vous le créez. Étant donné le haut degré de cohérence entre les morceaux adjacents (par exemple, si un bloc est en herbe, il est plus probable qu'improbable que le bloc à côté soit en herbe également), vous pouvez compresser les données de manière très efficace - le codage en longueur devrait fonctionner bien, mais alors presque tout algorithme de compression standard.
Alors que j'ai parlé de la hauteur comme valeur la plus évidente, vous pouvez utiliser le même système pour générer les caractéristiques de votre choix. Utilisez une fonction mathématique avec des propriétés continues et où les entrées sont vos coordonnées mondiales et qui peuvent décider de la présence de points de repère, de gisements minéraux, de points d'apparition, comme vous voulez. (Évidemment, les valeurs d'une formule peuvent en affecter une autre - inutile de placer un gisement de charbon dans les airs, vous générez donc la carte de la hauteur du monde, puis vous ne calculez que les possibilités de charbon pour les blocs situés suffisamment au-dessous du sol.)
la source
Ce tutoriel que j'ai écrit il y a des années peut vous donner quelque chose comme ce que vous voulez:
Si vous modifiez l’île à la dernière étape, vous verrez une seule masse terrestre qui n’atteint pas le bord de la carte.
la source
Pour créer une grande île, vous n'avez pas besoin de la générer en une fois. Je construirais des régions de manière asynchrone à mesure que vous les visiteriez.
Au lieu d'utiliser un masque pour créer l'îlot comme décrit dans l'article, vous pouvez notamment jouer avec les longueurs d'onde d'octave de bruit Perlin pour obtenir l'aspect recherché. Habituellement, la première octave décrit la forme générale du terrain. Toutes les octaves qui suivent ne font qu’ajouter des détails plus fins. Par conséquent, jouez avec la longueur d’onde de la première octave pour contrôler la taille de vos masses continentales. Si vous souhaitez que la masse continentale soit au centre, vous pouvez simplement réduire la carte de hauteur de plus en plus à mesure que vous vous éloignez du centre, puis normaliser le bruit. Imaginons par exemple de combiner ces deux éléments pour créer votre île:
Cet article devrait aider: http://freespace.virgin.net/hugo.elias/models/m_perlin.htm
Si vous souhaitez en savoir plus sur les mondes 3D infinis et sur diverses astuces que vous pouvez utiliser pour modifier l'apparence du terrain en jouant avec l'entrée et la sortie de bruit, consultez cet article: http://http.developer.nvidia.com /GPUGems3/gpugems3_ch01.html
La lecture risque d’être un peu difficile si vous n'êtes pas familiarisé avec le pipeline graphique et la programmation de shader.
la source
Quelques liens utiles pour vous à propos de la génération automatique du monde:
http://pcg.wikidot.com/ - Génération de contenu procédural
http://www-cs-students.stanford.edu/~amitp/gameprog.html#tiles - Ensemble d'algorithmes Amit's Building Worlds
la source
Le bruit et les amis de Perlin sont un bon point de départ, mais vous voudrez probablement aller plus loin. La plupart des générateurs à base de bruit populaires vous donneront des résultats assez inintéressants. Pour rendre le terrain réaliste, vous souhaitez examiner les algorithmes émulant les effets de l'érosion. L'un des simulateurs de jeu les plus avancés au monde, la forteresse naine, fait de la simulation de l'érosion l'une des étapes de la construction du monde.
L' une des solutions assez cool , je l' ai vu a été décrit dans l'article « Advanced dépôt de particules » dans les Gems Game Programming 7. Il y a beaucoup d' autres disponibles sur Internet donc il y a beaucoup de ressources pour tirer (par exemple 1 ou 2 ) .
la source