Resolva a superfície, não o esqueleto
Por Oleg Sidorkin, CTO e cofundador da Cinevva
A Parte 1 comparou quatro ferramentas de rigging automático com rigs de artistas em doze animais CC0 e encontrou uma falha em comum: todas elas criam quadrúpedes com pernas quase retas. Ela terminou com um plano para corrigir os rigs, porque uma perna sem dobra não consegue reproduzir o ângulo de joelho definido pelo artista, por melhor que seja o redirecionamento.
Então, enquanto discutíamos os resultados, surgiu uma pergunta mais simples. Por que estamos transferindo animações entre esqueletos?
Um esqueleto é uma máquina para deformar uma superfície. A superfície é o que o jogador vê, e o clipe do artista já nos diz exatamente onde essa superfície deve estar, vértice por vértice, em cada quadro. Portanto, podemos ignorar completamente o mapeamento entre esqueletos. Basta reproduzir o clipe do artista uma vez, registrar a malha deformada e então resolver as transformações do esqueleto gerado automaticamente para que o skinning dele reproduza essa superfície da forma mais fiel possível. O resultado é um clipe que existe nativamente no espaço do novo rig. Para nós, tanto faz se os ossos se chamam bone_0.

Essa não é uma ideia nova na literatura. É a parte de transformação da decomposição de skinning, o SSDR de Le e Deng, de 2012, e é assim que os solvers de captura de movimento ajustam rigs arbitrários a marcadores densos. Nosso caso é o mais fácil: a ferramenta de rigging já forneceu o esqueleto e os pesos, então as únicas incógnitas são as transformações dos ossos em cada quadro.
O método e o controle que mantém tudo honesto
Em cada quadro, buscamos uma transformação por osso que minimize a distância entre a superfície com skinning do rig e a superfície-alvo. Com pesos fixos, a melhor transformação de cada osso tem uma solução em forma fechada: um ajuste rígido ponderado pelo método dos quatérnios de Horn. O skinning linear combinado acopla os ossos por meio de vértices compartilhados, então percorremos os ossos em sequência, com cada resolução levando em conta a contribuição atual de todos os outros ossos, até que o resíduo pare de mudar. Cada quadro começa com o resultado do anterior.
Tudo é executado no espaço de bind, onde a identidade do skinning se mantém exatamente, independentemente das convenções usadas na exportação do arquivo. A correspondência entre a malha do artista e a malha ressoldada ou subdividida pela ferramenta de rigging usa o vizinho mais próximo nas poses de repouso alinhadas, o que é exato neste caso porque ambas representam o mesmo animal.
A regra de projeto mais importante foi esta: uma execução de controle cujo resultado precisa ser zero. Resolvemos o rig do artista contra o próprio clipe, caso em que uma resposta perfeita existe por construção. Se o solver não conseguir encontrá-la, nenhum outro resultado produzido por ele terá valor. O controle chega a 0,008% da diagonal do modelo, com o pior vértice isolado em 0,08%. Esse é o piso usado para medir todo o restante.
Chegar a um zero confiável exigiu três tentativas
A primeira execução de controle estabilizou em 3% e se recusou a avançar mesmo com trinta vezes mais iterações. Vale registrar o motivo, porque cada causa era invisível externamente.
A principal era uma armadilha da API. Versões mais recentes do three.js renomearam boneTransform para applyBoneTransform e mudaram silenciosamente seu comportamento: a nova função recebe a posição de entrada do vetor fornecido e nunca lê a geometria. Quando recebe um vetor temporário reutilizado, ela calcula cada vértice a partir da saída do vértice anterior. Os alvos resultantes eram um lixo suavemente plausível e, durante uma hora constrangedora, sustentaram uma teoria detalhada sobre a escala da armature que se encaixava perfeitamente nos números e era pura ficção. O ponto de entrada correto é getVertexPosition. O controle detectou o problema, o que resume todo o argumento a favor de ter um.
As outras duas causas eram menores. A iteração de potência na matriz de Horn trava em cerca de um milésimo de grau porque o deslocamento espectral que permite sua convergência também reduz a diferença ao longo da qual ela converge. Por isso, mudamos para rotações de Jacobi, que são exatas para uma matriz 4x4. Além disso, um teste de saída antecipada baseado no progresso relativo interrompia as passagens enquanto elas ainda estavam reduzindo o erro; agora, a saída mede o progresso absoluto em relação à escala do modelo.
O que cada ferramenta de rigging realmente consegue reproduzir
Com o solver validado, resolvemos dois clipes de artista, Walk e Gallop, em cada rig dos seis animais cobertos por todas as ferramentas de rigging. A pontuação é a parcela do deslocamento da superfície em movimento que o rig consegue reproduzir. Em nossas conversas, ela já ganhou um nome: qualidade de transferência.

