Animation par key-frames à partir d'une simulation physique

De Ensiwiki
Aller à : navigation, rechercher

L'objectif de cette partie du projet est de convertir une animation physique d'un chien en une animation par "key-frames" sous le logiciel Maya. Pour atteindre ce but, nous avons procédé en plusieurs étapes :

  • Enregistrement de "key-frames" à partir du logiciel Simbicon
  • Lecture des fichiers réprésentant les "key-frames"
  • Chargement des données sous le logiciel Maya


Quelques définitions

Actuellement, il existe plusieurs types d'animation, dont l'animation physique et l'animation par "key-frames".


L'animation physique repose sur des lois physiques que l'on fait subir à l'objet pour l'animer. Par exemple, pour faire tomber une balle, on lui applique une force qui représente la gravité ....


L'animation par "key-frames" consiste à décrire toutes les positions clés de l'objet, au cours de son mouvement.


Le logiciel Simbicon

Simbicon est un logiciel qui réalise une animation physique d'un chien. Il est le fruit de la collaboration des instituts University of British Columbia, Disney Research Zurich et INRIA Grenoble et sera présentée à la conférence SIGGRAPH 2011. Il est basé sur des calculs de forces sur les différentes articulations du quadrupède et sur des schémas de mouvements de base : galop (transverse, rotatoire), trot, pas, saut, assise, etc...Plus d'informations sont disponibles ici : http://www.cs.ubc.ca/~van/papers/2011-TOG-quadruped/index.html


Voici le squelette de cette animation :


Squelette de l'animation physique

Exportation des données à partir du logiciel Simbicon

Avant de pouvoir faire une animation, il faut avoir la structure de l'objet que l'on souhaite animer, c'est-à-dire dans notre cas le squelette d'un chien. Pour cela, nous avons juste utilisé le fichier d'initialisation du logiciel Simbicon. Ce fichier décrit la position initiale de chaque articulation du squelette.


Pour réaliser une animation par "key-frames", le but de cette partie du projet, il faut connaitre la position de chaque objet à des instants donnés. Or dans une animation physique, la position des éléments n'est pas calculée à l'avance. Il faut donc enregistrer la position de toutes les articulations à chaque instant de l'animation. Pour cela, nous avons utilisé une fonction déjà existante qui permet d'enregistrer, dans des fichiers externes, approximativement 100 frames par seconde.

Les fichiers contiennent, pour chaque articulation, son orientation dans le repère global. Cette orientation est exprimée en quaternion.

Importation sous Maya

L'importation de l'animation par "key-frames" se fait en plusieurs étapes avec le logiciel Maya. Dans un premier temps, il faut permettre à Maya de reconnaître un nouveau type de fichier, les fichiers .rbs. Il faut ensuite charger les "key-frames", qui sont dans un deuxième types de fichiers, .rs ou .ts.


Chargement du squelette

Pour charger le squelette, il faut lire sous Maya le fichier d'initialisation fournit par Simbicon, qui est un .rbs. Nous avons donc créé un parseur pour ce type de fichier. Il existe deux moyens de le faire sous Maya : les scripts MEL ou les PLUG-IN C++.

Un fichier .rbs décrit chaque articulation du squelette:

  • son nom
  • son parent
  • son fils
  • sa position dans le repère de son père
  • ...

Dans ce fichier, les articulations ne sont pas décrites dans l'ordre de leur création , c'est pourquoi nous avons utilisé une structure afin de stocker toutes les informations nécessaires à la création d'une articulation sous Maya. Nous avons donc réalisé le premier parseur en plug-in C++ car les structures n'existent pas dans le langage MEL.

Le chargement du squelette se fait en deux lectures : la première sert à stocker les informations sur les articulations, tandis que la seconde crée les articulations.

Voici le résultat que nous obtenons sous Maya :


Chargement du squelette du chien sous Maya


Nous pouvons constater que ce chien est "debout". Nous résolvons ce problème dans la 2ème phase d'importation.

Chargement de l'animation

Pour pallier au problème précédent, nous chargeons un fichier .ts qui contient la position du squelette lorsqu'il n'y a aucune rotation sur ses articulations (le chien a les jambes tendus). Cette position est exprimée à l'aide de translation par rapport à la position "debout" du squelette. Voici le résultat que nous obtenons:


Position initiale du chien


Nous chargeons ensuite les fichiers contenant les frames de l'animation. Ces fichiers ne sont pas du même type que celui d'initialisation. Ce sont des .rs qui contiennent, pour chaque articulation, sa rotation par rapport à l'état initial, dans le repère global. Ces rotations sont exprimées en quaternion. Cependant, dans le logiciel maya, les rotations sont exprimés en angles d'Euler. Nous convertissons donc les quaternions en angles d'Euler.


