Skip to content

Quatro sistemas de rig automático, doze animais, uma falha em comum: pernas retas ​

Por Oleg Sidorkin, CTO e cofundador da Cinevva

Pegue um ciclo de caminhada criado por um artista para um cervo, faça o retargeting para o mesmo cervo depois de ele passar por um sistema de rig automático, e o resultado parecerá errado de um jeito difícil de definir. Os pés aterrissam mais ou menos nos lugares certos. O timing está correto. Ainda assim, parece uma mesa andando.

Passamos algum tempo supondo que o problema estivesse no nosso código de retargeting. Não está. O rig já está errado antes de qualquer animação ser aplicada, e há um único número que demonstra isso.

O número ​

Pegue uma perna. Some os comprimentos dos segmentos de seus ossos, do quadril ao pé. Chame isso de alcance. Agora meça a distância em linha reta entre a articulação do quadril e a articulação do pé na bind pose. Chame isso de vão. Divida o alcance pelo vão.

Um animal real parado tem as pernas flexionadas, portanto a cadeia é significativamente mais longa do que a linha que ela abrange. Nos doze animais com rigs de artistas do pacote Ultimate Animated Animals da Quaternius, essa proporção varia de 1,15 a 1,50, com média de 1,30. A perna traseira de um cervo mede 1,40. A perna dianteira de uma raposa mede 1,29.

Agora vem a parte importante. Uma perna sem flexão não consegue se dobrar sem reduzir seu vão. Se as articulações estiverem em linha reta, a única maneira de flexionar o joelho é puxar o pé em direção ao quadril. Portanto, ou o pé sai do chão, ou o corpo afunda. Peça a esse rig o ângulo de joelho criado pelo artista e você terá um agachamento. Nenhum nível de retargeting corrige isso, porque a informação de que a pose precisa nunca esteve no esqueleto.

Duas cadeias de perna entre o mesmo quadril e pé, uma flexionada medindo 1,31 e outra quase reta medindo 1,04
As duas cadeias começam no mesmo quadril e terminam no mesmo pé. A flexionada é 31% mais longa do que a linha que abrange, portanto tem folga para se dobrar. A reta não tem nenhuma, e os números exibidos são a média medida dos artistas e a média do Tripo.
Animação de uma cadeia flexionada e uma cadeia reta passando pela mesma flexão, com leituras do vão

Portanto, a pergunta é específica e mensurável. O sistema posiciona as articulações intermediárias da perna onde ela consegue se dobrar?

A configuração do teste ​

Doze animais, todos CC0 e provenientes do pacote da Quaternius, cada um fornecido com um rig de artista de 38 a 51 articulações.

Os doze animais CC0 da Quaternius renderizados com seus próprios materiais, da alpaca ao lobo
Os objetos do teste, com seus próprios materiais e suas respectivas quantidades de ossos criados por artistas. Todos são fornecidos com rig, e o rig é a primeira coisa que descartamos.
Descartamos o rig e mantivemos apenas o que um usuário realmente envia: triângulos. Em seguida, entregamos isso a cada sistema e comparamos o resultado com o esqueleto criado pelo próprio artista.

Um detalhe na preparação da malha acabou sendo mais importante do que parece. Esses arquivos glTF dividem a malha em cinco primitivas por material e, como os modelos são low-poly com arestas duras, quase todos os vértices são duplicados para cada face adjacente. A raposa armazena 3.752 vértices, mas tem 926 vértices distintos. Sistemas que constroem um grafo sobre a topologia da malha interpretam essas emendas coincidentes, porém não compartilhadas, como rachaduras. Assim, a cabeça se torna um objeto separado do corpo, a distância geodésica entre eles vai ao infinito e uma articulação que deveria ficar no pescoço não tem motivo para ser posicionada ali. Nesse caso, soldar por posição não é uma otimização. É a diferença entre um animal e seis ilhas. Nove dos doze resultaram em uma única superfície fechada e estanque. O touro e a vaca mantêm os chifres como peças separadas, e o veado mantém a galhada, que deixamos de propósito, porque uploads reais são assim.

