Playground · Wave Function Collapse
Ho scoperto Townscaper.
Poi ho voluto ricostruire
l’algoritmo che c’era sotto.
Townscaper e Bad North mi hanno fatto innamorare di mondi che sembravano progettati, pur cambiando ogni volta. Così ho studiato il Wave Function Collapse e ne ho scritto una versione personale.

01 · Il punto di partenza
Non volevo copiare
quei mondi. Volevo
capire perché
funzionavano.
Mi sono imbattuto nei lavori di Oskar Stålberg e nella loro capacità di generare strutture sempre nuove ma visivamente coerenti. Ho letto come funzionava l’algoritmo e ho provato a tradurlo da solo in codice.

Un blocco cambia in base a ciò che lo circonda.
Case, archi, terrazze e passerelle emergono dalla configurazione dei moduli vicini su una griglia irregolare.

Ogni isola è diversa, ma resta leggibile e giocabile.
Forme modulari e vincoli locali generano livelli variabili senza perdere coerenza strutturale.
02 · Le regole
Ogni tile conosce soltanto i
propri bordi. Da lì deve
emergere tutto il resto.
La demo utilizza un Simple Tiled Model: un insieme predefinito di tile e regole di adiacenza che stabiliscono quali lati possono toccarsi.
Questa curva apre a destra e sotto.
Nel codice ogni lato espone un valore: 1 dove la strada continua, 0 dove il bordo è chiuso.
Tre possibilità rimangono valide.
A destra possono sopravvivere soltanto tile con il lato sinistro aperto: 1 incontra 1.
Le alternative chiuse vengono scartate.
Queste tile hanno il lato sinistro a 0: interromperebbero la strada e spariscono dalle possibilità.
03 · Il collasso
Una scelta riduce le possibilità.
Poi l’informazione si propaga.
La generazione parte da una scelta casuale. A ogni passaggio una cella viene risolta e i vincoli aggiornano ciò che può ancora esistere intorno. Nella demo il processo rimane visibile, tile dopo tile.

Da tutte le possibilità disponibili ne rimane una sola.

Ogni bordo appena deciso restringe le combinazioni compatibili.

Il ciclo continua finché ogni cella contiene una tile definitiva.
Il risultato sembra disegnato nel suo insieme. In realtà nessuna tile conosce la composizione completa: risponde soltanto alle regole delle proprie vicine.
04 · Il piccolo laboratorio
Abbastanza controlli per
cambiare il problema. Non
abbastanza design per fingere
che fosse finito.
Il pannello permette di modificare righe, colonne e dimensione delle celle, scegliere il punto iniziale oppure lasciare che l’algoritmo risolva automaticamente la griglia.

- Grid
- Righe e colonne modificabili.La stessa logica può lavorare su problemi di dimensioni differenti.
- Cell measure
- La griglia può cambiare scala.La dimensione visiva delle celle rimane indipendente dalle regole.
- Choose point
- Il primo collasso può essere scelto.Un punto di partenza diverso modifica la storia della generazione.
- Auto resolve
- Il resto viene propagato automaticamente.Per riprovare da zero, nella versione attuale serve un refresh.
05 · La parte difficile
La casualità era facile. Farle
rispettare le regole, molto
meno.
La sfida non era estrarre una tile a caso, ma costruire un sistema di compatibilità capace di propagarsi senza distruggere la coerenza ottenuta nei passaggi precedenti.
Un insieme di regole progettato per continuare.
Con queste tile e queste compatibilità, l’esperimento è stato costruito per arrivare a una soluzione valida durante le generazioni provate.
Una contraddizione resta tecnicamente possibile.
Il Wave Function Collapse in generale può lasciare una cella senza alternative. Non è magia garantita: è un sistema di vincoli probabilistico.
06 · Il piano originale
La parte 2D funzionava. Poi
sarebbe dovuto arrivare
Three.js.
L’obiettivo era trasformare le regole bidimensionali in una generazione tridimensionale più vicina ai mondi che avevano acceso la curiosità iniziale. Quella seconda parte non è mai stata sviluppata.
Tile, compatibilità, propagazione e griglie ridimensionabili: il proof of concept funziona.
Three.js era previsto. È rimasto il promemoria più evidente del fatto che questo è un esperimento incompleto.
07 · Il risultato
Non ho costruito Townscaper.
Ho capito molto meglio cosa
significa generare con delle
regole.
Tra dicembre 2023 e marzo 2024 l’esperimento ha raggiunto il suo obiettivo principale: studiare un algoritmo complesso, interpretarlo e trasformarlo in un’implementazione personale osservabile in tempo reale.
- Periodo
- 4 mesiUno sviluppo personale portato avanti tra la fine del 2023 e l’inizio del 2024.
- Risultato
- 2D funzionanteUna griglia configurabile che mostra il collasso mentre avviene.
- Stato
- IncompletoIl nucleo algoritmico esiste; l’esperienza visiva e la parte 3D no.
Oggi
Lo renderei molto più
spettacolare. Ma la parte che
volevo davvero capire era già lì.
Rivedrei l’algoritmo, l’interfaccia e finalmente quella versione 3D. Rimane però uno degli esperimenti che meglio racconta il mio modo di imparare: vedere qualcosa, chiedermi come funziona e provare a ricostruirlo.