O rato ainda não pisca
Por Oleg Sidorkin, CTO e cofundador da Cinevva
Trabalhamos muito nas ferramentas que dão vida aos seus modelos na Cinevva: criando rigs, aplicando animações e corrigindo os detalhes estranhos que aparecem quando eles começam a se mover. Esse trabalho nos levou a enfrentar pernas que não dobram, transferência de animação e caudas sem ossos para movimentá-las.
Agora quero dar emoção a esses personagens. Um personagem deve conseguir parecer surpreso, irritado ou satisfeito, além de atravessar uma cena. Isso significa fazer o rosto se mover: pálpebras, sobrancelhas, bochechas e uma boca capaz de fazer mais do que permanecer em sua pose de repouso.
Começamos a analisar pesquisas recentes sobre rigging facial para descobrir até onde conseguimos ir, partindo de uma malha existente, até chegar a expressões utilizáveis. Este é o primeiro relato desse trabalho: o que conseguimos executar de fato, como preparamos o personagem e o que aconteceu quando fizemos o teste.
Nosso objeto de teste foi o rato usado no trabalho com a cauda. Ele já tinha um rig corporal e seis clipes de animação. Conseguia andar, pular e correr, mas seu rosto permanecia imóvel em todos eles.
Testamos o NFR, uma implementação de pesquisa que transfere expressões para uma malha facial fornecida. O primeiro resultado foi uma prancha de poses rotuladas como abertura da mandíbula, sorriso, piscada, lábios contraídos e sobrancelhas levantadas. Não consegui enxergar muita animação útil nela. A mandíbula havia deformado o focinho; a maioria das outras imagens parecia praticamente igual.
Havia um problema de preparação que valia a pena corrigir antes de avaliar o resultado. Tínhamos removido boa parte das bordas dos olhos do rato ao preparar a malha de entrada. Então refizemos o recorte, executamos o processo novamente e renderizamos as duas tentativas em movimento. Aqui estão elas.
O que foi usado como entrada no NFR
O personagem completo tem 22.744 vértices exportados e 30 articulações, mas não possui blendshapes faciais nem ossos dedicados à mandíbula e aos olhos. Precisávamos adicionar os controles faciais sem interferir no rig existente.
Os requisitos de entrada do NFR explicam por que não podíamos simplesmente fornecer o GLB. Ele espera uma superfície facial com os olhos e a boca recortados e abertos, sem estruturas internas nem globos oculares, e com a malha aproximadamente alinhada aos exemplos. Removemos a parte de trás da cabeça, as orelhas e o pescoço, criamos as aberturas e mantivemos o maior componente conectado. Restaram 777 vértices e 1.296 triângulos.
Cada vértice desse recorte ainda correspondia a uma posição no personagem original. Após a inferência, subtraímos a face neutra prevista de cada expressão prevista, convertemos os deslocamentos de volta para a escala do rato e os aplicamos aos vértices originais correspondentes. O movimento diminuía gradualmente perto da borda do recorte para não parar de forma abrupta no ponto em que o rosto encontrava o restante da cabeça.
Isso nos deu nove blendshapes: deslocamentos de vértices armazenados que um controle deslizante pode combinar com a malha neutra. Definir todos os controles como zero restaurava o rato original. Mantivemos seu esqueleto, suas texturas e os seis clipes corporais, e então adicionamos um clipe de teste separado para cada expressão.
A inferência levou cerca de sete segundos em uma T4, depois que o checkpoint e a entrada foram carregados. Conseguir uma expressão utilizável levaria mais tempo.
Havíamos cortado justamente as partes de que precisávamos
Nossos primeiros recortes dos olhos eram elipses largas. Nesse rosto, eles removeram boa parte da borda ao redor de cada olho. O recorte da boca ficou abaixo da linha visível dos lábios. Nenhum dos erros era óbvio pelos números que descreviam a malha: ela tinha coordenadas finitas, nenhum triângulo degenerado e nenhuma aresta não manifold.
Ao observar o recorte, porém, o problema fica bastante claro. Estávamos pedindo movimento das pálpebras depois de descartar boa parte da superfície que poderia produzi-lo.
Para a segunda tentativa, renderizamos a cabeça de frente e em dois ângulos oblíquos. Usei a compreensão de imagens do assistente para ajudar a marcar as aberturas e as bordas dos olhos, a linha da boca, o focinho, o nariz, as sobrancelhas e os bigodes. Esses contornos foram projetados sobre os triângulos visíveis da malha original. Manter a projeção e os IDs dos triângulos nos permitiu verificar quais partes reais do rosto sobreviveram a cada recorte.