Para a avaliação, usamos duas coisas. A primeira é nossa própria função de runtime, que reduz um esqueleto arbitrário de quadrúpede a uma estrutura canônica. Ela precisa encontrar quatro pés em quatro quadrantes distintos, uma coluna e um pescoço. Se não conseguir, o rig não poderá ser controlado em runtime, independentemente de qualquer outra qualidade que tenha.

Essa função deliberadamente não lê nenhum nome de osso, e o motivo é esclarecedor. O Tripo numera suas cadeias de membros por índice, sem um significado fixo. Assim, a cadeia 0 corresponde ao par traseiro no cervo e ao par dianteiro no cavalo. Seus rótulos de esquerda e direita são inconsistentes entre os rigs: Left fica em x=-0.072 no cervo e em x=+0.076 no cavalo, ambos voltados para a mesma direção. Na raposa, ele rotula a coluna como uma cadeia de membro. Todas as suposições baseadas em nomes que testamos falharam quando medidas, então passamos a ler a geometria da bind pose, que expressa tudo isso sem ambiguidades.

A segunda coisa é a proporção de flexão descrita acima. Ambas as medidas são invariantes à escala, o que importa porque esses sistemas trabalham em escalas extremamente diferentes. O Tripo normaliza para aproximadamente um cubo unitário, então sua raposa mede 0,13 por 0,34 por 0,65, em comparação com 0,77 por 2,47 por 6,59 na versão do artista.

O que recebemos ​

sistema de rigrigscontroláveismédia de articulaçõesflexão média
artista (referência)121146.81.299
Anything World6637.81.363 (veja abaixo)
RigNet121254.11.146
SkinTokens121132.01.078
Tripo121025.81.045
Seis animais em cinco sistemas de rig, com os ossos de controle de IK do rig do artista desenhados em cinza e seus ossos de deformação em azul
Seis animais, cinco sistemas de rig. Cada célula mostra o veredito de controlabilidade em runtime e o intervalo de flexão. Na coluna do artista, os ossos azuis deformam a malha e os cinza são controles de IK, por isso essa coluna parece mais carregada do que os rigs previstos ao lado.
Gráfico de pontos da proporção média de flexão por sistema de rig em comparação com o intervalo sombreado dos artistas, de 1,15 a 1,50, com os quatro sistemas preditivos abaixo dele
A faixa sombreada é onde ficam os rigs dos artistas. Todos os sistemas preditivos ficam à esquerda dela, aquém da flexão necessária para uma perna, exceto o Anything World, que ultrapassa o intervalo pelo motivo errado.
A mesma rotação de joelho aplicada às pernas traseiras dos cervos do artista, Tripo, Anything World, SkinTokens e RigNet

Leia a linha do Anything World com cuidado, porque esse é o único número aqui que parece uma vitória, mas não é. Sua média de 1,363 está acima da média do artista e resulta inteiramente de um bug descrito mais adiante. Desconsidere o bug, e suas pernas medem de 1,02 a 1,18. Retas, como as demais.

Portanto, nenhum dos quatro alcança a flexão mínima de 1,15 dos artistas. Isso inclui o Tripo, que é o sistema oferecido no nosso próprio plano Pro. Essa é a descoberta, e ela é mais importante do que uma tabela de classificação. Quatro sistemas desenvolvidos de forma independente convergem para o mesmo erro. Todos posicionam as articulações das pernas de quadrúpedes quase em linha reta.

Isso faz sentido quando você percebe o motivo. Eles foram treinados em conjuntos de dados dominados por bípedes e por modelos em uma pose neutra de repouso. Um membro reto é a média segura. Um jarrete flexionado é uma característica específica de quadrúpedes que um prior predominantemente humanoide tem poucos motivos para aprender.

