IRO UTSUSHI

Una aplicación que nunca te pide que pongas nombre a lo que sientes. Deja caer color sobre el agua, remuévelo con el dedo y el movimiento de tu mano se queda ahí, convertido en una sola imagen.

Disponible en App Store
  • Aplicación
  • iPhone / iPad
  • Swift
  • SwiftUI
  • Metal
Descargar en App Store

Qué puedes hacer

Cómo está hecha

Aplicación Swift + SwiftUI, escrita como App Package de Swift Playgrounds, sin ninguna dependencia de paquetes externos.
Agua Una simulación de fluidos escrita en Metal. El campo de velocidades, la proyección de presión, la advección, el refuerzo de vorticidad y la mezcla del pigmento se calculan en la GPU.
Pigmento Se mantiene como partículas lagrangianas y se superpone con mezcla sustractiva según la ley de Beer–Lambert. Al ser partículas, no se difuminan por difusión con el paso del tiempo.
Aspecto Refracción y reflejos especulares a partir de normales obtenidas analíticamente del campo de alturas del agua, más un ruido granular y un tramado que evita el bandeado.
Entrada Se toma de los eventos en bruto de UIKit y se pasan al fluido todos los toques agrupados (coalesced) de cada fotograma. Se registran, reproducen y miden hasta cinco toques simultáneos como trazos independientes, uno por dedo.
Almacenamiento La lista del historial guarda en JSON solo información ligera; la imagen es un único PNG; la secuencia de toques es binario de ancho fijo comprimido con LZFSE, en un directorio propio por grabación.
Reproducción y exportación El agua se reconstruye volviendo a ejecutar la simulación desde los pasos guardados. El MP4 no es una grabación de pantalla: los fotogramas se recomponen a partir de esos pasos y se escriben a 30 fps.
Sonido Sintetizado dentro de la aplicación, en escala pentatónica y con hasta 16 voces. No hay archivos de audio.
Autocomprobaciones Como el entorno no admite XCTest, en su lugar se ejecuta al arrancar en depuración un conjunto de comprobaciones propias (SelfChecks.swift).
Cifrado Ninguno; la respuesta sobre export compliance se incluye con la aplicación.

Lo interesante por dentro

La estela sigue girando después de que pase el dedo

La advección lleva una corrección de MacCormack, que conserva los vórtices finos que la advección semilagrangiana simple borra. El dedo no empuja el agua: deja caer un par de vórtices de rotación opuesta a lo largo de la dirección del arrastre, de modo que el agua sigue girando un rato después de que el dedo se haya ido. Todos los coeficientes de amortiguación y de seguimiento están expresados por segundo, así que el movimiento es el mismo en un dispositivo a 60 Hz y en uno a 120 Hz.

Separar la onda que se ve de la onda que mueve

La intensidad visible de una onda y su efecto sobre el pigmento son parámetros distintos. Y la onda mueve directamente la posición del pigmento, no su velocidad. La velocidad del pigmento se devuelve cada fotograma hacia la del agua —con una constante de tiempo de unos 0,36 segundos en las zonas densas— y una onda vive menos que eso, así que las mediciones mostraron que sumar velocidad apenas movía el pigmento. Ajustar el aspecto y ajustar el tacto ya no se estropean mutuamente.

Decidir que el pigmento no atraiga al pigmento

Antes existía una fuerza de cohesión que juntaba el pigmento, pero el único sitio donde podía asentarse era un grumo redondo: con el tiempo, el agua se llenaba de círculos opacos que ya no volvían a deshacerse. Ahora el borde oscuro de la acuarela se reproduce sin mover ni un poco de pigmento. El campo de densidad se queda como está y el borde se dibuja a partir de él, como sombreado sobre el trazado de la superficie del agua, así que nada de la imagen se solidifica.

La misma grabación siempre se reproduce como la misma imagen

La simulación está fijada a 60 pasos por segundo, y cada grabación guarda los números reales de paso en los que se consumió la entrada de UIKit, la cantidad de pasos de arranque y un archivo adjunto con marcas de tiempo Float32 y coordenadas UInt16. La reproducción se fía de esos pasos guardados antes que de la marca de tiempo del reloj del sistema. La velocidad se mide con UITouch.timestamp, porque los movimientos dentro de un mismo fotograma no pueden distinguirse con ese reloj. Los toques predichos se usan solo para estimar la velocidad; nunca afectan al lugar donde cae el pigmento.

Además, SimulationEngineRegistry dirige de forma explícita cada simulationVersion guardada al motor que le corresponde. La versión 6 está congelada hasta en sus constantes, su reloj y su tasa de transferencia de tinta, y una versión futura desconocida jamás se pasa en silencio a la simulación más reciente. La idea es que la imagen de una grabación antigua no se reconstruya como otra cosa al actualizar la aplicación.

No enseñar la puntuación primero

Las cuatro medidas no se recortan en un tope: se apoyan en una curva que se acerca asintóticamente a 100, así que un movimiento rápido aislado no da la nota máxima. Aun así, están ocultas de forma predeterminada en la pantalla de resultados. Si una aplicación que se niega a ordenar las emociones en palabras empieza por los números, esos números se convierten sin más en la nueva etiqueta.

Privacidad y contacto

IRO UTSUSHI guarda tus grabaciones únicamente en tu dispositivo. No tiene registro de cuenta, ni publicidad, ni analítica, ni funciones que rastreen a las personas usuarias. Para más detalles, consulta la Política de privacidad de IRO UTSUSHI.

Para comentarios y avisos de errores, también puedes escribirnos desde la página de contacto de Sizu dev.