Skip to content

O cabelo deve balançar, não virar um tentáculo ​

Por Oleg Sidorkin, CTO e cofundador da Cinevva

Comparação lado a lado do cabelo em camadas da garota, com o movimento anterior à esquerda e o movimento aprimorado à direita.

Uma personagem vira a cabeça. O cabelo deve acompanhá-la um instante depois, balançar um pouco e então se acomodar. Nossa primeira versão fazia outra coisa: as pontas se enrolavam para baixo, como se o penteado estivesse tentando virar um tentáculo.

Os ossos mantinham seus comprimentos. A simulação permanecia estável. Os números que acompanhávamos estavam dentro dos limites. Mesmo assim, o movimento ainda parecia errado.

Este é o próximo passo do nosso rig automático: dar ao cabelo suas próprias articulações e movimento secundário. Começamos com uma malha de teste simples e depois passamos para dois avatares reais. Isso mudou tanto a implementação quanto o que medimos.

Primeiro, reconstruir um rabo de cavalo real ​

Seed-san tem uma malha separada para o rabo de cavalo. Para este teste, apagamos os pesos de skinning originais dessa malha, prendemos o cabelo à cabeça e pedimos ao nosso ajustador geométrico que criasse uma nova cadeia de cabelo com seis articulações. O restante da personagem manteve o skinning original. As sete cadeias curtas da franja também mantiveram os pesos criados pelo artista.

O ajustador percorre a superfície conectada do cabelo para fora, partindo da raiz, posiciona articulações ao longo desse trajeto e combina as influências das articulações próximas. Uma pequena faixa junto à fixação permanece presa. Este é um fluxo de trabalho baseado em mechas selecionadas: indicamos qual malha é o cabelo. Ele não detecta cada fio em uma personagem arbitrária.

Experimente o rabo de cavalo abaixo. Use Movimento do cabelo para alternar entre o solver anterior e o aprimorado em uma única visualização. Escolha Mover e depois acomodar para observar o cabelo voltar ao repouso. Pause para examinar uma pose ou arraste a visualização para girar a câmera. O seletor Animação oferece todas as 260 animações universais. Escolha um clipe para ver o corpo inteiro se mover; Enquadramento → Close do cabelo aproxima novamente a câmera dos fios. Teste de giro da cabeça retorna à comparação controlada.

Open this demo in a full window ↗

Removemos a mochila separada e o braço robótico de Seed-san dessas visualizações para deixar o rabo de cavalo desobstruído. O corpo, a geometria do cabelo, os pesos de skinning e a animação não são alterados por essa mudança de visibilidade; isto não é uma correção de colisão com a mochila.

Experimente a biblioteca de animações universais ​

O seletor de animações usa o mesmo retargeter em espaço global empregado pelo rig e pelo runtime da Cinevva. Mapeamos os metadados humanoides VRM de cada avatar para os nomes de articulação esperados pelo retargeter, selecionamos o skin do corpo em vez de um skin anterior contendo apenas o cabelo e capturamos a pose não animada do corpo antes do início da demonstração do cabelo. Isso evita tratar uma cabeça virada ou uma postura agachada como a pose de repouso da personagem quando outro clipe é selecionado.

Um clipe selecionado é obtido da biblioteca Universal compartilhada, redirecionado uma vez e reproduzido na personagem escolhida. O deslocamento horizontal é removido para manter a personagem no enquadramento. Todas as animações universais selecionadas se repetem nestas demonstrações, inclusive ações originalmente marcadas para serem reproduzidas uma única vez. Reiniciar reproduz novamente a ação selecionada. O movimento do cabelo é executado depois da animação corporal.

Fizemos o retargeting de todos os 260 clipes em cada avatar: 520 resultados, sem articulações corporais obrigatórias ausentes, trilhas numéricas inválidas ou trilhas de animação corporal direcionadas às articulações do cabelo. Também amostramos Idle, Walk, Jump, Back Flip, Dance, Crouch Forward e Sitting Idle, verificamos o movimento e a sincronização do corpo e inspecionamos as poses renderizadas. Essas verificações demonstram um retargeting utilizável nesses dois rigs, não perfeição visual em todos os quadros. Resultados da verificação de retargeting.

