Quando uma animação precisa tocar o mundo
Por Oleg Sidorkin, CTO e cofundador da Cinevva
Uma animação de caminhada sabe como as pernas se movem. Ela não sabe que um dos pés chegou a um degrau. Uma animação de alcance sabe como o braço se move. Ela não sabe onde está esta fechadura específica nem que alguém moveu o copo.
Este é o próximo problema depois de criar automaticamente o rig de um personagem: fazer a animação responder à cena enquanto o jogo está em execução. Implementamos uma camada experimental de correção no runtime Three.js da Cinevva. Ela lê a pose produzida pela animação, consulta a cena e ajusta as articulações do personagem antes de o quadro ser renderizado.
Os exemplos abaixo executam esse código no seu navegador. Não há nenhuma solicitação de geração de movimento no loop por quadro.
Experimente a diferença
A demonstração começa automaticamente. Escolha um exemplo e desative e ative Correções. O personagem à esquerda mostra a pose-base; o da direita recebe a correção em tempo real. Pause e arraste a linha do tempo para examinar um instante específico. Arraste em qualquer viewport para orbitar ao redor do personagem, use a rolagem ou o gesto de pinça para aplicar zoom e arraste com o botão direito para deslocar a visualização. As duas câmeras permanecem sincronizadas, para que você possa inspecionar o mesmo contato exatamente pelo mesmo ângulo.
Todos os exemplos usam o mesmo sapo com rig criado automaticamente pela Cinevva. O exemplo de caminhada reproduz Caminhada da Biblioteca Universal de Animações, redirecionada pelo mesmo código usado pelo Auto Rigger. As duas viewports reproduzem o clipe real; a da direita adiciona correções de terreno em tempo de execução. Os outros exemplos mantêm a referência de Idle incorporada e seus controladores de interação.
O controlador de caminhada planeja uma passada à frente. Ele prevê a posição do degrau móvel no momento em que o pé toca o chão, centraliza toda a sola do sapo dentro da área de pouso e conduz o próximo movimento de balanço acima das alturas futuras dos degraus. Ele preserva a cadência e o formato do balanço do clipe da biblioteca enquanto ajusta o comprimento da passada. A pelve começa a transferir o peso e a mudar de altura antes do pouso; em seguida, a IK posiciona os membros nos alvos planejados e refina o contato visível da sola.
Ative Plano de passadas para ver os contornos das solas nas posições previstas de contato com o chão e as trajetórias de balanço tracejadas. Rastro da pelve compara o movimento do corpo, e Salvar trajetória da pelve preserva as medições. No momento, esse planejador lida com os degraus móveis conhecidos da demonstração. Ele informa quando um pouso é inviável; a navegação em terrenos arbitrários e as forças físicas de equilíbrio são responsabilidades separadas do motor.
Subir uma escada transfere um membro por vez enquanto três pontos de contato permanecem apoiados nos degraus. A escada se move para baixo para manter o personagem à vista. Alvos explícitos para os tornozelos e as mãos posicionam os contatos, enquanto guias para cotovelos e joelhos mantêm as dobras afastadas da escada. O movimento do corpo e a sequência de contatos são definidos manualmente; este não é um planejador automático de escalada.
O que foi implementado
| Recurso | O que o runtime faz atualmente |
|---|---|
| Terreno irregular | Consulta um ponto de apoio para cada pé, alinha a normal calibrada da sola e ajusta a altura da pelve. |
| Pés apoiados | Mantém o contato de apoio em relação à superfície que o sustenta. |
| Plataformas móveis | Move esse contato junto com um suporte em translação ou rotação. |
| Alvos para as mãos | Resolve a posição de um braço em direção a uma posição e orientação no espaço global, com um peso de mesclagem. |
| Objetos segurados | Calcula o alvo do pulso a partir da pose desejada do objeto e de uma transformação fixa da pegada. |
| Alcance impossível | Limita a resolução e informa que o personagem precisa ser reposicionado. |
Este é um protótipo de runtime opcional. Os exemplos interativos demonstram a implementação; eles não significam que todos os jogos gerados pela Cinevva a ativem automaticamente.
Um pé apoiado precisa de um sistema de referência
Nosso redirecionador existente já corrige parte do deslizamento dos pés ao transferir um clipe entre personagens com proporções diferentes. O ajuste ao solo em tempo de execução tem outra entrada: a superfície sobre a qual o personagem está naquele momento.
Quando um pé entra na fase de apoio, a nova camada registra seu ponto de contato nas coordenadas locais do objeto que o sustenta. Em um piso estático, o pé permanece no lugar enquanto o corpo se move. Em uma plataforma móvel, o mesmo ponto armazenado acompanha a plataforma. Ancorá-lo apenas em coordenadas globais deixaria o pé para trás.
A pelve então se move dentro de uma faixa de altura limitada que ambas as pernas conseguem alcançar, e cada perna é resolvida em direção ao seu alvo para o pé. Um teste inicial detectou uma falha sutil: suavizar o movimento da pelve ao atravessar um limite de alcance fazia o pé flutuar brevemente sobre uma inclinação. Agora, a suavização permanece dentro da faixa viável.
O sapo revelou outro erro de calibração: tocar o ponto mais baixo do dedo do pé não significa que a sola está apoiada. Agora, sua demonstração ajusta um plano de apoio a cada malha do pé em sua pose, calibrando tanto a posição quanto a normal. A regressão renderizada mede três contatos separados da sola, além do ponto mais baixo da superfície, durante toda a animação Idle.
A verificação compartilhada de sustentação do corpo estima o centro de massa com base em segmentos corporais ponderados e inclui cargas ilustrativas de objetos carregados. Os exemplos de postura e alcance a utilizam para orientar a pelve em direção aos pés que sustentam a carga. Durante a caminhada, o planejador de passadas controla a transferência antecipada de peso; uma correção estática de centralização sobre a base de apoio não deve se opor ao movimento planejado. Os diagnósticos ainda exibem o COM estimado e os contatos de apoio. A caminhada informa Transferência de peso planejada, e a escada informa que as forças de aderência ainda não foram verificadas.
A caminhada ainda precisa de temporização. O jogo fornece um peso para cada pé: o quanto ele deve ser tratado como apoiado naquele instante. Um pé em balanço precisa ser liberado. O jogo também fornece a marcha, o movimento do personagem e a distância livre sobre o próximo degrau. Essas decisões não são inferidas pelo resolvedor de IK.
Coloque a chave na fechadura e depois resolva a posição da mão
Apontar o pulso para uma fechadura não é suficiente. A chave tem comprimento, eixo de inserção e deslocamento da pegada. Sua ponta pode errar o alvo mesmo quando o pulso alcança perfeitamente sua posição.
Na demonstração, a sequência de interação define a posição e a rotação desejadas da chave. A pegada indica onde o pulso precisa estar para posicionar a chave ali. Em seguida, o braço é resolvido em direção a essa pose do pulso. A chave real permanece presa à mão resolvida, inclusive quando a posição solicitada está fora de alcance.
O exemplo Alvo fora de alcance demonstra essa falha deliberadamente. O membro não se estica para fazer a métrica parecer bem-sucedida; o runtime informa que o personagem precisa ser reposicionado.
Esse exemplo tem fases definidas manualmente de aproximação, inserção e giro. Ele ainda não planeja a pegada dos dedos nem verifica o formato da chave em relação ao espaço interno da fechadura.
Despejar também é um problema de orientação
O exemplo de despejo mantém o bico do recipiente sobre o copo enquanto inclina o recipiente ao redor dele. Conforme o recipiente gira, a posição necessária do pulso muda. O mesmo mecanismo de alvo para a mão acompanha essa pose variável.
O fluxo azul é um efeito visual ativado durante a inclinação. Não é uma simulação de fluidos. Sua finalidade aqui é tornar o alinhamento visível: sem correção, ele não acerta o copo; com correção, cai dentro da área receptora.
Onde a correção é executada
A sequência em um jogo é:
Mover o personagem → avaliar a animação → aplicar deslocamentos à pose → resolver os contatos com a cena → atualizar o movimento secundário → renderizar.
O runtime expõe isso por meio de createAnimator, com uma configuração opcional sceneIK. Os jogos passam pesos de contato, alvos para as mãos e o estado de apoio no solo para update. Ele também pode encapsular um mixer de animação existente do Three.js.
Cada rig precisa de uma calibração adequada para os pés e as pegadas. O mapeamento dos nomes dos ossos nos leva ao membro correto, mas uma articulação do tornozelo não é a sola de um calçado. Esta versão usa um ponto de apoio calibrado por pé; ela ainda não modela toda a área de apoio do calcanhar e dos dedos.
As técnicas subjacentes têm equivalentes consolidados na IK de dois ossos da Unity e nos resolvedores de IK da Unreal. Nossa implementação é uma pequena camada de correção no lado do motor, criada em torno das necessidades dos nossos personagens com rig automático.
O que verificamos — e o que ainda falta
A primeira etapa de verificação incluiu 14 testes numéricos e de integração, além de oito cenários renderizados, amostrados ao longo de 3.840 quadros. Verificamos suportes móveis, contato em inclinações, trilhas de animação constantes, transformações de coordenadas, limites de alcance e a integração do animador no runtime. A automação do navegador também comparou o canvas com as correções ativadas e desativadas e testou o layout estreito.
As medições verificam o erro entre os membros e seus alvos. Elas não comprovam que todas as partes da malha deformada pelo esqueleto estejam livres de colisões nem que o resultado pareça natural em todos os personagens. Os exemplos são intencionalmente pequenos o bastante para serem inspecionados em conjunto com esses números.
As próximas camadas são o planejamento de passadas, melhor apoio da sola, alcance de corpo inteiro, pegada com os dedos e fases de interação cientes de colisões. Líquidos simulados fisicamente constituem outro sistema separado.
Por enquanto, o resultado útil é concreto: uma animação pode manter seu movimento subjacente enquanto os pés e as mãos respondem à cena a cada quadro. Isso oferece a um personagem com rig criado automaticamente um ponto de partida para interagir com o mundo ao seu redor.