| rig | Walk | Gallop |
|---|---|---|
| artista (controle) | 99,8% | 99,9% |
| Anything World | 94,4% | 91,9% |
| Tripo | 92,3% | 89,1% |
| SkinTokens, com o esqueleto do artista | 82,5% | 89,4% |
| SkinTokens | 80,9% | 88,0% |
| RigNet | 48,5% | 58,3% |
Agora compare isso com a parte 1, porque a classificação se inverte.
O RigNet apresentou a melhor dobra das pernas entre os quatro e foi a única ferramenta cujos esqueletos passaram pelo nosso critério de controlabilidade nos doze animais. Aqui, ele perde metade do movimento de caminhada. Seus piores vértices ficam de 20% a 31% do tamanho do modelo distantes de onde a superfície deveria estar, e a falha é consistente nos seis animais: qualidade de 38% a 59% em todos eles. Enquanto isso, o Tripo e o Anything World, os dois rigs com as pernas mais retas que medimos, são os que melhor reproduzem a animação.
A conciliação é simples depois de enunciada. Um clipe resolvido pode transladar as articulações, e não apenas girá-las, e faixas de translação por articulação são dados de animação perfeitamente válidos e comuns. Com a translação disponível, uma cadeia reta ainda consegue acompanhar uma superfície que se dobra, então a dobra deixa de ser a restrição determinante. O que passa a limitar o resultado é se os pesos de skinning dividem a malha em partes que acompanham os ossos de maneira limpa. Os pesos das ferramentas comerciais são bons. Os pesos do RigNet, distribuídos por suas cadeias irregulares, não conseguem acompanhar a superfície, independentemente de onde o solver mova os ossos.
Portanto, as duas medições respondem a perguntas diferentes. A proporção de dobra determina as poses que um rig de runtime orientado por rotações consegue assumir, que é o contexto da parte 1. A qualidade de transferência determina quanto um clipe resolvido e pré-calculado consegue expressar, que é o contexto desta parte. No pipeline de clipes resolvidos, a ferramenta de rigging que já usamos em produção gera um rig de 92%, em vez de ficar em último lugar.
Há mais um resultado escondido nessa tabela: fornecer ao SkinTokens o próprio esqueleto do artista praticamente não altera sua pontuação. O limite dele está nos pesos, não no posicionamento das articulações.
Ver para crer
Primeiro os números, depois os olhos. O mesmo solver alimenta um visualizador ao vivo no qual a malha completa de cada rig recebe skinning por suas transformações resolvidas, é desenhada sobre a superfície de referência do artista como uma silhueta escura e tem cada vértice colorido de acordo com seu erro momentâneo. Azul é zero. Vermelho representa 3% ou mais da diagonal do modelo.
A imagem e a tabela não podem divergir, porque o visualizador renderiza com exatamente a mesma função medida pela métrica. Um painel exige uma ressalva: o cervo do SkinTokens não exibe mapa de calor. Sua malha tem 181.000 vértices, e ignoramos a correspondência da malha completa acima de 60.000; portanto, esse painel se sustenta apenas pela silhueta.
O que isso muda para nós
Uma resolução leva de meio segundo a alguns segundos por clipe e por rig, em JavaScript no navegador, sem envolver GPU. É barato o suficiente para pré-calcular todo o conjunto de clipes de um quadrúpede no momento em que o rig é criado. Os clipes pré-calculados também simplificam o runtime: nenhum redirecionamento de esqueleto para animais, apenas a reprodução do clipe no espaço próprio do rig, com nosso sistema existente de travamento dos pés aplicado por cima para manter o contato com o chão.
Isso também nos dá um segundo critério de aceitação. As verificações geométricas da parte 1 indicam se um rig é controlável. A qualidade de transferência indica quanto de uma animação real ele preservará. Uma ferramenta de rigging pode passar no primeiro critério e falhar no segundo, e é exatamente isso que acontece com o RigNet.
Limitações, sem rodeios
A pontuação representa o teto de cada rig, não uma promessa. O solver pode transladar articulações, então o comprimento dos ossos não é preservado durante o movimento, e um rig que dependa muito da translação pode parecer elástico em poses extremas. Os piores vértices do galope, que chegam momentaneamente a 9%–20% até mesmo nos bons rigs, aparecem justamente nesses momentos. Uma variante da resolução restrita a rotações quantificaria isso com honestidade, e esse é o número que ainda devemos: ele mostraria quanto da penalidade das pernas retas da parte 1 permanece quando a translação não está disponível.
A lacuna para produção é a correspondência. Neste benchmark, a ferramenta aplicou o rig à mesma malha animada pelo artista, então a correspondência de vértices é trivial. O animal enviado por um usuário é uma malha diferente, e primeiro transferir para ela o movimento da superfície do artista é um problema à parte, com abordagens conhecidas que ainda não medimos.
E há a amostra: seis animais, dois clipes, 24 quadros por clipe e restrições subamostradas para cinco mil vértices na malha mais densa. É o suficiente para classificar as ferramentas com confiança, mas não para citar uma segunda casa decimal.
Os animais são modelos CC0 de Quaternius, o método combina um ajuste em forma fechada de quarenta anos atrás com paciência, e a execução de controle é a parte que recomendamos criar primeiro a qualquer pessoa que tente reproduzir isto. Se você já resolveu animações em rigs e encontrou as mesmas armadilhas que nós, ou outras diferentes, gostaríamos de comparar experiências em nosso Discord.