Voici le résultat que nous obtenons pour le trot:

<flash>file=video_trot.swf|width=430|height=250|loop=false|quality=best</flash>


Le logiciel Simbicon permet de réaliser d'autres animations comme le pas, le galop ou encore un chien qui s'assoit.

Voici quelques résultats supplémentaires :

<flash>file=video_assis_001.swf|width=400|height=250|loop=false|quality=best</flash>

<flash>file=video_pousse_avant_001.swf|width=400|height=250|loop=false|quality=best</flash>


Pour le chargement de la position initiale et des animations, nous avons réalisé un script MEL qui lit le fichier .ts puis les fichiers .rs et modifie les angles des articulations, en fonction des informations lues dans les fichiers.

L'interface

De façon à simplifier l'utilisation de nos différents scripts, et pour ne pas modifier à chaque fois le code, nous avons créé une interface. Elle regroupe toutes les informations nécéssaires à l'importation de l'animation, qui ont été décrites précédemment.

Voici cette interface :


Interface de chargement de l'animation


Pour aider l'utilisateur dans le remplissage des différents champs, nous avons créé une aide, qui est la suivante:


Interface d'aide pour remplir les champs du chargement de l'animation

Dans le logiciel Simbicon, la fréquence de l'animation est de 1000Hz. Lorsque nous exportons les frames, nous obtenons donc 1000 positions par seconde. Pour certaines animations, le chargement peut alors être très long (quelques minutes), c'est pourquoi nous permettons à l'utilisateur de choisir la précision qu'il souhaite. Lorsque la précision est à 1, nous chargeons toutes les frames dans Maya. Lorsqu'elle est à 1/100, nous chargeons une frame sur 100, la fréquence est de 10Hz. Les frames que nous chargeons sont fixes dans le temps, donc lorsqu'elles ne sont pas toutes chargées, il y a une interpolation des mouvements entre chacune d'elles. La vitesse de l'animation n'est pas changée, seule la qualité du mouvement est modifié par le choix de cette précision. En effet, moins il y aura de frames chargées, plus l'interpolation sera importante et donc le mouvement approximatif.


Voici deux vidéos avec respectivement une précision à 1/200 et à 1 (les données sont les mêmes, le chien est au galop).


<flash>file=Precision_200Frame.swf|width=400|height=250|loop=false|quality=best</flash>

<flash>file=Precision_1Frame.swf|width=400|height=250|loop=false|quality=best</flash>

On voit clairement qu'une précision de 0.5% donne une animation incorrecte. C'est pour cette raison que dans l'interface nous limitons la précision minimum à 1%.


En raison du temps de chargement plus ou moins long selon les données, nous affichons une fenêtre pour indiquer à l'utilisateur que l'animation se charge.

Voici cette fenêtre :


Interface indiquant que le chargement est en cours

De l'animation par "key-frames" vers la cinématique inverse

Afin d'améliorer la cinématique inverse du squelette du Muséum d'Histoire Naturel de Paris, le 2ème binôme (Pierre et Thibault) va utiliser cette animation par "key-frames". Pour cela, ils ont besoin des courbes d'animation qui représentent le mouvement de chaque articulation au cours du temps. Pour les générer, nous utilisons des marqueurs, qui suivent la position de chaque articulation pendant l'animation.


Création des marqueurs

Il existe deux moyens de définir la position d'un marqueur lors de sa création : relativement par rapport à l'articulation qu'il doit suivre ou de façon absolue, indépendamment des autres objets de la scène. Nous utilisons dans notre cas la position absolue. En effet, le marqueur suit l'articulation à laquelle il est attaché, donc si on utilisait la position relative, celle-ci vaudrait toujours 0 : le marqueur et l'articulation étant à la même place. Avec la position absolue, on récupère vraiment la position du marqueur dans l'espace global de la scène.

Dans un premier temps, nous avons placé ces marqueurs à la main. Cependant, cela provoquait des problèmes dans l'animation. Pour les régler et pour gagner en modularité, nous avons écrit un script MEL qui se charge de leur création.

Génération des courbes d'animation

Pour générer les courbes d'animation des marqueurs, nous enregistrons la position des articulations au cours de l'animation. Puis nous appliquons ces positions aux marqueurs correspondants. On obtient ainsi l'évolution de leur position au cours du temps. Nous avons automatisé cette procédure grâce à un script MEL.

Voici le squelette avec les différents marqueurs:

Marqueurs sur le squelette

Retour à la page principale du projet