COURS : Quaternions. 1 Nombres Complexes (bref rappel)



Documents pareils
Chapitre 3 : Repères et positionnement 3D

Représentation géométrique d un nombre complexe

Introduction. Mathématiques Quantiques Discrètes

Fonctions de plusieurs variables : dérivés partielles, diérentielle. Fonctions composées. Fonctions de classe C 1. Exemples

LE PRODUIT SCALAIRE ( En première S )

Exercices - Nombres complexes : corrigé. Formes algébriques et trigonométriques, module et argument

Cours de Mécanique du point matériel

1 Complément sur la projection du nuage des individus

Calcul matriciel. Définition 1 Une matrice de format (m,n) est un tableau rectangulaire de mn éléments, rangés en m lignes et n colonnes.

1 radian. De même, la longueur d un arc de cercle de rayon R et dont l angle au centre a pour mesure α radians est α R. R AB =R.

Rappels et compléments, première partie : Nombres complexes et applications à la géométrie

Géométrie dans l espace Produit scalaire et équations

Structures algébriques

I - PUISSANCE D UN POINT PAR RAPPORT A UN CERCLE CERCLES ORTHOGONAUX POLES ET POLAIRES

Angles orientés et fonctions circulaires ( En première S )

= 1 si n = m& où n et m sont souvent des indices entiers, par exemple, n, m = 0, 1, 2, 3, 4... En fait,! n m

Chapitre 2. Matrices

Cours d Analyse. Fonctions de plusieurs variables

Chafa Azzedine - Faculté de Physique U.S.T.H.B 1

8.1 Généralités sur les fonctions de plusieurs variables réelles. f : R 2 R (x, y) 1 x 2 y 2

Chapitre 2 : Vecteurs

Chapitre 0 Introduction à la cinématique

STATIQUE GRAPHIQUE ET STATIQUE ANALYTIQUE

Intégrales doubles et triples - M

Cours 02 : Problème général de la programmation linéaire

FONCTIONS DE PLUSIEURS VARIABLES (Outils Mathématiques 4)

Oscillations libres des systèmes à deux degrés de liberté

Exercices - Polynômes : corrigé. Opérations sur les polynômes

3 Approximation de solutions d équations

Exercices - Fonctions de plusieurs variables : corrigé. Pour commencer

CHAPITRE 10. Jacobien, changement de coordonnées.

Angles orientés et trigonométrie

Enoncé et corrigé du brevet des collèges dans les académies d Aix- Marseille, Montpellier, Nice Corse et Toulouse en Énoncé.

MATLAB : COMMANDES DE BASE. Note : lorsqu applicable, l équivalent en langage C est indiqué entre les délimiteurs /* */.

Cinétique et dynamique des systèmes de solides

Correction de l examen de la première session

TOUT CE QU IL FAUT SAVOIR POUR LE BREVET

NOMBRES COMPLEXES. Exercice 1 :

Optimisation non linéaire Irène Charon, Olivier Hudry École nationale supérieure des télécommunications

Cours IV Mise en orbite

Exo7. Matrice d une application linéaire. Corrections d Arnaud Bodin.

Fonctions de plusieurs variables

F411 - Courbes Paramétrées, Polaires

A. Benali Objectifs du cours

Michel Henry Nicolas Delorme

I. Polynômes de Tchebychev

Pour l épreuve d algèbre, les calculatrices sont interdites.

1 Définition. 2 Systèmes matériels et solides. 3 Les actions mécaniques. Le système matériel : Il peut être un ensemble.un sous-ensemble..

Séquence 10. Géométrie dans l espace. Sommaire

Repérage d un point - Vitesse et

Mesure d angles et trigonométrie

Calcul intégral élémentaire en plusieurs variables

Vision industrielle et télédétection - Détection d ellipses. Guillaume Martinez 17 décembre 2007

Fonctions de deux variables. Mai 2011

1S Modèles de rédaction Enoncés

LA PHYSIQUE DES MATERIAUX. Chapitre 1 LES RESEAUX DIRECT ET RECIPROQUE

aux différences est appelé équation aux différences d ordre n en forme normale.

L ANALYSE EN COMPOSANTES PRINCIPALES (A.C.P.) Pierre-Louis GONZALEZ

Plan du cours : électricité 1

Baccalauréat S Antilles-Guyane 11 septembre 2014 Corrigé

