TP2 : Animation de personnage
Maintenant que nous pouvons animer un vêtement en interaction avec un personnage, nous allons animer ce personnage. Nous allons l'animer par skinning.Découverte du programme
Télécharger les sources et placer dans le dossier du projet les fichiers dynamics.cpp et mesh.cpp que vous avez modifiés lors du TP1. Lorsque vous lancez le projet, vous retrouvez votre animation du précédent TP (le point de vue se contrôle à la souris).
Dans main.cpp, passez draw_axes à true. Les repères des articulations s'affichent alors. N'hésitez pas à passez l'affichage en mode ligne pour mieux voir les articulations (avec glPolygonMode()).
La transformation courante de l'articulation i dans le repère monde est stockée dans matrices[i].
La transformation subie par l'articulation i entre sa position initiale et sa position courante est stockée dans m_origin[i].
La fonction update_matrices() se charge de calculer ces matrices.
Dans la fonction animate() de main.cpp, décommentez l'animation du skinning : anim.animateSkinning(). Vous pouvez alors voir les articulations qui bougent. Le personnage avance en pliant le coude. Nous allons maintenant appliquer le skinning au maillage du personnage pour animer le modèle visuel.
Skinning
Nous allons faire cela dans le vertex shader. Dans skinningShader.vs, nous allons mettre à jour la position de chaque sommet grâce au skinning.
Dans le vertex shader, modifiez pos en fonction des transformations matrices et des influences (weightIndex, weight).
Vous pouvez maintenant voir le maillage se déformer pour suivre les articulations. Vous pouvez modifier l'animation dans Skinning::animate().
Cependant, le vêtement n'est plus en interaction avec le personnage. Cela est dû au fait que le modèle de collision du personnage n'est pas couplé au skinning. Il n'est donc pas déformé.
Couplage skinning/Modèle de collision
Pour résoudre cela, nous allons déplacer les sphères du modèle de collision du personnage en fonction des transformations des articulations.
La méthode Animation::updateCollisionModelFromSkinning() reçoit en paramètre les transformations subies par les articulations entre leurs positions initiales et leurs positions courantes. Complétez cette méthode pour animer le modèle de collision.
Le vêtement est maintenant en interaction avec le personnage.
Améliorations
On peut voir cependant que le vêtement "est à la traîne" par rapport au personnage. Que peut-on faire pour résoudre ce problème?
Indice : Etudiez le pipeline d'animation dans la méthode animate() de main.cpp