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
Le nouvel opérateur de PHP 8.5 va changer ta façon de coder

Comment j'ai connecté Cursor à Slack pour automatiser mes flux de travail d'IA

TeÌleÌcharger de la musique LeÌgalement

đź CrĂ©er un mini-jeu Discord avec VITE : un retour d'expĂ©rience

đ¶ Open Mic du Groover Club - Mai đ§Ą

â¶ïž 2025-05-26 DjMatyo Soundcloud set with MC

đ Du dĂ©veloppement Ă la production : dĂ©ployer une API Symfony avec Upsun

đ De zĂ©ro Ă hĂ©ros avec Sylius : Au cĆur de l'atelier sur les essentiels pratiques

đ Sylius Days 2025 : l'innovation en matiĂšre de commerce Ă©lectronique

đȘđș DJ Matyo Live special Eurovision 2025 đ

Générez automatiquement des miniatures YouTube personnalisées de style Ghibli avec PHP et l'IA

Recherche, Achat et Organisation de Tracks pour DJ Sets

Automating Gmail and Google Calendar with PHP Agents ?đ§ âĄ

Supercharge Your Job Search: Automate with MCP, Astra, Langflow and Arize

DJ Matyo Live

Build a Game for the largest game dev competition in the world

Demande Ă Codex

DJ Matyo Live repost track

Darkwood v1.0.1 release

Transforme ta voix en article de blog avec GPT et Meteor
