IRO UTSUSHI

Un’app che non ti chiede mai di dare un nome a ciò che provi. Lascia cadere il colore sull’acqua, mescolalo con il dito, e il movimento della tua mano resta lì, diventato un’immagine.

Disponibile sull’App Store
  • App
  • iPhone / iPad
  • Swift
  • SwiftUI
  • Metal
Scarica sull’App Store

Cosa puoi fare

Com’è fatta

App Swift + SwiftUI, scritta come App Package di Swift Playgrounds, senza alcuna dipendenza da pacchetti esterni.
Acqua Una simulazione di fluidi scritta in Metal. Campo di velocità, proiezione della pressione, avvezione, rinforzo della vorticità e miscelazione dei pigmenti girano tutti sulla GPU.
Pigmento Mantenuto come particelle lagrangiane e sovrapposto con miscelazione sottrattiva secondo la legge di Beer–Lambert. Essendo particelle, non si sfumano per diffusione col passare del tempo.
Resa visiva Rifrazione e riflessi speculari ricavati da normali calcolate analiticamente dal campo di altezza dell’acqua, con un rumore granuloso e un dithering che evita le bande di colore.
Input Preso dagli eventi grezzi di UIKit, passando al fluido tutti i tocchi raggruppati (coalesced) di un fotogramma. Fino a cinque tocchi simultanei vengono registrati, riprodotti e misurati come tratti indipendenti, uno per dito.
Archiviazione L’elenco della cronologia conserva in JSON solo informazioni leggere; l’immagine è un unico PNG; la sequenza di tocchi è un binario a larghezza fissa compresso con LZFSE, in una cartella propria per ogni registrazione.
Riproduzione ed esportazione L’acqua viene ricostruita rieseguendo la simulazione dai passi salvati. L’MP4 non è una registrazione dello schermo: i fotogrammi vengono ricomposti a partire da quei passi e scritti a 30 fps.
Audio Sintetizzato dentro l’app, su scala pentatonica e fino a 16 voci. Nessun file audio.
Autoverifiche Poiché l’ambiente non può ospitare XCTest, al suo posto viene eseguito all’avvio in debug un insieme di controlli scritti appositamente (SelfChecks.swift).
Crittografia Nessuna; la risposta di export compliance è inclusa con l’app.

Le parti tecnicamente interessanti

La scia continua ad arricciarsi dopo il passaggio del dito

L’avvezione porta una correzione MacCormack, che preserva i vortici sottili che un’avvezione semi-lagrangiana semplice cancellerebbe. Il dito non spinge l’acqua: lascia cadere una coppia di vortici controrotanti lungo la direzione del trascinamento, così l’acqua continua ad arricciarsi per un po’ dopo che il dito è passato. Tutti i coefficienti di smorzamento e di inseguimento sono espressi al secondo, quindi il movimento è identico su un dispositivo a 60 Hz e su uno a 120 Hz.

Separare l’onda che si vede dall’onda che sposta

L’intensità visibile di un’onda e il suo effetto sul pigmento sono parametri distinti. E l’onda sposta direttamente la posizione del pigmento, non la sua velocità. La velocità del pigmento viene riportata ogni fotogramma verso quella dell’acqua — con una costante di tempo di circa 0,36 secondi nelle zone dense — e un’onda vive meno di così: la misurazione ha mostrato che sommare velocità spostava a malapena il pigmento. Regolare l’aspetto e regolare la sensazione hanno smesso di rovinarsi a vicenda.

La scelta di non far attrarre il pigmento a sé stesso

In passato esisteva una forza di coesione che raccoglieva il pigmento, ma l’unico stato in cui poteva depositarsi era una macchia rotonda: col tempo l’acqua si riempiva di cerchi opachi che non si scioglievano mai più. Ora il bordo scuro dell’acquerello viene riprodotto senza spostare alcun pigmento. Il campo di densità resta com’è, e il bordo viene disegnato a partire da esso, come un’ombreggiatura sul percorso della superficie dell’acqua, così nulla nell’immagine si solidifica.

La stessa registrazione dà sempre la stessa immagine

La simulazione è fissata a 60 passi al secondo, e ogni registrazione salva i numeri di passo effettivi in cui l’input di UIKit è stato consumato, il numero di passi di avvio, e un file collaterale con timestamp Float32 e coordinate UInt16. La riproduzione si fida di questi passi salvati più che dell’orologio di sistema. La velocità è misurata in base a UITouch.timestamp, perché i movimenti all’interno dello stesso fotogramma non si possono distinguere con l’orologio di sistema. I tocchi previsti servono solo a stimare la velocità; non influenzano mai dove cade il pigmento.

Inoltre, SimulationEngineRegistry instrada esplicitamente ogni simulationVersion salvata verso il motore che le corrisponde. La versione 6 è congelata fino alle sue costanti, al suo orologio e al suo tasso di trasferimento dell’inchiostro, e una versione futura sconosciuta non viene mai passata silenziosamente alla simulazione più recente. L’idea è che l’immagine di una vecchia registrazione non venga ricostruita in qualcos’altro a causa di un aggiornamento dell’app.

Non mostrare subito il punteggio

Le quattro misure non vengono troncate a un tetto: seguono una curva che si avvicina asintoticamente a 100, quindi un solo movimento rapido non dà il punteggio massimo. Anche così, restano nascoste per impostazione predefinita nella schermata dei risultati. Se un’app che si rifiuta di ordinare le emozioni in parole comincia mostrando numeri, quei numeri diventano semplicemente la nuova etichetta.

Privacy e contatti

IRO UTSUSHI conserva le tue registrazioni solo sul tuo dispositivo. Non prevede registrazione di un account, pubblicità, analisi di utilizzo, né alcuna funzione che tracci gli utenti. Per i dettagli, vedi l’Informativa sulla privacy di IRO UTSUSHI.

Per commenti e segnalazioni di problemi, puoi anche scriverci tramite la pagina di contatto di Sizu dev.