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

questionAnswers(2)

yourAnswerToTheQuestion