Robert.Torna al playground09 / 10

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.

Griglia generata con Wave Function Collapse composta da strade azzurre e arancioni
Una griglia 8×8, poche regole sui bordi e una configurazione diversa a ogni generazione.

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.

Città procedurale del videogioco Townscaper
Townscaper · screenshot ufficiale

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.

Isola procedurale del videogioco Bad North
Bad North · screenshot ufficiale

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.

Sopra · 0Destra · 1Sotto · 1Sinistra · 0Tile curva con strada aperta a destra e sotto
01 · Descrivi

Questa curva apre a destra e sotto.

Nel codice ogni lato espone un valore: 1 dove la strada continua, 0 dove il bordo è chiuso.

Prima curva compatibile
Strada orizzontale compatibile
Seconda curva compatibile
02 · Conserva

Tre possibilità rimangono valide.

A destra possono sopravvivere soltanto tile con il lato sinistro aperto: 1 incontra 1.

Tile vuota incompatibile×
Strada verticale incompatibile×
Curva incompatibile×
03 · Escludi

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.

Una cella WFC scelta e le alternative intorno
01 · OsservaUna cella viene scelta.

Da tutte le possibilità disponibili ne rimane una sola.

Le celle vicine perdono alternative
02 · PropagaLe vicine perdono alternative.

Ogni bordo appena deciso restringe le combinazioni compatibili.

Griglia WFC composta da insiemi di possibilità
03 · RipetiLa griglia diventa determinata.

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.

Pannello WFC Manager accanto alla griglia generata
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.

Nella demo

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.

Nell’algoritmo

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.

Dimensione 012D ✓

Tile, compatibilità, propagazione e griglie ridimensionabili: il proof of concept funziona.

Dimensione 023D —

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.