Quaternions et motion capture
Transcription
Quaternions et motion capture
TP Animation Quaternions et motion capture Le Naour T. Gibet S. Courty N. Année 2008-2009 Ce TP va vous permettre de mettre en pratique les représentations des rotations ainsi que leurs manipulations dans le cadre de la motion capture. Avant de commencer, aller prendre les chiers TP2.h, TP2.cpp, AnimatedChain.h, AnimatedChain.cpp et Quaternion.h sur le forum et intégrer les au projet. 1 Quaternions 1.1 Dénition Un quaternion q est un 4-uple de valeurs réelles (w, x, y, z). Les quaternions unitaires (kqk = 1) peuvent servir à paramètrer des rotations de R3 . Il existe une équivalence directe entre un quaternion et un couple (angle, axe) qui formalise le fait qu'une rotation de l'espace peut toujours être représentée par une rotation d'angle θ autour d'un axe v. Ceci amène à une représentation intuitive du quaternion sous la forme d'une paire ordonnée d'un nombre et d'un vecteur, i.e. q = (w, a) avec w = cos 2θ and a = sin 2θ v. La multiplication de deux quaternions est dénie mais pas commutative, i.e. q1 q2 6= q2 q1 .Cette multiplication est donnée par la formule suivante : q1 q2 = (w1 w2 − a1 .a2 , w1 a2 + w2 a1 + a1 × a2 ) , (1) et sert à combiner plusieurs rotations entre elles. 1.2 Visualisation De façon à visualiser les rotations associées aux quaternions, faîtes une classe QuaternionViewer qui prendra en attribut une position Vector3 m_position et une rotation Quaternion m_rotation ainsi que deux méthodes Draw() et Compute(float angleX, float angleY, float angleZ). 1.2.1 • Draw(): Comme illustré dans la gure 1, cette méthode doit acher l'axe du quaternion ainsi qu'une sphère illustrant la position de l'objet manipulé. Vous pouvez utiliser les classes GraphicCylinder et GraphicSphere pour vous aider (chier Renderer.h ). • void Compute(...) combine les rotations sur les axes X, Y et Z. 1.2.2 Utiliser les commandes clavier pour manipuler votre viewer dans la classe TP2. 1.2.3 (bonus) Modier le code dans le chier Renderer.h méthode CameraLookAt::Compute() pour y intégrer la manipulation de la caméra via les quaternions. 1 Figure 1: Notre viewer de quaternion. 2 Application : chaîne articulée Nous allons appliquer ces diérentes représentations de transformations dans la création d'une chaine articulée simple que l'on va supposer xée à un point de la scéne (gure 2). L'objectif de cette exercie est dans un premier temps de comprendre comment cumuler des transformations puis dans un second temps d'aborder les principes d'interpolation. Via la classe AnimatedChain, nous dénissons une chaine animée par un ensemble de joints (structure Joint). Chaque joint peut être exprimé par une transformation (rotation + position) relative au joint parent. Question : Ecrire une méthode qui créé une chaine de plusieurs joints que l'on va supposer de même taille. Question : Pour acher la chaîne compléter la méthode Display(AnimatedChain& chain) dans la classe Renderer. Ne pas oublier de cumuler les transformations . A la place de la sphère aplatie/étirée vous pouvez utiliser un cylindre entre les joints et une sphère pour la position du joint. Tester. . L'objectif est maintenant de produire un mouvement de balancier avec cette chaîne. On se propose de tester deux méthodes distinctes: Animation Figure 2: Chaine articulée utilisée dans le tp. T0 , T1 et T2 représentent des positions clés possibles pour votre animation. Méthode 1 : dénissez une procédure Animate(float time) de la chaîne qui va modier chaque orientation de chaque élément. Méthode 2 : dénissez plusieurs positions clés stockées dans la variable de classe m_animatedJoints et produisez une animation (méthode ComputeMocap(float time)en interpolant ces diérentes positions clés. 3 Application : motion capture Le principe de la motion capture reprend le problème précédent à savoir l'interpolation entre deux squelettes pour un temps donné. Reprenez la question précédente en construisant cette fois-ci votre chaine à partir d'un chier et achez. gure 3. 4 Interpolation • Interpolation linéaire : dans ce premier schéma d'interpolation on se propose de dénir l'interpolation linéaire entre deux quaternions comme le résultat normalisé de l'interpolation linéaire individuel de chaque paramètre des deux quaternions. Figure 3: un squelette animé. • Interpolation sphèrique : cette fois-ci l'interpolation se fait en suivant le chemin géodésique entre deux rotations. La formule donnant l'interpolation sphèrique est (avec u le paramètre d'intrepolation ∈ [0, 1]) : sin((1 − u)w)q1 + sin(uw)q2 sin w (2) Question : Ecrire deux méthodes lerp et slerp qui prennent deux quaternions en entrée ainsi qu'un paramètre d'interpolation t ∈ [0, 1] et renvoient le quaternion interpolé. Testez et comparez ces deux méthodes sur la dernière question du paragraphe 2. Pourquoi préférer systématiquement slerp ?