2017-03-02 1 views
1

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:

this is maybe the most famous md5 model

Répondre

2

De la documentation en Assimp, la matrice décalée des os de l'espace se transforme en maille à l'espace osseux. J'ai réussi à rendre le bind pos avec une hiérarchie similaire à la vôtre (si je n'ai pas mal compris, vous avez un nœud racine avec deux enfants, l'un engendrant la hiérarchie du squelette et l'autre générant le maillage). Ce que vous devez faire est de mettre le m_globalInverseMatrix à la transformation inverse du nœud contenant le maillage. Ensuite, transformer de chaque os est:

boneTransform = m_globalInverseMatrix * boneHierarchyTransforms * boneOffsetMatrix

où le boneHierarchyTransform vient de traverser l'arbre à chaque noeud d'os et boneOffsetMatrix est celui que vous mentionnez et je visé au premier alinéa.