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 ?

Documents pareils