Marcamos 131 triângulos visíveis como pertencentes às bordas dos dois olhos. O primeiro recorte havia mantido apenas 25 deles. O novo manteve 123. Essa é uma melhoria útil na entrada, embora meça a retenção em relação às nossas próprias anotações, e não à precisão de uma segmentação independente.
Também mudamos o alinhamento. Em vez de corresponder à extensão da referência anterior, usamos pontos de referência faciais correspondentes para definir uma escala uniforme e a posição. O novo recorte tinha 586 vértices e 952 triângulos. Ele ainda apresentava lacunas e bordas abertas; essa etapa selecionou a geometria existente em vez de criar novas pálpebras ou o interior da boca.
Mais movimento, mais estiramento
A segunda execução usou os mesmos pesos e os mesmos nove controles de expressão. Desta vez, eu queria ver o movimento completo, então renderizamos intensidades intermediárias entre a pose neutra e cada expressão completa e depois retornamos à pose neutra. O vídeo no início mostra as duas versões sob iluminação idêntica.
Os olhos continuam abertos. O controle da mandíbula altera o focinho sem produzir uma abertura convincente da boca. Alguns controles da boca geram mais movimento do que antes, especialmente o formato de funil, mas também distorcem a superfície.
Verificamos os comprimentos das arestas para quantificar essa distorção. Para cada aresta da malha do personagem, dividimos seu comprimento na expressão completa pelo comprimento na pose neutra e contamos aquelas que mais do que dobraram de tamanho.
| Controle | Primeiro recorte: arestas acima de 2× | Recorte revisado: arestas acima de 2× | Pior estiramento revisado |
|---|---|---|---|
| Abertura da mandíbula | 13 | 44 | 5,27× |
| Sorriso à esquerda | 0 | 30 | 5,53× |
| Boca em funil | 0 | 89 | 11,29× |
Uma aresta curta pode gerar uma proporção grande, então eu não usaria apenas essa medida para avaliar um rig facial. Neste caso, ela está de acordo com o que as renderizações mostram. A boca revisada se move mais, e parte desse movimento é um estiramento que não queremos.
Alteramos três coisas ao mesmo tempo: o recorte, o alinhamento e a atenuação na borda externa. Essa comparação não consegue nos dizer qual mudança causou cada artefato. Ela mostra que a preparação revisada, como um todo, não resolveu o rosto desse personagem.
Por que usamos o NFR
Analisamos outras implementações antes de executar este experimento. O GNM Head, do Google, foi carregado e produziu expressões em sua própria malha de cabeça humana. Aplicar essas expressões ao nosso rato exigiria uma etapa separada de ajuste e transferência. O Example-Based Facial Rigging precisava de exemplos correspondentes de expressões que nosso personagem não tinha.
O RigAnyFace e o OmniFaceRig também eram relevantes, mas, em 11 de setembro de 2026, ainda não havíamos encontrado código público de inferência e pesos que pudéssemos executar para nenhum dos dois. O link do conjunto de dados do OmniFaceRig ainda dizia “Em breve”. O NFR tinha um checkpoint publicado e um caminho para usar malhas personalizadas, então foi ele que levamos até um rato animado.
Essas não foram cinco execuções comparáveis. Testamos o NFR em nossa superfície facial, verificamos o GNM em sua cabeça nativa e paramos diante das limitações de entrada ou disponibilidade dos demais.
A próxima tentativa precisa de uma pálpebra
O recorte era ruim, e valeu a pena corrigi-lo. Mas preservar a borda do olho não fornece geometria suficiente nem o movimento adequado para cobrir o olho. A boca tem um problema semelhante: conseguimos puxar o focinho, mas este experimento não criou a abertura e o interior de que a pose precisa.
Em seguida, eu trabalharia em uma piscada e em uma abertura da mandíbula. Daria à pálpebra uma forma capaz de se fechar sobre o olho, prepararia os lábios e o interior da boca e então ajustaria ou criaria manualmente as formas corretivas para esses dois movimentos. Também faria a verificação pela lateral, além da frente, antes de adicionar os demais controles.
Mantivemos as duas tentativas, incluindo as previsões brutas e os recortes exatos, para podermos comparar esse trabalho com o resultado atual. Por enquanto, o rig corporal e suas animações permanecem intactos. As formas faciais continuam sendo um experimento; eu não as usaria em um personagem finalizado.