As roupas também precisam de seus controles originais. Esta amostra VRM usa restrições de mira e torção para as mangas e a deformação dos membros; animar apenas as articulações humanoides deixa as mangas na pose original. Agora, a demonstração carrega esses controles com o módulo oficial de restrições de nós VRM e os atualiza depois da animação corporal e antes da simulação do cabelo. Isso preserva o rig de roupa fornecido; não adiciona uma simulação de tecido.

A biblioteca completa está disponível para inspeção, mas as medições de interseção e estiramento abaixo ainda usam a sequência controlada de giro da cabeça. Elas não comprovam que o cabelo esteja livre de colisões em todas as danças, quedas ou cambalhotas.

O erro estava na forma de repouso ​

Uma cadeia de articulações precisa de uma direção para a qual retornar. Nosso solver anterior calculava essa direção em relação à articulação já curvada acima dela. Portanto, uma pequena deflexão no topo alterava a direção de repouso do segmento seguinte, que por sua vez alterava novamente o próximo.

Esse acúmulo produzia a curvatura. Manter cada osso com o comprimento correto não era suficiente para evitá-la.

O novo solver memoriza o arco original do penteado no sistema de coordenadas da cabeça em movimento. Cada segmento ainda tem inércia e amortecimento, mas sua direção restauradora vem dessa forma original. A cabeça pode virar enquanto o cabelo fica para trás; esse atraso não se transforma mais em uma nova curva de repouso para todos os segmentos abaixo.

Também deixamos os rigs existentes dos artistas um pouco mais firmes e aumentamos o amortecimento. A comparação de antes e depois inclui esse ajuste, não apenas a mudança do sistema de coordenadas.

Um alvo móvel que preserva o arco original ​

Para o segmento i, seja oi a posição atual de sua articulação e ai o deslocamento original de seu filho. A posição para a qual ele tenta retornar é

ri=oi+RHRi0(sai).

RH é a rotação animada do sistema de fixação da cadeia, normalmente a cabeça. Ri0 é a rotação original acumulada desse sistema até este segmento, e s é a escala do modelo. A posição da articulação acompanha a cadeia, mas a direção-alvo vem do arco salvo. Usar a rotação do pai já curvado para essa direção era o que acumulava a curvatura.

Cada etapa combina a atração em direção a esse alvo com gravidade e amortecimento exponencial:

ui=e−ch[vi+hfi],fi=k(ri−xi)+g,yi=xi+hui.

Aqui, xi é a extremidade simulada, vi é sua velocidade, k é o coeficiente restaurador, c é a taxa de amortecimento e g é a aceleração da gravidade usada pelo solver. A demonstração amostra o movimento do corpo e do cabelo em conjunto a cada h=1/120 de segundo. Esta é uma atualização de mola personalizada com massa unitária implícita, não um solver completo de haste elástica ou XPBD.

Em seguida, recolocamos a extremidade a uma distância fixa Li=s‖ai‖ da articulação:

x^i=oi+Liyi−oi‖yi−oi‖.

Essa projeção preserva o comprimento do osso. Sozinha, ela não preserva todas as arestas dos triângulos nem mantém os fios fora das roupas. A implementação usa a direção de repouso se a direção candidata degenerar.

Depois, experimente um penteado completo ​

O segundo avatar, uma amostra da pixiv, tem doze cadeias de cabelo e 12.868 vértices de cabelo. Aqui, preservamos as articulações e os pesos do artista e substituímos o comportamento do movimento secundário. Este exemplo demonstra a animação de um penteado existente, não a reconstrução automática de sua malha de cabelo fundida.

Open this demo in a full window ↗

