COLLADA: pose de ligação inversa no espaço errado?
Estou trabalhando para escrever meu próprio importador COLLADA. Cheguei muito longe, carregando malhas e materiais e tal. Mas eu encontrei um problema na animação, especificamente: rotações de juntas.
A fórmula que estou usando para esfolar minhas malhas é direta:
weighted;
for (i = 0; i < joint_influences; i++)
{
weighted +=
joint[joint_index[i]]->parent->local_matrix *
joint[joint_index[i]]->local_matrix *
skin->inverse_bind_pose[joint_index[i]] *
position *
skin->weight[j];
}
position = weighted;
No que diz respeito à literatura, esta é a fórmula correta. Agora, COLLADA especifica dois tipos de rotações para as juntas: local e global. É necessário concatenar as rotações para obter a transformação local da junt
O que a documentação da COLLADA não diferencia entre a rotação local da junta e a rotação global da junta. Mas na maioria dos modelos que eu vi, as rotações podem ter um ID derotate
(global) oujointOrient
(local)
Quando desconsidero as rotações globais e uso apenas as rotações locais, obtenho a pose de vinculação para o modelo. Mas quando adiciono as rotações globais à transformação local da junta, coisas estranhas começam a acontece
Isto é sem usar rotações globais:
E isso é com rotações globais:
Nas duas capturas de tela, estou desenhando o esqueleto usando linhas, mas na primeira é invisível porque as articulações estão dentro da malha. Na segunda captura de tela, os vértices estão por todo o lado!
Para comparação, é isso que a segunda captura de teladevemo parece
É difícil ver, mas você pode ver que as juntas estão na posição correta na segunda captura de tel
Mas agora a coisa estranha. Se eu desconsiderar a pose de ligação inversa conforme especificado por COLLADA e, em vez disso, fizer a inversão do tempo de transformação local pai da junta, a transformação local da junta, obterá o seguinte:
Nesta captura de tela, estou desenhando uma linha de cada vértice para as articulações que influenciam. O fato de eu receber a pose de ligação não é tão estranho, porque a fórmula agora se torna:
world_matrix * inverse_world_matrix * position * weight
Mas isso me leva a suspeitar que a pose de ligação inversa do COLLADA está no espaço errad
Então, minha pergunta é: em que espaço o COLLADA especifica sua pose de ligação inversa? E como posso transformar a pose de ligação inversa no espaço que eu precis