Vale observar que a linha de referência também não é perfeita. Um rig de artista, o do Shiba Inu, falha no nosso próprio teste de controlabilidade, e o motivo é esclarecedor. Esses rigs incluem uma camada de controle de IK: quatro pole targets ligados ao root e posicionados meio corpo à frente do animal, além de quatro cadeias de IK sem parent algum. Eles atendem à definição geométrica de “pé” tão bem quanto os pés reais e, no Shiba Inu, acabam prevalecendo, produzindo oito falsos candidatos entre doze.

Isso levanta uma suspeita óbvia, e vale a pena eliminá-la, porque uma camada de controle confundindo um analisador geométrico parece algo que poderia explicar muita coisa. Mas não explica. Remover os ossos de controle e executar novamente a análise altera o resultado de exatamente um dos doze rigs de artistas. O Shiba Inu passa de 2 membros quebrados para 4 membros corretos, com flexão de 1,28 a 1,43, bem ao lado do husky. Os outros onze produzem resultados idênticos, inclusive nas proporções de flexão. Portanto, a camada de IK revela um bug real na nossa detecção de pés, com correção de uma linha, mas não é ela que torna retas as pernas geradas por rig automático. A faixa dos artistas, de 1,15 a 1,50, nunca foi medida nos ossos de controle, e os rigs previstos não possuem camada de controle alguma: os esqueletos do Tripo não têm nenhuma, e as cinco articulações sem deformação do Anything World são apenas marcadores nas pontas das folhas da hierarquia.

O fato de os rigs previstos usarem apenas FK também tem um efeito inverso. Nesse único aspecto específico, um animal com rig automático é mais fácil de interpretar para um runtime que ignora nomes do que o rig criado pelo artista.

Os quatro sistemas têm modos de falha bastante diferentes ​

Tripo é o que produz as pernas mais retas, com 1,045, e usa de longe o menor número de articulações: 25,8 contra 46,8 do artista. Mas ele acerta o formato da cadeia onde os outros erram. Quatro de seus doze rigs reproduzem a divisão exata de 3/3/4/4 do artista, três articulações por perna dianteira e quatro por perna traseira, algo que nenhum outro sistema conseguiu sequer uma vez. Portanto, ele não posiciona a quantidade errada de articulações. Ele posiciona a quantidade certa quase em linha reta. É um defeito mais específico do que parece à primeira vista e sugere que reposicionar as articulações existentes dá menos trabalho do que refazer o rig. Dois de seus rigs falham completamente no teste de controlabilidade: a raposa volta com dois membros, assim como o veado.

Esqueleto de cervo, com o rig do artista ao lado da previsão do Tripo, ambos usando uma cadeia de pernas 3/3/4/4
O Tripo acerta a estrutura e erra o posicionamento. Seu cervo usa exatamente a mesma divisão de cadeia 3/3/4/4 do artista, com metade das articulações, e ainda assim mede de 1,00 a 1,05, contra 1,18 a 1,40 no artista.

RigNet (SIGGRAPH 2020) tem a melhor flexão legítima, com 1,146, e foi o único a produzir um rig controlável para todos os doze animais. O problema está nas cadeias. O artista usa 3/3/4/4 em todos os doze animais, de forma consistente na frente e atrás. O RigNet reproduz esse formato exatamente uma vez. Três de seus rigs têm uma perna com duas articulações ou menos, incapaz de se articular, e quatro têm uma perna com sete ou mais. Seu cavalo tem 2/2/8/8: duas articulações nas pernas dianteiras e oito nas traseiras. A crítica publicada ao RigNet diz que ele “produz esqueletos irregulares”, e é assim que essa irregularidade se manifesta na prática. Uma varredura de bandwidth também não resolverá o problema, porque esse parâmetro controla quantas articulações existem, não como elas são distribuídas entre os membros.

Esqueleto de cavalo, com o rig 3/3/4/4 do artista ao lado da previsão 2/2/8/8 do RigNet
O cavalo do RigNet tem 2/2/8/8: duas articulações em cada perna dianteira e oito em cada traseira. Uma perna com duas articulações não consegue se articular. O artista usa 3/3/4/4 em todos os doze animais.

Anything World é o sistema que falha de forma explícita, em vez de silenciosa. Dois dos oito animais que enviamos nem sequer receberam rig: o husky voltou com FinetuningError: Incorrect segmentation exception, e a vaca com apenas Unknown error. Os seis que receberam rig são todos controláveis. Todos usam uma cadeia 5/5/5/5 idêntica, a estrutura mais consistente produzida por qualquer sistema preditivo.

O problema está nas pernas dianteiras, e vale a pena descrever o formato com precisão, porque a média bruta favorece o serviço. As pernas traseiras são espelhadas com exatidão nos seis animais: 1,10 e 1,10; 1,11 e 1,11; 1,13 e 1,13; e assim por diante, até cinco casas decimais. As pernas dianteiras falham em três dos seis, com uma perna flexionada muito além de qualquer anatomia plausível enquanto sua correspondente permanece quase reta. A alpaca tem 3,60 na dianteira esquerda contra 1,87 na dianteira direita. O cavalo tem 2,47 contra 1,43. O cervo tem 1,43 contra 2,13 — e observe que, nesse caso, o lado extremo é o direito, portanto não se trata de um viés consistente para a esquerda.

Esqueleto da alpaca, rig do artista ao lado da previsão da Anything World, cuja amplitude de flexão chega a 3,60
A alpaca é o caso mais claro: a Anything World retorna uma cadeia uniforme de 5/5/5/5 e uma amplitude de flexão de 1,10 a 3,60 entre as quatro pernas. O par traseiro coincide exatamente. O par dianteiro, não.

Executamos novamente o cervo e o cavalo para descartar um problema no nosso próprio envio. symmetry é um campo obrigatório no upload, e a resposta armazenada nunca repete o que foi enviado. Enviados explicitamente como simétricos, ambos reproduziram a anomalia. Portanto, ela persiste apesar do parâmetro criado para evitá-la, em uma malha cujo próprio rig do artista é simétrico até a terceira casa decimal.

O SkinTokens (2025, do grupo VAST-AI por trás do Tripo) é, de longe, o mais consistente. Onze dos doze têm comprimentos de cadeia espelhados entre os lados esquerdo e direito, e nenhum tem uma perna com dois joints ou menos. É um esqueleto bem-comportado que fica reto demais, em 1,078, em vez de um esqueleto irregular.

Duas coisas sobre o SkinTokens que vale a pena registrar ​

Ele trava com entradas low-poly. Isso não está documentado em lugar nenhum. Nossa raposa com 926 vértices derruba o servidor do lado do Blender no meio da solicitação, sem nenhum traceback do Python. A mesma raposa, subdividida para 88.706 vértices, recebe um rig em 70 segundos. O modelo de exemplo deles funciona porque já era denso. Adicionar uma etapa de subdivisão para chegar a aproximadamente 40 mil vértices antes da chamada transformou uma falha total em doze rigs de doze. Se você estiver fornecendo assets de jogos, que por definição são low-poly, essa pré-condição faz toda a diferença entre funcionar e não funcionar.

A descoberta mais útil é que ele tem um modo que nunca havíamos usado. Passar --use_skeleton faz com que ele seja condicionado por um esqueleto fornecido por você, em vez de inventar um. Depois, ele preserva o que você forneceu. Cada joint de saída fica sobre um joint de entrada, com deslocamento médio de 0,31% da diagonal da caixa delimitadora e pior caso de 0,50%. Na exportação, ele renomeia todos para bone_0 em diante e remove aqueles que não carregam nenhum peso, por isso esse modo parecia inútil visto de fora.

Essa renomeação pode ser revertida. Associe os joints de saída ao esqueleto fornecido por posição, e todos os nomes são recuperados. Isso funcionou em 100% dos joints, nos quatro animais que testamos. E, como agora o esqueleto é seu, a postura também é. Nosso cavalo mede de 1,01 a 1,02 quando o SkinTokens escolhe o esqueleto, e de 1,11 a 1,36 quando recebe o do artista. O esqueleto do próprio artista fica entre 1,18 e 1,37.

Há duas pré-condições para isso funcionar. Ele rejeita de imediato um esqueleto com múltiplas raízes, e esses rigs de artista têm cinco raízes: o corpo mais quatro cadeias de IK. Nossa primeira correção foi excluir as raízes avulsas. Isso estava errado. Remover esses oito bones deixa de 90 a 128 vértices sem qualquer influência, em todos os animais do pacote, porque FF e FFB são os bones aos quais o artista vinculou os pés. Eles não são auxiliares inertes. Reparentear cada raiz avulsa para o joint corporal mais próximo preserva todos os pesos e ainda produz uma única raiz.

Nomes anônimos de bones não são o obstáculo que parecem ​

Um esqueleto previsto volta como joint_0 ou bone_0, e a conclusão habitual é que nenhum clipe pronto pode ser vinculado a ele. Para quadrúpedes, esse é um problema resolvido por qualquer uma das pontas.

Os nomes podem ser recuperados, como acima, quando você forneceu o esqueleto. Ou podem ser derivados. Uma análise geométrica já sabe quais quatro cadeias são as pernas, em qual quadrante cada uma fica e qual sequência é a coluna e qual é o pescoço. Renomear a partir disso não é uma inferência. Fizemos isso em todos os doze rigs do RigNet, escrevendo nomes em uma convenção que nosso runtime já reconhece, e então os analisamos novamente. Doze de doze retornaram idênticos tanto pelo caminho baseado em nomes quanto pelo geométrico. Mesma quantidade de membros, mesmos quadrantes, mesmos comprimentos de cadeia, mesma coluna, mesmo pescoço e mesmas proporções de flexão.

Um segundo número: o esqueleto é sequer simétrico? ​

As pernas dianteiras da Anything World motivaram uma medição que deveríamos ter feito desde o início, e ela acabou diferenciando os riggers com mais clareza do que a flexão.

Ela funciona sem ler um único nome de bone, o que importa quando metade da saída se chama bone_0. Reflita cada joint pelo plano de simetria do modelo e meça a distância entre cada reflexo e o joint real mais próximo, como porcentagem da diagonal da caixa delimitadora. Um esqueleto perfeitamente espelhado obtém zero. O plano vem da caixa delimitadora da malha, não dos joints. Permitir que um esqueleto assimétrico determine seu próprio plano faria com que ele pudesse eliminar por definição a própria assimetria.

riggererro médio de espelhamento
artista0,01%
RigNet0,08%
SkinTokens0,37%
Anything World1,08%
Tripo1,13%
Gráfico de pontos do erro de espelhamento entre esquerda e direita por rigger, de 0,01% para o artista a 1,13% para o Tripo
Medido sem ler nenhum nome de bone, portanto se aplica igualmente a um esqueleto cujos joints se chamam bone_0. As malhas de entrada são simétricas, então cada número representa o rigger discordando de si mesmo sobre onde fica cada lado.
Cinco esqueletos de cavalo girando lado a lado, o do artista ao lado de quatro rigs previstos

Os rigs do artista são espelhados com precisão até o limite do arredondamento, que é o resultado esperado e uma verificação útil de que a medição funciona. O RigNet chega muito perto, e isso não é sorte: ele simetriza explicitamente, refletindo seus joints candidatos por x=0 antes de agrupá-los. Essa escolha de projeto aparece no número.

O Tripo fica em último, embora por pouco, e o que chama atenção é sua dispersão, não sua média. Oito de seus doze rigs ficam abaixo de 0,8%, mas então a raposa chega a 15,02% e o veado, a 14,45%. Esses também são os dois que falham no critério de dirigibilidade, o que não é coincidência: um rigger cuja geometria não é espelhada não tem uma forma estável de distinguir um lado do outro, e esse é o mesmo problema por trás das dificuldades de nomenclatura mencionadas antes, nas quais seus próprios rótulos de esquerda e direita divergiam entre os rigs.