Quelques contrôle de Première S

Equations cartésiennes d une droite

PROBLEME(12) Première partie : Peinture des murs et du plafond.

Analyse en Composantes Principales

Proposition de programmes de calculs en mise en train

Premiers exercices d Algèbre. Anne-Marie Simon

DURÉE DU JOUR EN FONCTION DE LA DATE ET DE LA LATITUDE

De même, le périmètre P d un cercle de rayon 1 vaut P = 2π (par définition de π). Mais, on peut démontrer (difficilement!) que

Baccalauréat S Nombres complexes Index des exercices sur les complexes de septembre 1999 à juin 2012 Tapuscrit : DENIS VERGÈS

Manipulateurs Pleinement Parallèles

Rupture et plasticité

Planche n o 22. Fonctions de plusieurs variables. Corrigé

Cours d analyse numérique SMI-S4

t 100. = 8 ; le pourcentage de réduction est : 8 % 1 t Le pourcentage d'évolution (appelé aussi taux d'évolution) est le nombre :

* très facile ** facile *** difficulté moyenne **** difficile ***** très difficile I : Incontournable

EXERCICES DE REVISIONS MATHEMATIQUES CM2

Erratum de MÉCANIQUE, 6ème édition. Introduction Page xxi (milieu de page) G = 6, m 3 kg 1 s 2

Python - introduction à la programmation et calcul scientifique

Chapitre 1 Cinématique du point matériel

Quantification Scalaire et Prédictive

OM 1 Outils mathématiques : fonction de plusieurs variables

Fonctions de plusieurs variables

Calcul différentiel sur R n Première partie

Exemple 4.4. Continuons l exemple précédent. Maintenant on travaille sur les quaternions et on a alors les décompositions

Test : principe fondamental de la dynamique et aspect énergétique

TUTORIAL 1 ETUDE D UN MODELE SIMPLIFIE DE PORTIQUE PLAN ARTICULE

Cours Informatique Master STEP

Sujet. calculatrice: autorisée durée: 4 heures

5 ème Chapitre 4 Triangles

INTRODUCTION À L ANALYSE FACTORIELLE DES CORRESPONDANCES

I. Ensemble de définition d'une fonction

NOTATIONS PRÉLIMINAIRES

05/09/2015. M Ponctualité : CM TD TP & Projet Æ En cas d absence : récupérer!!! 3 05/09/2015

Chapitre 5 : Flot maximal dans un graphe

Catalogue des connaissances de base en mathématiques dispensées dans les gymnases, lycées et collèges romands.

La géométrie du triangle III IV - V Cercles remarquables - Lieux géométriques - Relations métriques

point On obtient ainsi le ou les points d inter- entre deux objets».

DYNAMIQUE DE FORMATION DES ÉTOILES

Cours 7 : Utilisation de modules sous python

Transcription:

1 Nombres Complexes (bref rappel) Les nombres complexes sont composés d'une partie réelle et d'une partie imaginaire : z = a + b*i avec i*i = -1 Le conjugué de z noté z' est égal à : z'= a b*i Et la norme est : z = sqrt(z * z') = sqrt(a²+b²) En utilisant les propriétés précédentes, nous pouvons donner la multiplication de deux complexes : z1*z2 = (a1*a2 b1*b2) + (a1*b2 + b1*a2)*i 2 Introduction aux quaternions Les quaternions sont une extension de nombres complexes (proposés par Lord William Hamilton 19 siècle) disposant de trois parties imaginaires : q = a + b*i + c*j + d*k avec i*i = -1, j*j = -1, k*k = -1 La multiplication de deux de ces nombres se comporte comme le produit vectoriel de vecteurs unitaires orthogonaux : i*j = -j*i = k j*k = -k*j = i k*i = -i*k = j Le conjugué et la norme d'un quaternion se calculent de façon similaire aux nombres complexes. Le conjugué ne note q' ou q* (nous choisirons la notation q' pour ne pas avoir d'ambiguïté avec le symbole de multiplication) : q = w + x*i + y*j + z*k q' = w x*i y*j z*k La norme d'un quaternion est définie par : q = sqrt(q*q') = sqrt(w² + x² + y² + z²) q' = q q0*q1 = q0 * q1 La multiplication de quaternions est associative : (q1 * q2)*q3 = q1*(q2*q3) La multiplication de quaternions n'est pas commutative : q1*q2 q2*q1 1

3 Représentation des quaternions Les quaternions peuvent être représentés de différentes façons : comme une combinaison linéaire de 1, i, j, k, comme un vecteur de 4 coefficients, comme un scalaire pour le coefficient de la partie réelle et comme un vecteur pour les coefficients de la partie imaginaire. Les quaternions sont donc donnés par : qn = wn + xn*i + yn*j + zn*k ou par : qn = [xn yn zn wn] ou par : qn = (sn, Vn) avec : n IN, xn, yn, zn, wn IR avec sn IR et Vn = [xn yn zn] 4 Algèbre de quaternions 4.1 Addition et Soustraction q0 + q1 = (w0 + x0*i + y0*j + z0*k) + (w1 + x1*i + y1*j + z1*k) = (w0 + w1) + (x0 + x1)*i + (y0 + y1)*j + (z0 + z1)*k q0 - q1 = (w0 + x0*i + y0*j + z0*k) - (w1 + x1*i + y1*j + z1*k) = (w0 - w1) + (x0 - x1)*i + (y0 - y1)*j + (z0 - z1)*k 4.2 Multiplication q0*q1 = (w0 + x0*i + y0*j + z0*k)* (w1 + x1*i + y1*j + z1*k) = (w0*w1 x0*x1 y0*y1 z0*z1) + (w0*x1 + x0*w1 + y0*z1 z0*y1)*i + (w0*y1 x0*z1 + y0*w1 +z0*x1)*j + (w0*z1 + x0*y1 y0*x1 + z0*w1)*k Ce qui peut s'écrire : q0*q1 = (w0 + x0*i + y0*j + z0*k)* (w1 + x1*i + y1*j + z1*k) = w0*q1 + x0*i*q1 + y0*j*q1 + z0*k*q1 = w0*(w1 + x1*i + y1*j + z1*k) + x0*i*(w1 + x1*i + y1*j + z1*k) + y0*j*(w1 + x1*i + y1*j + z1*k) + z0*k*(w1 + x1*i + y1*j + z1*k) = w0*w1 + w0*x1*i + w0*y1*j + w0*z1*k + x0*w1*i x0*x1 + x0*y1*k x0*z1*j + y0*w1*j - y0*x1*k - y0*y1 + y0*z1*i + z0*w1*k + z0*x1*j - z0*y1*i - 0*z1 Le produit de deux quaternions peut être écrit dans la représentation (s, V) en utilisant le produit de vecteurs de la façon suivante : 2

q0 = (s0, V0) q1 = (s1, V1) q0*q1 = (s0*s1 V0.V1, s0*v1 + s1*v0 + V0xV1) Avec cette représentation, il est clair que q0*q1 = q1*q0 si et seulement si V0xV1 = 0 (les deux vecteurs sont parallèles). 4.3 Partie réelle d'un quaternion Un opérateur retournant la partie réelle d'un quaternion est utilisé : W(q) = W(w + x*i + y*j + z*k) = w 4.4 Multiplication par un scalaire t*q = q*t = (t*w, t*x, t*y, t*z) 4.5 Produit scalaire de deux quaternions Un quaternion pouvant être vu comme un vecteur 4D, le produit scalaire de deux quaternions est : q0.q1 = w0*w1 + x0*x1 + y0*y1 + z0*z1 = q1.q0 = W(q0*q1') = W(q1*q0') 4.6 Inverse d'un quaternion L'inverse d'un quaternion q, notée q -1 a les propriétés suivantes : q* (q) -1 = (q) -1 *q = 1 (q) -1 = q' / q ((q) -1 ) -1 = q (q0*q1) -1 = (q1) -1 (q0) -1 4.7 Quaternion unitaire Un quaternion de longueur 1 est appelé quaternion unitaire (unit quaternion) et il est tel que : qu = 1 => (qu) -1 = qu' (qu) -1 = 1 qu' = 1 Le produit de deux quaternions unitaires est lui aussi unitaire : qu0 = 1 et qu1 = 1 => qu0*qu1 = 1 Un quaternion unitaire peut être représenté par : qu = cos(θ) + V*sin(θ) où V est un vecteur 3D de longueur 1. Avec les nombres complexes : exp(i*θ) = cos(θ) + i*sin(θ) De la même manière, avec les quaternions : exp(v*θ) = cos(θ) + V*sin(θ) Ce qui permet d'introduire l'élévation à la puissance d'un quaternion unitaire : qu t = (cos(θ) + V*sin(θ)) t = exp(v*t*θ) = cos(t*θ) + V*sin(t*θ) Il est aussi possible de définir le log d'un quaternion unitaire : log(qu) = log(cos(θ) + V*sin(θ)) = log(exp(v*θ)) = V*θ 3

Attention : A cause de la non-commutativité de la multiplication de quaternions, exp(pu)*exp(qu) et exp(pu+qu) ne sont pas nécessairement égaux. De même log(pu*qu) et log(pu)+log(qu) ne sont pas nécessairement égaux. 5 Représentation des rotations par des quaternions 5.1 Présentation Un quaternion q représente la rotation d'un vecteur U d'un angle 2*θ autour du vecteur unitaire Vu. q = cos(θ) + Vu*sin(θ) = (cos(θ),vu[0]*sin(θ), Vu[1]*sin(θ), Vu[2]*sin(θ)) Un point p de l'espace est représenté par le quaternion p = (0, U). Le vecteur résultant, représenté par un quaternion est : protated = q*p*q -1 Si q est un quaternion unitaire, on peut utiliser le fait que q -1 = q'. 5.2 Concaténation de rotations La nécessité de combiner des rotation est très fréquente (manipulation d'objets par la souris où chaque mouvement de la souris équivaut à une rotation devant de combiner aux précédentes). Ceci se fait très aisément avec les quaternions de façon vraiment moins coûteuse que par la technique matricielle. qu1 et qu2 sont deux quaternions unitaires représentant 2 rotations. Pour appliquer qu1 en premier et qu2 ensuite, nous devons appliquer qu2 au résultat de l'application de qu1, regrouper les résultats grâce à l'associativité de la multiplication, et trouver la rotation résultante représentée par qu1*qu2 : qu2*(qu1*p*qu1-1 )*qu2-1 = (qu2*qu1)*p*(qu1-1 *qu2-1 ) = (qu2*qu1)*p*(qu2*qu1) -1 Ainsi, l'enchaînement de deux rotations représentées par deux quaternions unitaires est une rotation représentée par le quaternion équivalent à la multiplication des deux quaternions. qu = qu2*qu1 (rotation qu1 suivie de rotation qu2). 5.3 Interpolation linéaire sphérique L'angle θ est l'angle entre les deux vecteurs V1, V2 de q1, q2 : θ = acos(q1.q2) Quaternion slerp (t; q1; q2) = q1*(q1-1 *q2) t Ce qui équivaut à : Quaternion slerp (t; q1, q2) = (q1*sin((1-t)*θ) + q2*sin(t*θ)) / sin(θ) avec 0 < t < 1 Pour deux orientations très proches l'une de l'autre, on peut se contenter d'une interpolation linéaire simple. 6 Preuve que les quaternions permettent la mise en œuvre de rotations 4

Un quaternion unitaire qu = cosθ + V*sinθ représente la rotation d'un vecteur 3D U autour d'un axe 3D V. Le vecteur subissant la rotation, représenté comme un quaternion est donné par rot(u) = qu*q*qu', avec q = (0, U). Pour prouver ceci il faut tout d'abord montrer que rot(u) est une fonction possédant les propriétés suivantes : - le résultat est un vecteur 3D, - conservation des longueurs des vecteurs 3D, - Rot(U) est une transformation linéaire. 6.1 Rot(U) est un vecteur 3D W(rot(U)) = W(qu *q* qu ') // (q + q ')/2 = W(q) = w (les facteurs de i, j et k s'annulent) = ((qu *q* qu ') + (qu *q* qu')') / 2 // (q')' = q; (p*q)' = q'*p' // (qu *(q* qu'))' = (q* qu')'* qu ' = qu *q'* qu ' = (qu *q* qu ' + qu *q' qu ') / 2 = qu ((q + q') / 2)* qu ' = qu *W(q)* qu ' = W(q) = 0 6.2 Conservation des longueurs des vecteurs 3D rot(u) = qu *q* qu ' = qu * q * qu ' = qu * q * qu // qu étant un quaternion unitaire = q = U 6.3 Rot(U) est une transformation linéaire rot(a*u1+u2) = qu *(a*q1+q2)* qu ' // en développant le calcul on vérifie la distributivité de la // multiplication par rapport à l'addition = (qu *a*q1* qu ') + (qu *q2* qu ') = a*( qu *q1* qu ') + (qu *q2* qu ') = a*rot(u1) + rot(u2) 6.4 Preuve 6.4.1 Vecteur subissant la rotation Dans la figure suivante, le vecteur unitaire U est l'axe de rotation. Le vecteur V va subir une rotation autour de U d'un angle θ pour obtenir le vecteur résultat : Vrotated. Le schéma suivant présente le plan de U,V. Le vecteur UxV (noté V0) "sort" de la page. V1 est le résultat de la projection de V sur l'axe U. V2 est le résultat de la projection de V sur l'axe perpendiculaire à U. V2 = V V1 5

V0 = UxV (U.V)*U = cos(α)* U * V *U = cos(α)* V *U cos(α) = V1 / V V1 = cos(α)* V d'où (U.V)*U = V1 *U Figure 1 : Positionnement de V par rapport à U unitaire - Représentation des vecteurs utilisés L étape suivante est de déterminer la représentation du vecteur Vrotated exprimée relativement à U, V et θ. Ensuite, il restera à vérifier que les opérations sur les quaternions produisent le même résultat. Figure 2 : Représentation de Vrotated 6

Figure 3 : Projection de Vrotated sur le plan V2,V0 Figure 4 : Projection de Vrotated sur le plan V1,V2 Ainsi, le vecteur Vrotated peut être exprimé relativement aux trois vecteurs utilisés : Vrotated = V1 + cosθ*v2 + sinθ*v0 6.4.2 Vérification du résultat de la rotation effectuée grâce aux quaternions Conformément aux principes sur les quaternions énoncés précédemment, une rotation peut être effectuée sur un vecteur grâce au produit de quaternions : p = (0, V) qu = (cos(θ/2), U*sin(θ/2)) protated = qu*p*qu -1 Rappel de la formule vectorielle de multiplication de quaternions : q1 = (s1, V1) q2 = (s2, V2) q1*q2 = (s1*s2 V1.V2, s1*v2 + s2*v1 + V1xV2) Pour vérifier la formule précédente nous substituons à qu -1 la valeur qu' étant donné que qu est unitaire. Il est à noter qu'on utilise le fait que : U.V = V.U UxV = -VxU 7

(UxV).U = 0 // car UxV est perpendiculaire à U (UxV)xU = V2 = V-(U.V)*U sin(θ) = sin(θ/2 + θ/2) = sin(θ/2)*cos(θ/2) + sin(θ/2)*cos(θ/2) = 2*sin(θ/2)*cos(θ/2) cos(θ) = cos(θ/2 + θ/2) = cos(θ/2)*cos(θ/2) - sin(θ/2)*sin(θ/2) = cos²(θ/2) - sin²(θ/2) sin²(θ/2) + cos²(θ/2) = 1 2*sin²(θ/2) = sin²(θ/2) + sin²(θ/2) + cos²(θ/2) - cos²(θ/2) = 1 (cos²(θ/2) - sin²(θ/2)) = (1 - cos(θ)) protated = qu*p*qu' = (cos(θ/2), U*sin(θ/2)) * (0, V) * (cos(θ/2), -U*sin(θ/2)) = [(cos(θ/2), U*sin(θ/2)) * (0, V)] * (cos(θ/2), -U*sin(θ/2)) = (-sin(θ/2)*(u.v), cos(θ/2)*v + sin(θ/2)*(uxv) * (cos(θ/2), -U*sin(θ/2)) = (-sin(θ/2)*cos(θ/2)*(u.v) + sin(θ/2)*cos(θ/2)*(v.u) sin²(θ/2)*((uxv).u), (sin²(θ/2)*(u.v))*u + cos²(θ/2)*v + (sin(θ/2)*cos(θ/2))*(uxv) - (sin(θ/2)*cos(θ/2))*(vxu) - sin²(θ/2)*((uxv)xu) ) protated = (0, (sin²(θ/2)*(u.v))*u + cos²(θ/2)*v + 2*(sin(θ/2)*cos(θ/2))*(UxV) - sin²(θ/2)*(v (U.V)*U) ) = (0, 2*(sin²(θ/2)*(U.V))*U + (cos²(θ/2) - sin²(θ/2))*v + 2*(sin(θ/2)*cos(θ/2))*(UxV) ) = (0, ((1 cos(θ))*(u.v))*u + cos(θ)*v + sin(θ)*(uxv)) = (0, (U.V))*U + cos(θ)*(v (U.V)*U) + sin(θ)*(uxv)) = expression vectorielle de la rotation de vecteur = (0, Vrotated) 7 Exercices 7.1 Animation et quaternions 7.1.1 Comment passer d'une rotation définie selon la convention OpenGL à un quaternion et réciproquement Avec OpenGl, une rotation est donnée par un axe autour duquel s'effectue la rotation, et un angle. Le quaternion équivalent q (s, V) est donné par : axeangle2quaternion (double angle ; Vecteur axe ; Quaternion * q) { normer (axe) q.s = cos(angle/2) ; q.v = sin(angle/2)*axe ; } Pour obtenir la rotation exprimée sous forme OpenGL à partir d un quaternion : 8

quaternion2axeangle (Quaternion q ; double * angle ; Vecteur * axe) { phi = acos(q.s) ; Si sin(phi) 0 Alors axe = q.v / sin(phi) ; Sinon axe = Z ; // n importe quel vecteur Fin si normer (axe) angle = 2 * phi ; } 7.1.2 Pourquoi n'y a-t-il aucun problème avec angle = 0, PI ou 2*PI q.s représente cos(angle/2). Dans quel cas sin(phi) = sin(angle/2) = 0? - Quand phi = 0, angle = 0, une rotation nulle => aucun problème si angle quelconque, - Quand phi = pi, angle = 2*pi, donc rotation nulle. 7.1.3 Animation d un seul segment de robot Donner la structure de données associée à un seul segment de bras de robot dont la géométrie est un parallélépipède rectangle. Le type Boîte est défini ainsi que l opérateur de tracé d une Boîte (traceboite (Boite b) {//trace d une boite}). type Segment = { Boite b ; Quaternion orientationinit ; Quaternion orientationfinale ; Vecteur position; } // position de la boite (translation) Ecrire l opérateur de tracé OpenGL d un segment de bras de robot utilisant la fonction slerp. tracesegment (Segment seg; double t) // le segment est tracé en t (0<=t<=1){ Vecteur axe ; double angle ; Quaternion q ; // détermination du quaternion représentant la rotation à l instant t q = slerp (t, seg.orientationinit, seg.orientationfinale) ; // détermination de l axe-angle nécessaires à OpenGL quaternion2axeangle (q, &angle, &axe) ; gltranslate (seg.position[0], seg.position[1], seg.position[2]) ; glrotate (angle, axe[0], axe[1], axe[2]) ; traceboite (seg.b) ; // attention, la pile de matrice est affectée par l opération, dans le cas // où ceci n est pas souhaité, la préservation de la pile reste à l appelant } 9

7.1.4 Animation d un bras multisegment Structure de données. On peut faire un bras de robot linéaire en utilisant une liste de Segments. On peut avoir une structure plus complexe en prenant un arbre de Segments. Le traitement reste identique, seul le parcours de la structure change. On considère que la position du (i)ème bras est donnée relativement à la position du (i-1)ème. Donc gérer la pile de matrice en ce sens. On va traiter une liste de Segments : type ListeSegment; type CelluleSegment = {Segment s; ListeSegment * segmentsuivant;} type ListeSegment = access CelluleSegment; tracelistesegment (ListeSegment ls; double t) { Si ls /= null Alors tracesegment (ls->segment, t); tracelistesegment (ls->segmentsuivant, t); Fsi } main ( ) { // déclarations utiles // tracer le bras multi-segments glpushmatrix (); Pour t := 0; t <= 1; t:= t + deltat Faire tracelistesegment (teteliste, t); FinPour glpopmatrix (); } 7.2 Mouvements de caméra On souhaite gérer grâce à des interactions souris ou clavier les déplacements d'une caméra placée dans une scène 3D. La position d'une caméra est celle de l'observateur correspondant. Cet observateur se trouve sur une sphère. Le centre de la sphère est le point visé. Le centre est exprimé dans le repère de la scène. L'orientation d'une caméra est donnée principalement par la donnée d'un axe de rotation (unitaire) donné dans le repère de la sphère (xs, ys, zs) + un angle de rotation autour de cet axe. Mais aussi par les coordonnées des trois vecteurs unitaires (xc, yc, zc) qui forment le repère de la caméra par rapport au repère de la sphère. Ces transformations s'appliquent à la position par défaut de la caméra pour fournir la position courante de la caméra. 10

La position de l'observateur se calcule par : observateur = centre - rayon * zc Caméra par défaut : On désire piloter les déplacements de la caméra de la façon suivante : cap (pitch) : rotation autour de yc sans changement de position, roulis (roll) : rotation autour de zc sans changement de position, tangage (yaw) : rotation autour de xc sans changement de position, déplacement selon un axe du repère sans changement d'orientation, rapprochement ou éloignement du centre de la sphère, changement de la position de l'observateur sur la sphère où il se trouve, avec le point visé inchangé (déplacement exprimé en coordonnées polaires (du, dv)). 7.2.1 Passage de la représentation (axe, angle) à la représentation (xc, yc, zc) Pour passer de la représentation (axe, angle) au repère de la caméra donné par trois vecteurs, on peut utiliser la gestion de matrices de OpenGL. 1. Sauvegarder l'état courant de la matrice (glgetintegerv(gl_matrix_mode, &matrix) 2. Passer en mode de gestion du repère scène (glmatrixmode(gl_modelview)) 3. Initialiser la pile de matrices (glpushmatrix et glloadidentity) 4. Effectuer une rotation de l'angle en degrés autour de l'axe (glrotatef) 5. Récupérer la matrice ainsi générée (glgetfloatv(gl_modelview_matrix, mat)) 6. Restaurer la pile de matrices (glpopmatrix, glmatrixmode(matrix)) 7. Initialiser le repère de la caméra avec les valeurs de la matrice mat xc yc zc mat[0] mat[4] -mat[8] // repère indirect mat[1] mat[5] -mat[9] mat[2] mat[6] -mat[10] Normaliser les 3 vecteurs 7.2.2 Cap, roulis, tangage Ces trois changements d'orientations se font de la même manière mais selon un axe donné. Ils modifient l'axe et l'angle de visée de la caméra. 1. Transformer le couple (axe, angle) en quaternion : q1 = (cos(angle/2), sin(angle/2)*axe). 11

2. Transformer le couple (axe_repère (xc ou yc ou zc), angle_repère) en quaternion : q2 = (cos(angle_repère/2), sin(angle_repère/2)*axe_repère). 3. Multiplier q1 par q2 pour obtenir une rotation qui est la combinée des deux autres : q3. 4. Mettre à jour axe et angle à partir du quaternion résultat q3. 5. Mettre à jour le repère de la caméra (xc, yc, zc) grâce à (axe, angle). 6. Calcul du nouveau centre de la sphère : centre = position + rayon * zc. 7.2.3 Déplacement selon un axe du repère sans changement d'orientation Seuls le centre et la position sont modifiés. 1. Position = position + déplacement * axe_repère. 2. Calcul du nouveau centre de la sphère : centre = position + rayon * zc. 7.2.4 Rapprochement ou éloignement du centre de la sphère Le centre et l'orientation restent inchangés. 1. Modification du rayon qui reste > 0. 2. Mise à jour de la position de la caméra : position = centre rayon * zc. 7.2.5 Changement de la position de l'observateur sur la sphère (du, dv) La valeur du représente un angle de déplacement sur la sphère le long d'un parallèle, et dv le long d'un méridien. Pour prendre en compte du, on effectue une rotation autour de l'axe ys et pour dv, autour de l'axe x's qui est à déterminer. 1. Transformer le couple (axe, angle) en quaternion : q1 = (cos(angle/2), sin(angle/2)*axe). 12

2. Créer le quaternion représentant la rotation de l'angle du autour de l'axe ys : q2. 3. Créer le quaternion représentant la rotation de l'angle du autour de l'axe x's : q3. 4. Multiplier q1 par q2 pour appliquer à la caméra la rotation autour de ys : q4. 5. Multiplier q1 par q2 pour appliquer à la caméra la rotation autour de x's: q5. 6. Mettre à jour axe et angle à partir du quaternion résultat q5. 7. Mettre à jour le repère de la caméra (xc, yc, zc) grâce à (axe, angle). 8. Mettre à jour de la position de la caméra : position = centre rayon * zc. 13