top of page

Marching Cubes - Submarine

Marching Cubes - Submarine est un projet visant à utiliser l'algorithme des marching cubes, servant à transformer un bruit (ensemble de valeur dans un espace) en modèle 3D rapidement, pour génerer un environnement procédural utilisable en temps réel dans un jeu. Ce projet est inspiré d'une vidéo de Sebastien Lague sur les Marching Cubes.

Marching Cubes

L'algorithme Marching Cubes prend en entrée un ensemble de valeurs comprises entre 0 et 1, chacune associée à une coordonnée dans l'espace. Ces valeurs forment un maillage de cubes adjacents — d'où le nom de l'algorithme. En comparant chaque valeur à un seuil donné, on obtient deux états possibles : inférieur (0) ou supérieur (1).

Chaque cube est défini par 8 sommets, ce qui donne 2⁸ (256) configurations possibles. Chacune peut être représentée sous forme binaire, permettant d’attribuer un identifiant unique à chaque cas.

Grâce à cet identifiant, on détermine quels points relier pour générer la portion de maillage (mesh) correspondant à ce cube. En combinant les résultats de chaque cube, on reconstitue un modèle 3D complet.

La rapidité de l’algorithme repose sur une table de 256 configurations prédéfinies, enregistrées dans le code. Aucune opération complexe n’est nécessaire : il suffit de retrouver la bonne correspondance.

Générer un terrain procédural

Pour générer un terrain, il suffit de partir d’un bruit bien conçu. J’ai opté pour une approximation du bruit de Perlin en 3D, qui produit des formes naturellement groupées et harmonieuses. En empilant plusieurs couches de ce bruit (octaves), avec une échelle réduite (lacunarité) et une influence plus faible (persistance), on obtient un relief cohérent et détaillé.

En jouant sur ces paramètres, on peut générer une grande variété de terrains. Par exemple, en accentuant certaines altitudes, on crée des plateaux ; en ajoutant un second bruit, on peut simuler un plafond vu du dessus ; en compressant les valeurs sur un axe, on favorise l’apparition de plaines ou, à l’inverse, de falaises.

Enfin, en ajustant les options de rendu et en appliquant un shader simple basé sur l’inclinaison du terrain, on obtient un résultat satisfaisant !

La dernière image montre une partie du scriptable object utilisé pour paramétrer le terrain de chaque zone.

NVIDIA_Overlay_SDKE416eYv.png
pCUWBBwCYM.png
BZfmDFqF3P.png

Terrain infini en temps réel

L’objectif final est de générer un terrain infini en temps réel. Pour cela, le terrain est découpé en blocs appelés chunks, calculés indépendamment les uns des autres. Ces chunks sont générés de manière asynchrone et stockés dans un dictionnaire.

Le système crée dynamiquement les chunks autour de la position du joueur. Ceux qui sont trop éloignés sont masqués mais conservés en mémoire pour éviter de les recalculer plus tard. La même logique s’applique aux colliders utilisés pour la physique, mais avec une distance d’activation beaucoup plus faible.

Enfin, un effet de brouillard masque le chargement des chunks lointains. On obtient ainsi un terrain infini, cohérent visuellement et performant en jeu.

Exploration

Pour explorer l’environnement généré, rien de tel qu’un petit sous-marin. Équipé de quelques fusées éclairantes et d’une caméra avec un anti-clipping basique, on peut désormais se plonger au cœur du décor en toute fluidité.

bottom of page