IRO UTSUSHI

Um aplicativo que nunca pede que você dê um nome ao que está sentindo. Deixe cair cor na água, mexa com o dedo, e o movimento da sua mão fica ali, transformado em uma única imagem.

Disponível na App Store
  • Aplicativo
  • iPhone / iPad
  • Swift
  • SwiftUI
  • Metal
Baixar na App Store

O que dá para fazer

Como foi feito

Aplicativo Swift + SwiftUI, escrito como um App Package do Swift Playgrounds, sem nenhuma dependência de pacotes externos.
Água Uma simulação de fluidos escrita em Metal. O campo de velocidades, a projeção de pressão, a advecção, o reforço de vorticidade e a mistura dos pigmentos são todos processados na GPU.
Pigmento Mantido como partículas lagrangianas e sobreposto com mistura subtrativa segundo a lei de Beer–Lambert. Por serem partículas, não se borram por difusão com o passar do tempo.
Aparência Refração e reflexos especulares obtidos a partir de normais calculadas analiticamente a partir do campo de altura da água, com um ruído granulado e um dithering que evita bandas de cor.
Entrada Captada dos eventos brutos do UIKit, repassando ao fluido todos os toques agrupados (coalesced) de um mesmo quadro. Até cinco toques simultâneos são gravados, reproduzidos e medidos como traços independentes, um por dedo.
Armazenamento A lista do histórico guarda em JSON apenas informações leves; a imagem é um único PNG; a sequência de toques é um binário de largura fixa comprimido com LZFSE, em uma pasta própria para cada gravação.
Reprodução e exportação A água é reconstruída rodando novamente a simulação a partir dos passos salvos. O MP4 não é uma gravação de tela: os quadros são recompostos a partir desses passos e gravados a 30 fps.
Som Sintetizado dentro do aplicativo, em escala pentatônica e com até 16 vozes. Nenhum arquivo de áudio.
Autoverificações Como o ambiente não suporta o XCTest, um conjunto de verificações próprias (SelfChecks.swift) roda na inicialização em modo debug.
Criptografia Nenhuma; a resposta de export compliance acompanha o aplicativo.

O que é interessante por dentro

O rastro continua a girar depois que o dedo passa

A advecção tem uma correção de MacCormack, que preserva os vórtices finos que uma advecção semi-lagrangiana simples apagaria. O dedo não empurra a água: ele deixa cair um par de vórtices contrarrotativos ao longo da direção do arrasto, então a água continua girando por um tempo depois que o dedo já passou. Todos os coeficientes de amortecimento e de acompanhamento são expressos por segundo, então o movimento é o mesmo em um aparelho de 60 Hz e em um de 120 Hz.

Separar a onda que se vê da onda que move

A intensidade visível de uma onda e o efeito dela sobre o pigmento são parâmetros diferentes. E a onda move diretamente a posição do pigmento, não sua velocidade. A velocidade do pigmento é puxada de volta para a velocidade da água a cada quadro — com uma constante de tempo de cerca de 0,36 segundo nas áreas densas — e uma onda vive menos tempo do que isso; a medição mostrou que somar velocidade quase não movia o pigmento. Ajustar a aparência e ajustar a sensação deixaram de se atrapalhar.

A decisão de não deixar o pigmento atrair o pigmento

Antes havia uma força de coesão que juntava o pigmento, mas o único lugar onde ele podia se acomodar era um borrão redondo: com o tempo, a água se enchia de círculos opacos que nunca mais se desfaziam. Agora, a mancha escura de borda da aquarela é reproduzida sem mover nenhum pigmento. O campo de densidade fica como está, e a borda é desenhada a partir dele, como sombreamento sobre o caminho da superfície da água, então nada na imagem se solidifica.

A mesma gravação sempre reproduz a mesma imagem

A simulação é fixada em 60 passos por segundo, e cada gravação guarda os números reais dos passos em que a entrada do UIKit foi consumida, o número de passos de aquecimento, e um arquivo auxiliar com marcações de tempo em Float32 e coordenadas em UInt16. A reprodução confia nesses passos salvos, e não no relógio do sistema. A velocidade é medida com base em UITouch.timestamp, porque movimentos dentro de um mesmo quadro não podem ser distinguidos pelo relógio do sistema. Toques preditos são usados apenas para estimar a velocidade; eles nunca afetam onde o pigmento cai.

Além disso, o SimulationEngineRegistry encaminha explicitamente cada simulationVersion salva para o mecanismo correspondente a ela. A versão 6 está congelada até nas suas constantes, no seu relógio e na sua taxa de transferência de tinta, e uma versão futura desconhecida nunca é passada silenciosamente para a simulação mais recente. A ideia é que a imagem de uma gravação antiga não seja reconstruída como outra coisa por causa de uma atualização do aplicativo.

Não mostrar a pontuação primeiro

As quatro medidas não são cortadas em um teto: elas seguem uma curva que se aproxima assintoticamente de 100, então um movimento rápido único não dá a nota máxima. Mesmo assim, elas ficam ocultas por padrão na tela de resultado. Se um aplicativo que se recusa a classificar sentimentos em palavras começa mostrando números, esses números simplesmente viram o novo rótulo.

Privacidade e contato

O IRO UTSUSHI guarda suas gravações apenas no seu aparelho. Não há cadastro de conta, publicidade, análise de uso, nem qualquer função que rastreie usuários. Para mais detalhes, veja a Política de Privacidade do IRO UTSUSHI.

Para comentários e relatos de problemas, você também pode falar com a gente pela página de contato da Sizu dev.