Construire un monde sur le nombre d'or
Un monde procédural a deux façons de rater. Trop de bruit, et tout se ressemble : une bouillie de collines sans repère où le joueur se perd. Trop de structure, et ça sent la grille : des cases régulières, artificielles, mortes.
On voulais l’entre-deux — un monde de 4,8 km² avec une vingtaine de biomes, assez organisé pour qu’on sache toujours où on est, assez organique pour qu’on n’y voie jamais la main du programmeur. La solution, je ne l’ai pas inventée : la nature l’utilise depuis des millions d’années.
Pourquoi le nombre d’or
φ (phi), c’est 1.618..., le nombre d’or. Ce qui nous intéresse, ce n’est pas le
nombre lui-même mais l’angle qu’il génère : 137,5°, l’angle d’or
(360° ÷ φ²).
C’est l’angle que les tournesols utilisent pour disposer leurs graines. Chaque nouvelle graine est posée 137,5° après la précédente — et grâce à φ, aucune ne s’aligne jamais avec une autre. Le résultat : un remplissage parfaitement régulier, sans répétition, sans trou. C’est ce qu’on appelle la phyllotaxie.
Autrement dit, l’évolution a déjà résolu mon problème : « répartir des éléments de façon homogène mais non répétitive ». Je n’avais qu’à voler la recette.
PPH — Phi-Perlin-Hybrid
Mon générateur s’appelle le PPH, pour Phi-Perlin-Hybrid. Le nom dit tout : c’est un mariage de deux logiques.
- φ pour la structure. L’angle d’or et les spirales phyllotaxiques décident où vont les choses — la disposition des biomes, la dispersion de la flore, les points d’intérêt. C’est la partie ordonnée, mathématique.
- Perlin pour le relief. Un bruit de Perlin module la hauteur du terrain, apporte les ondulations, casse toute trace de régularité visible à l’œil. C’est la partie organique, naturelle.
L’un sans l’autre échoue. φ seul donnerait un monde trop parfait ; Perlin seul, une bouillie. Ensemble, ils donnent un monde qu’on lit sans le comprendre.
Choisir un biome en trois questions
Tout part du centre du monde — l’Arbre des Âmes, posé à l’origine. Pour savoir quel biome se trouve à une position donnée, mon code pose trois questions, dans un ordre de priorité strict :
La hauteur d’abord. Un sommet est un sommet, peu importe où il se trouve sur la carte — la montagne enneigée ne dépend pas de la distance au centre.
Puis les anneaux concentriques. La distance au centre découpe le monde en couronnes. Plus on s’éloigne de l’Arbre, plus les biomes deviennent hostiles.
Enfin les secteurs angulaires. Chaque anneau est tranché en quartiers selon l’angle. C’est ce qui fait qu’en marchant en cercle autour du centre, on traverse des ambiances différentes sans jamais changer de « niveau ».
Ma vraie fonction enchaîne une vingtaine de cas comme ça. Mais la philosophie tient en trois lignes : altitude, anneau, secteur.
Ce que ça donne
Un monde qu’on parcourt avec une boussole intérieure. On sent toujours si on s’éloigne ou si on revient vers l’Arbre, parce que la structure en anneaux est lisible inconsciemment. Et pourtant, jamais une colline ne ressemble à la précédente, parce que Perlin brouille les pistes en surface.
Le mur : une hauteur, et une seule
Mon système a une faille, et c’est moi qui l’ai creusée. La fonction qui donne
le relief, pphTerrainHeight, renvoie une valeur par position (x, z). Une
seule. C’est ce qui la rend rapide et lisible — mais ça veut dire qu’elle décrit
une surface, et rien qu’une surface.
Tant que je sculptais des montagnes, des vallées, des côtes, aucun problème : tout ça, c’est une fonction de (x, z). Puis j’ai voulu une grotte. Et je me suis cogné à un mur que j’avais bâti moi-même.
Une grotte, ça demande deux hauteurs au même endroit : le sol sous tes pieds, et le plafond au-dessus de ta tête. Une fonction ne rend qu’une valeur. Dans une carte de hauteur, il n’y a pas de « sous-terrain » — il n’y a que « la surface ». Mon monde élégant, piloté par φ, était mathématiquement une feuille de papier froissée en collines. Infiniment fine.
La solution bourrine aurait été de jeter la carte de hauteur et de représenter tout le monde comme une grille de voxels en 3D. Mais c’est coûteux, et ça détruirait tout ce qui fait l’élégance du PPH — la spirale φ, la lisibilité, le calcul quasi gratuit par position. Brûler la maison pour ajouter une cave.
J’ai pris l’autre chemin : des poches SDF locales. Là où je veux une grotte,
je greffe un Signed Distance Field — une fonction qui répond, en vraie 3D, « à
quelle distance suis-je de la paroi ? » — et je la transforme en maillage avec
l’algorithme des marching cubes. C’est additif et non destructif : je creuse une
poche 3D locale et je la couds sur la surface, mais le pphTerrainHeight global
reste rigoureusement intact partout ailleurs. Le monde est toujours une carte de
hauteur. La grotte est une pièce 3D rapportée, cousue dedans.
C’est le chantier sur lequel je suis en ce moment, et il n’est pas encore dompté — aligner la collision du joueur avec les parois maillées, c’est une saga à soi seule. Mais le principe tient : ne combats pas tes fondations, construis par-dessus.
Le détail que je préfère : dans la mythologie du jeu, c’est Thrael, le « Formateur des Sphères », qui a donné au monde sa forme circulaire. C’était écrit dans notre scénario que ce fragment de lore avant d’écrire l’algorithme. Et l’algorithme dispose les biomes… en anneaux concentriques.
Le mythe décrivait le code qu’on avais pas encore écrit.