Observe as pontas pelas laterais e por trás. A versão aprimorada mantém melhor a silhueta pretendida sem perder o movimento. A versão anterior reúne as pontas em uma curvatura mais acentuada.

Modelos reais também revelaram um problema mais discreto: algumas franjas curtas terminam em um nó que não é, por si só, um osso com skinning. Estávamos ignorando essas cadeias. Agora, o importador aceita essas extremidades e lê cadeias de cabelo da cabeça explicitamente nomeadas nos metadados de mola do VRM 1. Ele também lê proxies de colisão esféricos e em cápsula, além dos raios de colisão por articulação.

A especificação de spring bones do VRM fornece a estrutura de intercâmbio. Nosso movimento usa um solver personalizado com padrões ajustados, em vez de implementar completamente todas as configurações de mola do VRM. As demonstrações usam o carregador de materiais MToon da pixiv para preservar o sombreamento, as texturas e os contornos do rosto e das roupas criados pelo artista. Desativamos as cascas expandidas de contorno do cabelo porque elas atravessam essas superfícies finas em camadas. As duas configurações de movimento usam iluminação e materiais idênticos. A implementação de spring bones do three-vrm da pixiv é uma referência consolidada para esse ecossistema.

Por que as mechas da frente atravessavam a camisa ​

Verificar apenas as posições das articulações deixou passar uma falha visível: o fio entre duas articulações podia atravessar um ombro mesmo quando as duas extremidades estavam fora da forma de colisão. Também encontramos um erro de indexação no tratamento dos raios VRM: ler o raio da articulação seguinte fazia o segmento final ficar com raio zero.

Agora, as duas mechas da frente usam verificações de colisão ao longo de cada segmento inteiro. Uma etapa compartilhada de ajuste mede a geometria visível do corpo e das roupas ao redor das formas de colisão existentes, com limites de expansão baseados no tamanho do corpo. O alcance, a posição e a atribuição de pesos de skinning dos fios identificam quais cadeias precisam de verificações por segmento. Agora, os dois avatares usam esse algoritmo sem regras baseadas no nome do modelo ou das mechas. Expandir as verificações de colisão para todo o penteado aumentou o estiramento, portanto as restrições de fixação à cabeça e as franjas curtas mantêm o tratamento original.

Verificamos o resultado diretamente contra a camisa com skinning, independentemente desses proxies. Durante um ciclo de giro da cabeça, a camisa ocultou até 555 dos 1.503 vértices das mechas frontais com o movimento anterior. O ajuste automático registrou zero ocorrência além do limite de medição de 1 mm, tanto a 30 quanto a 120 quadros por segundo. A profundidade máxima medida anteriormente era de 75,2 mm. Esta é uma medição de oclusão em vista frontal, não uma alegação de colisão de superfície perfeita nem uma garantia para todas as animações. Baixe as medições das mechas frontais.

Manter as mechas fora da camisa tem um custo: o estiramento no percentil 99 do penteado em camadas aumentou de 17,1% antes do ajuste de colisão para 18,0%. Ainda permanece abaixo dos 26,0% do solver anterior; a tabela abaixo apresenta o resultado atual.

A resposta ao contato exigiu uma correção separada: empurrar um fio para fora da roupa estava sendo convertido em velocidade, causando um rebote visível na etapa seguinte. Agora, resolvemos a sobreposição sem adicionar esse impulso, removemos o movimento de entrada no contato e preservamos o movimento de deslizamento. Um teste de regressão com o fio em repouso verifica tanto o contato da extremidade quanto o do segmento inteiro: o fio corrigido permanece na posição de contato em vez de ser lançado para longe.

Contato ao longo do fio, sem impulso de rebote ​

Um elo de cabelo e o eixo de uma cápsula são ambos segmentos de reta. Escreva seus pontos como p(u) e q(v), com u,v∈[0,1]. A folga entre eles é

d=minu,v∈[0,1]‖p(u)−q(v)‖,C=d−(rb+rh).

