Indietro

Willow Ferry

Un borgo d’acqua del Jiangnan renderizzato in tempo reale nel browser — muri bianchi e tegole scure, frontoni a testa di cavallo, un ponte ad arco in pietra, barche wupeng, salici e acque verde giada — dove un’intera giornata compie il suo giro in circa sette minuti. Passa da uno all’altro dei sei punti di vista, cammina lungo le rive oppure scendi lungo il canale su una barca wupeng, fin sotto il ponte; l’intero borgo è generato proceduralmente da script di Blender.

Autore: Theodore
Provalo dal vivo
Willow FerryProvalo dal vivo

Descrizione

Willow Ferry è un borgo d’acqua del Jiangnan renderizzato in tempo reale nel browser: muri bianchi e tegole scure, frontoni a testa di cavallo, botteghe con facciate a grata sotto gronde da cui pendono lanterne, un ponte ad arco in pietra sul canale, barche wupeng ormeggiate ai gradini e salici che ricadono sull’acqua verde giada. La schermata di caricamento dà il tono: «Follow the water. Come home a little late.»

Il borgo segue una giornata tutta sua — ora dorata, ora blu, notte di luna, alba, mattino, pomeriggio — che compie il suo giro in circa sette minuti, con il sole e la luna sempre in movimento e le ombre che girano lentamente dietro di loro. Tieni premuto T per far scorrere le ore più in fretta, oppure premi 1–5 per passare direttamente a pomeriggio, ora dorata, ora blu, chiaro di luna o pioggia nebbiosa. La pioggia nebbiosa è una condizione meteo, non un’ora del giorno: se la scegli, l’orologio si ferma finché non selezioni un’altra ora.

I tasti ←/→ passano in rassegna sei punti di vista: Willow Bank, Moon Bridge, Ferry Steps, Tea Pavilion, Town in the Mist e The Slow Boat. Ognuno è accompagnato da una breve frase, che in alcuni casi cambia con l’ora — all’ora dorata Willow Bank recita «The sun rests in the arch.» — e quella di Moon Bridge rielabora la poesia «Frammento» (断章) di Bian Zhilin: «You stand on the bridge to watch the view. / From a window, someone watches you.»

Trascina per guardarti intorno, scorri per scivolare in avanti, cammina con WASD (Shift per andare più veloce, Q/E per salire e scendere) e fai clic per mettere a fuoco. Il pulsante del diaframma va da f/1.4 a f/16 e l’ultimo stop disattiva la profondità di campo, così tutto risulta nitido; la camera ha un leggero ondeggiamento da ripresa a mano (Drift), che si può disattivare, e H nasconde l’interfaccia. Premi «Ride the boat» e la camera scende dolcemente sulla prua mentre la barca scivola lungo il canale: ←/→ (A/D) per virare, ↑ (W) per remare più forte, ↓ (S) per rallentare, e quando lasci i tasti la barca ritrova da sola la rotta. Il margine entro cui può deviare è stato misurato lungo il percorso, così non va mai a urtare gli argini, le barche ormeggiate o l’arco del ponte.

L’intero borgo è realizzato con il codice: le case, il ponte ad arco in pietra, le barche wupeng, le lanterne, i salici, i peschi e i blocchi e i gradini dell’argine sono tutti generati da script Blender Python ed esportati in GLB. Il generatore di case traccia i lotti, sceglie le tipologie di casa, dispone i frontoni a testa di cavallo in base all’altezza e inserisce tra una casa e l’altra piccoli giardini cinti da mura; solo la casa protagonista accanto ai gradini dell’approdo è posizionata a mano. I cieli e parte delle superfici di intonaco, pietra, legno e ciottoli sono cieli fotografici e texture scansionate CC0 di Poly Haven; anche tutte le altre texture, e tutto l’audio, provengono dagli script.

L’interfaccia è solo in inglese e l’audio parte al primo clic. Dà il meglio su Chrome, Edge o Safari desktop e, dove manca WebGPU, passa a WebGL2; alla prima visita vengono scaricati poco più di 40 MB, quindi la schermata di caricamento resta visibile per qualche istante.

Come gira nel browser

La parte web è costruita sul renderer WebGPU di three.js r186 con Vite, e i modelli sono compressi con meshopt. Man mano che i modelli arrivano da Blender, i loro materiali vengono ricostruiti per nome in TSL: macchie lungo la linea dell’acqua, muschio, caustiche, invecchiamento, ondeggiamento al vento e il bagliore notturno di finestre e lanterne vengono tutti calcolati negli shader, e gli stessi materiali TSL funzionano anche con WebGL2.

La maggior parte del lavoro si è concentrata sull’acqua: riflessione, rifrazione, torbidità e assorbimento, lo scintillio del sole e della luna e la scia lunare, le increspature della pioggia, le chiazze mosse dal vento, la scia della barca e l’acqua spinta di lato dalla prua. Il cielo è un cielo fotografico di Poly Haven che sfuma da un’ora all’altra e fornisce anche la luce ambientale e la direzione del sole e della luna; le ombre delle nuvole scorrono sul borgo, sulle colline e sull’acqua, bassi banchi di nebbia si adagiano sul canale e ci sono lucciole, pulviscolo fluttuante e strisce di pioggia.

Il post-processing aggiunge SSAO (solo sulla luce ambientale), i banchi di nebbia, bloom, profondità di campo, color grading e FXAA. L’autofocus funziona come quello di una reflex digitale, lanciando un raggio dal centro dell’inquadratura (accelerato da three-mesh-bvh), oppure puoi fare clic per scegliere il punto di messa a fuoco. Per mantenere alte le prestazioni, la scena è suddivisa in layer: i dettagli fini come coppi, grate e ottoni vengono disegnati solo nella vista principale e nascosti del tutto oltre i 28 metri; il letto del canale e i ciottoli restano fuori dai riflessi; e le opere in pietra e gli alberi sono esclusi dalla pre-passata SSAO. Le ombre della luce principale vengono ridisegnate quando la luce si muove e, altrimenti, ogni cinque frame; le parti della barca vengono unite per materiale al caricamento, e per l’erba e le pietre dell’argine si usa il rendering istanziato.

Tutto l’audio è sintetizzato dal vivo con Web Audio — non c’è un solo file audio: lo sciabordio e il gocciolio (più forti vicino all’acqua), il vento tra i salici, gli uccelli di giorno, grilli e rane di notte, la campana lontana di un tempio, i colpi di remo quando vai in barca e, come musica, un rado pizzicato pentatonico.