Estamos 'no final' quando se trata de terminar o projeto, mas pouco antes de implementar o sistema de animação.
Nosso cliente decidiu escolher "Bones Animation" - que é o de exportar cada Transformation Matrix (rotação matricial 4 x 4 + tradução) para cada quadro e para cada osso que esse objeto animado tiver.
Os objetos do nosso jogo são animados com o 3DS Max Physique Modifier, então teremos dados de ossos / ponderação por vértice. Mas vou simplificar as coisas aqui apenas para esclarecer um pouco esse assunto.
Gostaria de dividir este post em 2 pontos, onde:
Exportando matrizes de ossos para cada quadro
- trata sobre o método correto de exportar as posições dos ossos para fins de animação posterior, onde eu tenho que 'mover' e 'girar' todo vértice influenciado por esse osso para a posição do osso no quadro X.
Cálculo da posição final do vértice
- trata sobre operações de matrizes apropriadas para calcular a nova posição do vértice de acordo com a transformação óssea no quadro X.
1. EXPORTAÇÃO DE MATÉRIAS DE OSSOS PARA CADA QUADRO
Entendo corretamente que, ao exportar o objeto animado, devo:
Pegue a matriz de transformação BONE no quadro 0 e inverta esta matriz
Pegue a matriz de transformação BONE na FRAMEx
Multiplique 1 * 2 para obter o deslocamento da transformação do BONE na FRAMEx
[pseudocode]
// Animation export
// For each frame, export bone transformation offset
for(int iFrame = 0; iFrame < vFrames.size(); iFrame++)
{
// For every bone in the object
for(int iBone = 0; iBone < vBones.size(); iBone++)
{
// Grab transformation matrix for this bone at frame 0 and inverse it
Matrix3 matBoneMatrixAtStart = pNode->GetObjectTMAfterWSM( 0 );
matBoneMatrixAtStart.Inverse();
// Grab transformation matrix for this bone at frame iFrame
Matrix3 matBoneMatrixAtCurrentFrame = pNode->GetObjectTMAfterWSM( iFrame );
// Multiply Inversed Transformation Matrix of this bone at frame 0 - with
// current frame transformation matrix
Matrix3 matBoneTransformationOffset = matBoneMatrixAtStart
* matBoneMatrixAtCurrentFrame ;
// Save matBoneTransformationOffset - vertex will be multiplied by this
// matrix for animation purposes
fwrite(.....)
}
}
[/pseudocode]
Isso será suficiente? Ou há algo que estou perdendo aqui?
2. CÁLCULO DE NOVAS POSIÇÕES DE VERTICES (POSIÇÃO FINAL DE VERTEX NO QUADRO X)
Posteriormente, ao renderizar, os vértices do objeto serão multiplicados pela matriz de transformação óssea exportada para o quadro de animação real e depois multiplicados por toda essa matriz de transformação do modelo para colocar o objeto na posição correta dentro do nível:
[pseudocode]
Update()
{
// The model transformation matrix describing the position of
// the model in the level
matModelTransformationMatrix
// Calculate new vertex position according to it's bone transformation offset
NewVertexPosition = (OriginalVertexPosition * matBoneTransformationOffset[iFrame])
* matModelTransformationMatrix;
// Increment the frame for testing purposes
iFrame++;
}
[/pseudocode]
Estou pensando correto aqui? Portanto, tendo a transformação óssea deslocada para o quadro X, multiplicar todos os vértices afetados por esse osso por esse deslocamento deve resultar em um vértice transformado exatamente como esse osso, certo?