rb é o raio do proxy corporal e rh é o raio de colisão do cabelo, ambos em unidades do espaço global. Um C negativo indica sobreposição. Verificar apenas a extremidade filha fixa u=1 e pode ignorar o meio de uma mecha longa; o contato por segmento busca em todo o intervalo. Uma esfera é o caso especial em que o eixo da cápsula tem comprimento zero.

Para evitar transformar a correção de posição em um salto, reconstruímos a velocidade antes de empurrar a extremidade para fora do contato:

vi∗=x^i−xih.

Depois de uma correção de contato diferente de zero, seja n sua direção normalizada. Removemos apenas o componente que se move para dentro dessa correção:

vi+=vi∗−min(0,vi∗⋅n)n.

O movimento tangencial é preservado, permitindo que o fio deslize. A própria correção de posição não é adicionada à velocidade. Em seguida, o solver repete a projeção de contato e remove a velocidade ao longo da direção radial do elo; restrições interativas ainda podem deixar alguma sobreposição residual.

Back Flip revelou outra lacuna de cobertura no rabo de cavalo reconstruído: o skin separado do cabelo não continha os ossos do tronco. Agora, a detecção de colliders percorre a hierarquia do corpo, e o ajustador compartilhado adiciona uma cápsula no torso quando falta cobertura do tronco. Uma verificação de seis segundos de Back Flip, tanto a 30 quanto a 120 quadros por segundo, não encontrou nenhuma penetração amostrada dos elos do rabo de cavalo nessa cápsula. Esta é uma verificação de colisão com proxy, não uma garantia contra todos os triângulos das roupas; as verificações originais de deformação no giro da cabeça continuam passando.

Movimentos rápidos também exigem verificações entre poses. Agora, a demonstração avança o corpo, as restrições das roupas e o cabelo em conjunto a 120 etapas por segundo e verifica os fios contra proxies móveis esféricos e em cápsula entre essas etapas. O contato preserva o deslizamento lateral em vez de interromper todo o movimento do fio, o que faria o cabelo grudar. Walk e Back Flip nos dois avatares produziram posições e velocidades de cabelo amostradas idênticas a 30, 60 e 120 quadros por segundo em nossas verificações de quatro segundos. Isso lida com o movimento amostrado das primitivas; não é detecção contínua de colisão contra todos os triângulos das roupas, e restrições adicionais ainda podem deixar contatos sem solução. Baixe as verificações de taxa de quadros e contato. Essa consistência tem um custo. No benchmark anterior com duas visualizações a 60 quadros por segundo, o tempo de atualização registrado no 95º percentil foi de cerca de 1 ms para a Seed-san e de 14–23 ms para o modelo em camadas, sem contar a renderização. Esses custos abrangem dois personagens, enquanto a demonstração ao vivo agora renderiza um. O caso em camadas ainda precisa de otimização; essas medições em computadores desktop não comprovam o desempenho em celulares.

O ajustador ainda usa pressupostos anatômicos e expansão limitada. Ele preserva as configurações definidas pelo artista quando os papéis corporais ou a geometria necessários estão ausentes e informa transformações incompatíveis. Oito verificações adicionais abrangem ossos renomeados, alterações de escala, espessura das roupas, acessórios ocultos e restauração das configurações originais. Esses dois avatares foram usados para o ajuste; ainda é necessário testar penteados e roupas não vistos antes de considerar o resultado confiável de modo geral.

Meça a malha, não apenas o esqueleto ​

Um osso pode manter seu comprimento enquanto os triângulos ao redor dele se esticam. Por isso, medimos cada aresta triangular do cabelo durante uma execução de doze segundos: quatro segundos de movimento da cabeça, seguidos por oito segundos de estabilização. A simulação é executada a 120 passos por segundo; as medições da malha são coletadas 30 vezes por segundo.

Para cada aresta, registramos seu pior alongamento durante a execução. A tabela apresenta o 99º percentil desses máximos por aresta: 99% das arestas permaneceram nesse nível de alongamento ou abaixo dele.