Essas porcentagens são pequenas. Uma fração de porcento é invisível quando o modelo está parado. Ela aparece assim que um ciclo de caminhada pede que as pernas esquerda e direita façam a mesma coisa com meio período de diferença.

O cervo do artista caminhando com seu esqueleto desenhado sobre o corpo translúcido

O que estamos fazendo a respeito ​

A correção deve ficar no rig, não no retargeting. Há duas opções disponíveis, e ambas são mais baratas do que treinar qualquer coisa.

Fornecer o esqueleto e deixar o modelo fazer o skinning. O SkinTokens já oferece suporte a isso e preserva o que recebe; para humanoides, nosso rigger de produção já gera um esqueleto Mixamo corretamente nomeado, que poderia ser fornecido diretamente a ele. Ou reposicionar os joints no rig existente, o que, para o Tripo, significa mover joints intermediários das pernas em uma cadeia cuja quantidade de joints já está correta.

O que não faremos é trocar um rigger de pernas retas por outro. Não há ganho nisso. No número que importa, eles variam de 1,04 a 1,15 contra 1,30 do artista, e a distância até a referência é maior do que a distância entre quaisquer dois deles.

Atualização: descobrimos uma terceira opção, e ela muda o cenário o suficiente para merecer um artigo próprio. Em vez de fazer retargeting entre esqueletos, agora resolvemos a animação no espaço próprio de cada rig a partir da superfície deformada, e o ranking de qualidade produzido por isso inverte o apresentado acima. Essa história está na parte 2: resolva a superfície, não o esqueleto.

Ressalvas, porque aqui elas importam ​

Os tamanhos das amostras são desiguais, e isso limita o significado das médias. RigNet, SkinTokens e Tripo foram executados nos doze modelos completos. A Anything World foi executada em oito, dos quais seis produziram um rig, e os dois que falharam o fizeram com erros autoexplicativos, não com um rig ruim que pudéssemos medir. Os cinco rigs originais do Tripo eram remanescentes de trabalhos anteriores de retargeting, então os outros sete foram rigados para este benchmark pelo mesmo endpoint e com as mesmas entradas. Adicioná-los alterou sua média de flexão em 0,004 e reduziu seu erro médio de espelhamento de 1,54% para 1,13%, aproximadamente o quanto uma amostra de cinco modelos o favorecia em uma direção e o penalizava na outra.

Especificamente sobre a Anything World, começamos com dois rigs e quase publicamos uma conclusão baseada neles. Ambos apresentavam a mesma anomalia nas pernas dianteiras, o que parecia comprometedor. Então, o primeiro modelo da execução mais ampla voltou correto e, de repente, parecia que nosso próprio envio era o culpado. Só com seis modelos a forma real do problema ficou visível: metade da amostra é afetada, as pernas traseiras são sempre perfeitas e o lado extremo nem sempre é o mesmo. Dois modelos teriam produzido um artigo confiante e errado. Em qualquer uma das direções.

Os checkpoints do RigNet vieram de um mirror de terceiros, não do download do próprio artigo, que exige confirmação interativa e impõe limites de requisições. Portanto, os números descrevem nosso pipeline, não resultados certificados pelos autores. Só para fazê-lo funcionar foram necessárias sete correções distintas e não documentadas. Uma delas é um prompt interativo de fuso horário que trava a compilação do contêiner sem exibir erro algum. Outra é um visualizador de depuração que abre uma janela e depois bloqueia para sempre. Também não é possível evitar essa última executando em modo headless, porque o voxelizador rasteriza por OpenGL e, portanto, o processo precisa de um display.

Por fim, a proporção de flexão pressupõe uma pose neutra em pé como bind pose. É a medida certa para estes doze animais e seria a medida errada para um rig entregue no meio de uma passada.

Os animais são CC0, da Quaternius, portanto qualquer pessoa pode repetir o teste. Se você faz rigging de quadrúpedes e mediu algo diferente, gostaríamos de saber no nosso Discord.