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 StoreO que dá para fazer
- Deixar cair cor e mexer … Deixe cair na água até cinco cores escolhidas de uma paleta de seis e misture-as com o dedo até virarem uma única imagem. As duas paletas, “cores calmas” e “cores vivas”, podem ser trocadas mesmo depois de você ter soltado a cor.
- Sem palavras, sem categorias … Não há uma lista de humores para escolher, nem um rótulo para adicionar depois. O que resta é só o rastro da cor e do movimento do dedo.
- Até 60 segundos por gravação … O fim que se aproxima é avisado por ondulações, um brilho e um som. Nunca por vibração para apressar você.
- Quatro medidas do movimento … Velocidade (a mediana da velocidade instantânea), amplitude (distância média em relação ao centro de gravidade), variação (com que frequência você muda de direção, mais a dispersão da velocidade) e dinâmica. Elas ficam ocultas por padrão na tela de resultado: um aplicativo que se recusa a classificar não deveria começar mostrando uma pontuação.
- Reproduzir depois … A água é reconstruída a partir da sequência de toques salva e reproduzida em 1× ou 2×, com avanço e retrocesso. O trajeto do seu dedo e os pontos tocados podem ser desenhados sobre a água.
- Exportar e compartilhar … Exporte em MP4 a 30 fps com som, ou em PNG. O histórico é folheado com um deslizar para cima e para baixo, e é possível excluir várias gravações de uma vez.
- O som é criado dentro do aplicativo … O ponto tocado vira uma nota de uma escala pentatônica; a rapidez do movimento vira volume e o brilho dos harmônicos. São cinco timbres: teclado suave, kalimba, harpa, pad de cordas e harmônica de vidro.
- Acessibilidade e dez idiomas … Pensado principalmente para pessoas com baixa visão, com suporte a Texto Dinâmico, VoiceOver, “Aumentar contraste”, “Reduzir transparência” e “Reduzir movimento”. Disponível em japonês, inglês, espanhol, francês, coreano, chinês tradicional, português do Brasil, alemão, italiano e vietnamita.
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.