Introduction : Qu'est-ce que le Wave Function Collapse ?
Le Wave Function Collapse (WFC) est un puissant algorithme de gĂ©nĂ©ration procĂ©durale qui suscite un vif intĂ©rĂȘt dans le dĂ©veloppement de jeux et la crĂ©ation de contenu. Bien quâil sâinspire de concepts en mĂ©canique quantique, le WFC est accessible et offre des applications uniques pour gĂ©nĂ©rer des motifs, des cartes et des mises en page suivant des rĂšgles spĂ©cifiques.
En physique, une fonction dâonde reprĂ©sente tous les Ă©tats possibles dans lesquels une particule pourrait exister simultanĂ©ment, et « sâeffondre » en un seul Ă©tat lors de lâobservation. De maniĂšre similaire, lâalgorithme WFC commence avec de nombreux Ă©tats potentiels pour chaque tuile ou cellule et rĂ©duit progressivement chaque option en appliquant des contraintes, jusqu'Ă ce quâune seule solution valide Ă©merge.
Ce guide vous expliquera comment fonctionne le WFC, ses applications et comment l'utiliser avec PHP â un langage pas forcĂ©ment associĂ© Ă la gĂ©nĂ©ration procĂ©durale, mais tout Ă fait capable de la gĂ©rer.
Comment fonctionne l'algorithme de Wave Function Collapse ?
Lâalgorithme WFC est un solveur basĂ© sur des contraintes qui sâassure que les cellules voisines suivent des rĂšgles spĂ©cifiques. Ces rĂšgles peuvent reprĂ©senter des exigences dâadjacence de tuiles dans un jeu, voire des contraintes de mise en page pour Ă©viter le chevauchement d'Ă©lĂ©ments visuels.
Concepts de Base
-
Entropie : Dans le WFC, lâentropie dĂ©signe le nombre d'Ă©tats valides restants pour une cellule. Une cellule avec une faible entropie a peu dâĂ©tats possibles, tandis qu'une cellule avec une forte entropie en a plusieurs.
-
Propagation : Au fur et Ă mesure que les cellules sâeffondrent, elles influencent leurs voisines en limitant les Ă©tats que celles-ci peuvent avoir, rĂ©duisant ainsi leur entropie.
-
Effondrement : Lâalgorithme choisit toujours une cellule avec la plus faible entropie, lâeffondre en un seul Ă©tat, puis propage ce changement aux cellules voisines. Ce processus continue jusqu'Ă ce que toutes les cellules soient effondrĂ©es ou quâune contradiction soit dĂ©tectĂ©e.
Le WFC en Action
Voici une vue dâensemble Ă©tape par Ă©tape du fonctionnement de l'algorithme WFC :
-
Initialisation : Chaque cellule commence avec tous les états possibles (par exemple, dans une carte en tuiles, une cellule pourrait représenter des options comme mur, sol, eau, etc.).
-
SĂ©lection de la plus faible entropie : Choisir la cellule avec le moins dâĂ©tats possibles (la plus faible entropie).
-
Effondrement de la cellule : SĂ©lectionner au hasard lâun des Ă©tats valides restants.
-
Propagation des contraintes : Mettre à jour les cellules voisines pour éliminer les états qui ne sont plus valides en fonction de la cellule effondrée.
-
RĂ©pĂ©ter ou gĂ©rer les contradictions : Si toutes les cellules sâeffondrent avec succĂšs, vous avez une solution. Sinon, il faudra gĂ©rer les contradictions.
Visualiser le WFC
Imaginez que vous rĂ©solvez un puzzle oĂč chaque tuile doit sâajuster parfaitement Ă ses voisines. Au dĂ©part, chaque cellule a plusieurs options de tuiles, mais Ă mesure que vous placez des tuiles, vous rĂ©duisez les choix des cellules environnantes jusqu'Ă ce que seules des configurations valides restent.
ImplĂ©menter le WFC en PHP : Guide Ătape par Ătape
Bien que PHP ne soit peut-ĂȘtre pas votre premier choix pour la gĂ©nĂ©ration procĂ©durale, il fonctionne bien pour les projets web et la gĂ©nĂ©ration dynamique de mises en page. Voici comment implĂ©menter le WFC en PHP.
Définir les Tuiles et Contraintes
Tout d'abord, nous dĂ©finissons une classe Tile en PHP, oĂč chaque tuile a des contraintes qui spĂ©cifient avec quelles autres tuiles elle peut ĂȘtre adjacente. Par exemple, une tuile « eau » peut ĂȘtre autorisĂ©e uniquement Ă cĂŽtĂ© de « eau » ou de « sable ».
class Tile { public $name; public $constraints; public function __construct($name, $constraints) { $this->name = $name; $this->constraints = $constraints; } }
Initialiser la Grille
Ensuite, nous crĂ©ons une grille oĂč chaque cellule commence avec tous les Ă©tats de tuile possibles :
$grid = array_fill(0, $width, array_fill(0, $height, ['eau', 'sable', 'forĂȘt', 'montagne']));
Propager les Contraintes
Pour reflĂ©ter lâĂ©tat de chaque cellule, nous dĂ©finissons une fonction qui met Ă jour les cellules voisines en fonction des contraintes dâune cellule effondrĂ©e.
function propagateConstraints(&$grid, $x, $y, $tile) { $directions = [ 'gauche' => [-1, 0], 'droite' => [1, 0], 'haut' => [0, -1], 'bas' => [0, 1] ]; foreach ($directions as $direction => $offset) { $dx = $x + $offset[0]; $dy = $y + $offset[1]; if (isset($grid[$dx][$dy])) { $grid[$dx][$dy] = array_intersect($grid[$dx][$dy], $tile->constraints[$direction]); } } }
Effondrer la Cellule avec la Plus Faible Entropie
Nous sĂ©lectionnons la cellule avec la plus faible entropie, lâeffondrons, puis propageons les contraintes aux cellules voisines.
function getLowestEntropyCell($grid) { $minEntropy = PHP_INT_MAX; $bestCell = null; foreach ($grid as $x => $row) { foreach ($row as $y => $cell) { if (count($cell) < $minEntropy && count($cell) > 1) { $minEntropy = count($cell); $bestCell = [$x, $y]; } } } return $bestCell; } function collapseCell(&$grid, $x, $y) { $possibilities = $grid[$x][$y]; if (empty($possibilities)) { throw new Exception("Contradiction détectée en [$x, $y]"); } $choice = $possibilities[array_rand($possibilities)]; $grid[$x][$y] = [$choice]; propagateConstraints($grid, $x, $y, new Tile($choice, [])); }
Exécuter l'Algorithme
Pour terminer, nous exĂ©cutons lâalgorithme jusquâĂ ce que toutes les cellules soient effondrĂ©es.
while ($cell = getLowestEntropyCell($grid)) { list($x, $y) = $cell; collapseCell($grid, $x, $y); } // Afficher la grille foreach ($grid as $row) { foreach ($row as $cell) { echo $cell[0] . ' '; } echo PHP_EOL; }
Si une contradiction se produit, lĂ oĂč une cellule nâa pas d'options valides, vous pouvez essayer de revenir en arriĂšre ou de redĂ©marrer de maniĂšre alĂ©atoire.
Gérer les Contradictions
Les contradictions surviennent lorsque les contraintes dâune cellule lui laissent aucun Ă©tat valide. Pour y remĂ©dier, vous pouvez :
-
Revenir à un état précédent et essayer une autre option.
-
Redémarrer le processus avec des conditions initiales différentes.
-
Ajuster les calculs dâentropie pour Ă©viter les contradictions plus tĂŽt.
Exploration dâAutres Algorithmes de GĂ©nĂ©ration de Cartes
Au-delà du WFC, il existe de nombreux autres algorithmes de génération procédurale, chacun étant adapté à des tùches spécifiques comme la génération de terrain, les formes organiques ou les structures complexes. Voici un aperçu de quelques alternatives :
-
Perlin & Simplex Noise : Idéal pour générer des terrains lisses et naturels comme des montagnes et des vallées.
-
Automates Cellulaires : Parfait pour créer des structures de grottes organiques.
-
Diagrammes de Voronoi : Utile pour diviser un espace en régions basées sur la proximité de points, parfait pour la génération de biomes.
-
L-Systems : Souvent utilisés pour créer des structures de branchement naturelles comme des arbres.
-
Génération de Donjons : Des algorithmes comme la partition binaire (BSP) et la marche aléatoire créent des piÚces et des couloirs pour des structures de type donjon.
Chacun de ces algorithmes a des forces uniques, donc le choix dépend des besoins et des contraintes du projet.
Applications du Wave Function Collapse
Le WFC a une gamme dâapplications :
-
Développement de jeux : Générer des cartes de tuiles cohérentes, des niveaux ou des cartes.
-
Génération d'images : Créer des motifs et textures qui suivent des rÚgles d'adjacence spécifiées.
-
Plans de villes : GĂ©nĂ©rer des mises en page oĂč certaines structures doivent coexister.
-
Création de puzzles : Concevoir des puzzles comme le Sudoku ou des mots croisés qui reposent sur des rÚgles d'adjacence.
Le Défi Technique avec Symfony UX
IntĂ©grer lâalgorithme WFC dans une application Symfony implique des dĂ©fis uniques. Comme Symfony UX est conçu pour des expĂ©riences utilisateur rĂ©actives, il est essentiel de gĂ©rer les mises Ă jour continues dâune grille gĂ©nĂ©rĂ©e dynamiquement Ă mesure que WFC progresse. Ici, les composants LiveComponent et la gestion asynchrone de Symfony UX contribuent Ă crĂ©er une expĂ©rience fluide pour visualiser le WFC tout en garantissant des performances stables.
Un Ă©lĂ©ment crucial de cette implĂ©mentation est Flow, un framework dâorchestration visuelle des donnĂ©es. Flow amĂ©liore considĂ©rablement la rĂ©utilisabilitĂ© et la modularitĂ©, des clĂ©s pour gĂ©rer des processus de gĂ©nĂ©ration procĂ©durale complexes. Par exemple, chaque tĂąche du WFC, de l'effondrement des cellules Ă l'application des contraintes, est encapsulĂ©e comme une unitĂ© modulaire dans Flow. Cette approche simplifie le code et permet de rĂ©utiliser les fonctionnalitĂ©s du WFC dans diffĂ©rents contextes, que ce soit pour des ensembles de donnĂ©es variĂ©s ou des tailles de grille diffĂ©rentes, avec peu de modifications.
Demo et sources
Voici une vidéo concrÚte générée par l'algorithme
Le code de cette implémentation Symfony est disponible ici : https://github.com/matyo91/flow-live
Conclusion
Le Wave Function Collapse est un outil fascinant pour la gĂ©nĂ©ration procĂ©durale, combinant contraintes et alĂ©atoire pour crĂ©er des sorties cohĂ©rentes et visuellement plaisantes. Bien que PHP ne soit pas forcĂ©ment le premier langage auquel on pense pour le WFC, il est plus que capable de gĂ©rer lâalgorithme, ouvrant des possibilitĂ©s intĂ©ressantes pour la gĂ©nĂ©ration de contenu procĂ©dural sur le web.
Le WFC a de vastes applications, allant des jeux à la conception graphique en passant par la mise en page. Maßtriser cet algorithme ouvre la voie à la création de mondes et de motifs générés par algorithme, à la fois complexes et esthétiquement attrayants.
Ressources
Explorez ces ressources pour approfondir votre compréhension du WFC et des techniques de génération procédurale.
-
Wave function collapse on Wikipedia General : https://en.wikipedia.org/wiki/Wave_function_collapse
-
Wave function collapse on Wikipedia Algorithm : https://en.wikipedia.org/wiki/Model_synthesis
-
WaveFunctionCollapse Github : https://github.com/mxgmn/WaveFunctionCollapse
-
Coding Challenge 171 Wave Function Collapse : https://www.youtube.com/watch?v=rI_y2GAlQFM
-
Wave Function Collapse Explained : https://www.boristhebrave.com/2020/04/13/wave-function-collapse-explained
-
The Wavefunction Collapse Algorithm explained very clearly : https://robertheaton.com/2018/12/17/wavefunction-collapse-algorithm
-
The fascinating Wave Function Collapse algorithm : https://dev.to/kavinbharathi/the-fascinating-wave-function-collapse-algorithm-4nc3
-
A new way to generate worlds (stitched WFC) : https://www.youtube.com/watch?v=dFYMOzoSDNE
-
EPC2018 - Oskar Stalberg - Wave Function Collapse in Bad North : https://www.youtube.com/watch?v=0bcZb-SsnrA
-
Introduction to procedural generation with Wave Function Collapse : https://www.youtube.com/watch?v=ZdbpTkuStKI
-
Wave Function Collapse Is A Thing - Godot 4.1 C# (Full Lesson) : https://www.youtube.com/watch?v=OiJmO2BRcVE
-
Expanding Wave Function Collapse with Growing Grids for Procedural Content Generation : https://www.youtube.com/watch?v=2TDgZfc-bu0
-
The Wave Function Collapse algorithm : https://www.youtube.com/watch?v=qRtrj6Pua2A
-
A.I. Level Generation, High Res (Wave Function Collapse #6) : https://www.youtube.com/watch?v=bVI-i39lYP8
-
PHP-WFC : https://github.com/FeatheredSnek/phpwfc
-
Procedural Generation with Wave Function Collapse and Model Synthesis | Unity Devlog : https://www.youtube.com/watch?v=zIRTOgfsjl0
-
Model Synthesis : https://paulmerrell.org/model-synthesis
-
Wave Collapse Function algorithm in Processing : https://discourse.processing.org/t/wave-collapse-function-algorithm-in-processing/12983
-
Présentation du Wave Function Collapse (Procédural) https://www.youtube.com/watch?v=_pRIHB8Qbek
-
Automatic Generation of Game Content using a Graph-based Wave Function Collapse Algorithm : https://fr.slideshare.net/slideshow/automatic-generation-of-game-content-using-a-graphbased-wave-function-collapse-algorithm-191777606/191777606
Creative works
-
Creating Little Castles with Wave Function Collapse : https://www.youtube.com/watch?v=MyMbbmWVCDw
-
Eternal Mist. Example of Wave Function Collapse (for #screenshotsaturday ). Indie Game Devlog #2.1 : https://www.youtube.com/watch?v=Ff0tXzaMpvU
-
Wave Function Collapse For Dummies Like Me (With Unity Example) : https://www.youtube.com/watch?v=57MaTTVH_XI
-
Procedural generation from a single example with WaveFunctionCollapse : https://www.youtube.com/watch?v=DOQTr2Xmlz0
-
EASY Wave Function Collapse Tutorial for Unity Games! (Unity Tutorial - Reupload) : https://www.youtube.com/watch?v=3g440SA2hKU
-
Why I use Wave Function Collapse to create levels for my game : https://www.youtube.com/watch?v=TO0Tx3w5abQ
-
How Townscaper Works: A Story Four Games in the Making | AI and Games #65 : https://www.youtube.com/watch?v=_1fvJ5sHh6A
-
OisĂn Wave Function Collapse for poetry: https://github.com/mewo2/oisin
-
Townscaper : https://www.townscapergame.com/
-
unity-wave-function-collapse : https://selfsame.itch.io/unitywfc
-
Zelda WFC : https://observablehq.com/@makio135/zelda-wfc
-
Wave Function Collapse Demonstration : https://oskarstalberg.com/game/wave/wave.html
-
Infinite procedurally generated city : https://marian42.de/article/wfc/
-
Generating stairy scenes : https://x.com/exutumno/status/895683455299723265?lang=eu
-
Herbert Wolverson - Procedural Map Generation Techniques : https://www.youtube.com/watch?v=TlLIOgWYVpI
-
What Is Perlin Noise? Procedural Generating in Video Games : https://www.youtube.com/watch?v=9x6NvGkxXhU
âš Rencontre SQLI

đš Pipe Programming : linĂ©ariser la complexitĂ© des graphes

đ Symfony AI Hackathon â Mon retour dâexpĂ©rience en ligne

đ Veille tech semaine 37

đČ Pierre-Papier-Ciseaux : un modĂšle minimal dâĂ©quilibre et de stratĂ©gie

âïž Strong vs Weak References : maĂźtriser la mĂ©moire et Ă©viter les fuites

đ Inverser pour mieux rĂ©gner

đ Git : assurer lâintĂ©gritĂ© et lâauthenticitĂ© de lâhistorique

đ Veille Tech â Semaine 36

đ 2025-09-01 DJ Matyo Live - UK Hardcore / Happy Hardcore

âš Uniflow v1.1.17 â Migration vers Symfony UX

đ€ Panorama 2025 des plateformes freelances : 128 solutions pour trouver vos missions

đŒïž Supprime automatiquement lâarriĂšre-plan de tes images avec Claude et RMBG

đ Veille Tech â Semaine 34

đ©âđ» Hier, jâai codĂ© avec ma copine Ani đ (oui, elle est IA đ€âš).

Automatise la création de notes dans Joplin

đ„ Les news tech PHP & IA de la semaine

đ Pourquoi Symfony AI va remplacer ton dev stagiaire

đ„ Le dancefloor en feu au Tennessee Club de Paris

Je mixe sur Paris au Tennessee Mercredi 30 juillet