Para a aresta da malha e=(a,b) com comprimento original ℓe0, medimos as posições dos vértices após o skinning, za(t) e zb(t):

ρe(t)=‖za(t)−zb(t)‖ℓe0,me=maxt∈Tρe(t).

T contém os quadros coletados. A porcentagem informada é 100(Q0.99({me})−1), em que Q0.99 é o 99º percentil entre as arestas. Calcular o máximo de cada aresta antes do percentil preserva eventos breves de alongamento que uma média ao longo do tempo poderia ocultar. O valor da pior aresta usa maxeme, de modo que uma pequena região muito deformada continue visível no relatório.

Teste com modelo realMovimento anteriorMovimento aprimorado
Seed-san: rabo de cavalo reconstruído e franja original8,0%5,0%
Seed-san: rig de cabelo original7,6%5,1%
pixiv: rig de cabelo em camadas original26,0%18,0%

A pior aresta individual ainda importa. No modelo em camadas, ela melhorou de 102,7% para 70,8% de alongamento — um defeito remanescente que o percentil não deve ocultar. A pior aresta da Seed-san melhorou de 35,2% para 27,8% em ambos os casos. Essas são medições feitas em exemplos de desenvolvimento usados para ajuste, não uma taxa de sucesso em penteados não vistos.

As raízes das cadeias permaneceram fixas. Nos dois segundos finais, o movimento medido das pontas entre os quadros coletados ficou abaixo de 0,001 mm em cada caso aprimorado. Treze testes específicos abrangem rigging, raízes fixas, preservação da forma, colisões, extremidades curtas, importação e controle das animações. Também verificamos a aplicação e o desfazer do rig no visualizador, além da exportação de animações cíclicas e de execução única.

Baixe as medições. Os exemplos ao vivo usam o mesmo código do solver empregado no visualizador e no fluxo de exportação do protótipo. São renderizações interativas, não vídeos pré-gravados.

O que isso torna possível — e o que ainda não resolve ​

Para um rabo de cavalo ou uma mecha separada, agora temos um caminho que vai da geometria selecionada até articulações, pesos e movimento secundário. Para um rig de cabelo compatível já existente, podemos preservar o trabalho do artista e animá-lo. Quando uma animação já contém trilhas para essas articulações do cabelo, o solver procedural cede lugar ao movimento criado pelo artista, em vez de aplicar um segundo movimento por cima.

O benchmark numérico do cabelo usa giros da cabeça e translação suave do corpo. O seletor Universal permite que os leitores examinem outras ações, mas essas medições não comprovam a qualidade do cabelo durante corridas, saltos ou cambalhotas. Os proxies de colisão não equivalem à colisão com toda a superfície do corpo, e ainda não resolvemos colisões do cabelo consigo mesmo. Tranças, cachos, regiões capilares fundidas e o desempenho real em celulares precisam de testes próprios.

O recurso continua experimental. Mas as verificações com personagens reais tornaram a melhoria concreta: o cabelo pode se mover sem reescrever continuamente a forma à qual deveria retornar.


Créditos dos modelos. Seed-san © VirtualCast, Inc., da coleção oficial de amostras VRM. VRM1_Constraint_Twist_Sample © 2022 pixiv Inc., dos modelos de exemplo do three-vrm. Ambos os arquivos incluem metadados da Licença Pública VRM 1.0 que permitem redistribuição e modificação. O rabo de cavalo reconstruído e o movimento personalizado são alterações nossas. Os URLs de origem e hashes dos arquivos identificam as amostras exatas usadas.

Créditos das animações. Os clipes Universal são de Quaternius, da Universal Animation Library e da Universal Animation Library 2, disponibilizados sob CC0.

A seguir: cabelo reutilizável em um personagem gerado ​

Nosso trabalho seguinte começa com malhas de biblioteca sem rig: ajuste 46 penteados a um sapo e examine os guias de mechas extraídos. O experimento ao vivo separa a fixação ao couro cabeludo da física que ainda será implementada.