J'ai essayé d'implémenter l'animation squelettique dans mon propre moteur de jeu 3D openGL/C++ en utilisant ASSIMP pour importer les modèles.Animation squelettique avec ASSIMP
Je pense que le problème est causé par le calcul des matrices osseuses, chargées comme des variables uniformes dans le shader car si je les assigne à des identités, le maillage est chargé dans sa pose de liaison.
Ce sont les fonctions que j'utilise pour initialiser et calculer les matrices osseuses prêts:
void Joint::AddToSceneGraph(GameObject* root)
{
GameObject* parent = root->FindChild(m_name);
//m_globalInverseMatrix = inverse(root->GetTransform().GetMatrix());
parent->AddComponent(this);
while (parent->GetParent() != root)
parent = parent->GetParent();
parent->GetTransform().SetParent(NULL); (1)
}
mat4 Joint::GetMatrix()
{
mat4 ans = /*m_globalInverseMatrix*/GetTransform().GetMatrix()*m_offsetMatrix;
return ans;
}
Depuis que je suis en train de rendre le modèle dans sa bind pose, je vous l'offre wont le code de calcul des matrices d'animation. Quelques clarifications - J'ai une classe Transform qui a un parent Transform * et dont la méthode GetMatrix() calcule la matrice à partir de celle du parent, mettant à l'échelle et traduisant vec3s et quaternion de rotation pour prendre en compte la relation parent/enfant. Je suppose que la transformation de l'articulation racine par le parent doit être NULL ainsi que son identité matricielle, ce qui est le but de (1). Bien que je ne sois pas sûr de cette hypothèse, je suis sûr que le nœud avec la racine du squelette et le nœud, contenant les mailles, sont frères et soeurs.
Aussi je ne suis pas sûr que je devrais utiliser la météo m_globalInverseMatrix
et en outre quel est exactement son but.
En général, je pense que le principal problème que j'ai est mal compris comment ASSIMP calcule le offset matrix
ou inverse bind pose matrix
et comment inverser son effet. Ce problème entraîne dans le modèle à la recherche « emballé » en lui-même: