Tutorial n°3 : MAJ du 24/10/2001
III) Translations, rotations, changements de repères :
On considèrera tout le long que l'axe X est l'axe dirigé vers la droite, l'axe Y celui dirigé vers le haut et l'axe Z dirigé de l'écran vers nous.
Pour toutes ces transformations, 2 possibilités s'offrent à nous :
- calcul des nouvelles coordonnées sous la forme x' = f(x, y, z) y' = g(x, y, z) z' = h(x, y, z).
- calcul à l'aide de matrices sous la forme P' = M.P où P est le vecteur coordonnées.
1) Quelques rappels (ou plutôt quelques notions) sur les matrices...
a) Addition de matrices :
Soit une matrice A de taille (n=nb_lignes, m=nb_colonnes), une matrice B de même taille.
La matrice C telle que C = A + B est telle que c[i, j] = a[i, j] + b[i, j] (i allant de 1 à n et j de 1 à m).
Exemple :
Soit A = 2 1 5 6 de taille (3, 4)
3 2 1 4
4 2 4 3
et B = 5 1 2 3
1 2 5 4
7 8 2 1
On a alors C = 2+5 1+1 5+2 6+3 = 7 2 7 9
3+1 2+2 1+5 4+4 4 4 6 8
4+7 2+8 4+2 3+1 11 10 6 4
Remarque : On a A+B = B+A (toujours)
b) Multiplication de matrices :
Soit une matrice A de taille (n1, m1), une matrice B de taille (m1, m2).
La matrice C telle que C = A.B est telle que c[i,j] = Somme (pour k=1 à m1) a[i, k] + b[k, j] (i allant de 1 à n1 et j de 1 à m2) et est de taille (n1, m2). En clair, on multiplie la ligne i de la matrice A par la colonne j de la matrice B.
Exemple :
Soit A = 2 1 5 6 de taille (2, 4)
3 2 1 4
et B = 5 1 7 de taille (4, 3)
1 2 6
7 8 2
9 1 5
On a alors :
c[1, 1] = 2*5 + 1*1 + 5*7 + 6*9 = 100
c[1, 2] = 2*1 + 1*2 + 5*8 + 6*1 = 50
...
c[2, 1] = 3*5 + 2*1 + 1*7 + 4*9 = 60
...
Et C = 100 50 60 de taille (2, 3) (sauf erreur de calcul de ma part...)
60 19 55
Remarque : On a A.B différent de B.A (en général)
Voilà pour les quelques notions nécessaires...
Passons maintenant aux choses sérieuses (enfin plutôt intéressantes que sérieuses).
2) Les coordonnées homogènes :
Soit le point p de coordonnée (x, y, z) reprensenté par le vecteur P = x
y
z
Le vecteur X = xh représente aussi le point p mais en coordonnées homogènes
yh
zh
w
à condition que xh/w = x, yh/w = y et zh/w = z.
En général, on pose w=1.
Cette représentation nous permettra de représenter toutes nos transformations par des produits de matrices (4,4).
Pour chacune des transformations suivantes, on posera :
p le point de coordonnée (x, y, z) reprensenté par le vecteur P = x
y
z
et p' le point image de coordonnée (x', y', z' reprensenté par le vecteur P' = x'
y'
z'
On posera X tel que X = xh=x
yh=y
zh=z
w=1
et de même X' tel que X' = xh'=x'
yh'=y'
zh'=z'
w'=1
3) Les transformations :
a) Translations :
p' est l'image de p par la translation de vecteur T = tx
ty
tz
Première solution :
On a sans les matrices :
x' = x + tx
y' = y + ty
z' = z + tz
D'où P' = P + T sous forme matricielle
Deuxième solution (coordonnées homogènes):
T' = 1 0 0 tx
0 1 0 ty
0 0 1 tz
0 0 0 1
On a alors X' = T'.X
b) Rotations :
On utilisera les angles d'Eulers pour les matrices de rotation :
Rotation autour de X: sens positif = de Y vers Z
Rotation autour de Y: sens positif = de Z vers X
Rotation autour de Z: sens positif = de X vers Y
* rotation d'angle a autour de l'axe des Z:
Première solution :
On a sans les matrices :
x' = xcos(a) - ysin(a)
y' = xsin(a) + ycos(a)
z' = z
Petite preuve :
Cela revient à faire une rotation dans le plan défini par l'axe des X et l'axe des Y.
On pose p = x+i*y (forme complexe).
On a p' = exp(i*a)*p = (cos(a)+i*sin(a)).(x+i*y) = ... = (xcos(a)-ysin(a)) + i*(xsin(a)+ycos(a))
D'où le résultat voulu...
En posant R = cos(a) -sin(a) 0
sin(a) cos(a) 0
0 0 1
On a donc P' = R.P sous forme matricielle
Deuxième solution (coordonnées homogènes):
C'est la même chose avec w' = w.
On pose donc R' = cos(a) -sin(a) 0 0
sin(a) cos(a) 0 0
0 0 1 0
0 0 0 1
On a donc X' = R'.X
* rotation d'angle a autour de l'axe des X:
Première solution :
On a sans les matrices :
x' = x
y' = ycos(a) - zsin(a)
z' = ysin(a) + zcos(a)
En posant R = 1 0 0
0 cos(a) -sin(a)
0 sin(a) cos(a)
On a donc P' = R.P sous forme matricielle
Deuxième solution (coordonnées homogènes):
On pose donc R' = 1 0 0 0
0 cos(a) -sin(a) 0
0 sin(a) cos(a) 0
0 0 0 1
On a donc X' = R'.X
* rotation d'angle a autour de l'axe des Y:
Première solution :
On a sans les matrices :
x' = xcos(a) + zsin(a)
y' = y
z' = -xsin(a) + zcos(a)
En posant R = cos(a) 0 sin(a)
0 1 0
-sin(a) 0 cos(a)
On a donc P' = R.P sous forme matricielle
Deuxième solution (coordonnées homogènes):
On pose donc R' = cos(a) 0 sin(a) 0
0 1 0 0
-sin(a) 0 cos(a) 0
0 0 0 1
On a donc X' = R'.X
c) Composition de transformations :
Exemple 1: Effectuer une rotation R puis une translation T
Dans le cas des coordonnées "normales", on a P' = T + (R.P) qui ne se simplifie pas.
Par contre pour les coordonnées homogènes, on a X' = T.R.X = M.X où M=T.R
On a M = r r r tx où R est la matrice (3, 3)
r r r ty correspondant à la rotation voulue
r r r tz dans les coordonnées "normales".
0 0 0 1
Exemple 2: Passage des coordonnées réelles aux coordonnées écran :
c1) Passage du repère R au repère Caméra :
On suppose connaître les coordonnées de chaque sommet dans le repère R.
On connaît aussi les coordonnées de la caméra (cx,cy,cz) dans le repère R.
On supposera aussi que la caméra ne peut effectuer des rotations qu'autour de l'axe des Y.
Pour passer du repère R au repère caméra, il nous suffira donc d'effectuer une translation de vecteur (-cx,-cy,-cz),
puis d'effectuer une rotation d'angle -a autour de l'axe des Y.
On aura donc X' = R.T1.X
où T1 = 1 0 0 -cx
0 1 0 -cy
0 0 1 -cz
0 0 0 1
et R = cos(-a) 0 sin(-a) 0
0 1 0 0
-sin(-a) 0 cos(-a) 0
0 0 0 1
c2) Projection :
On souhaite projeter les points exprimés dans le repère caméra sur le plan E.
Le point A a projeté sur E a pour coordonnées (x,y,z).
Le plan E étant situé à une distance f (distance focale) de la caméra,
on a par le théorème de Thales :
x'/x = f/z <=> x' = f.x/z
De même y' = f.y/z
et z' = f
Ce qui revient à mettre w'=z/f, x'=x, y'=y et z'=z.
On aura donc la matrice de projection suivante :
P = 1 0 0 0
0 1 0 0
0 0 1 0
0 0 1/f 0
c3) Passage du repère du plan E aux coordonnées écran :
Le problème est que l'écran (de taille tx,ty) à son point d'origine situé en haut à gauche et que l'axe des Y est dirigé vers le bas.
On aura donc x' = x+tx/2
et y' = -y+ty/2
D'ou la matrice correspondante :
T2 = 1 0 0 tx/2
0 -1 0 ty/2
0 0 1 0
0 0 0 1
Pour avoir les coordonnées écran de chaque point à partir des coordonnées réelles, il suffira donc de faire :
X' = T2.P.R.T1.X = M.X
où M = cos(a)+tx.sin(a)/2f 0 -sin(a)+tx.cos(a)/2f -cx.cos(a)+cz.sin(a)-tx.(cx.sin(a)+cz.cos(a))/2f
ty.sin(a)/2f -1 ty.cos(a)/2f cy-ty.(cx.sin(a)+cz.cos(a))/2f
sin(a) 0 cos(a) -(cx.sin(a)+cz.cos(a))
sin(a)/f 0 cos(a)/f -(cx.sin(a)+cz.cos(a))/f
En posant ca=cos(a), sa=sin(a), TX=tx/2f, TY=ty/2f, cxz=cx.sa+cz.ca, on obtient :
M = ca+TX.sa 0 TX.ca-sa -cx.ca+cz.sa-TX.cxz
TY.sa -1 TY.ca cy-TY.cxz
sa 0 ca -cxz
sa/f 0 ca/f -cxz/f
D'où w' = (x.sa + z.ca -cxz)/f
xe = ((ca+TX.sa).x + (TX.ca-sa).z - cx.ca + cz.sa - TX.cxz)/w'
et ye = ((TY.sa).x -y + (TY.ca).z + cy - TY.cxz)/w'
Dernière remarque : lorsque l'on est en 320x200, le format de l'écran est 4/3=8/6 et celui de la résolution est 8/5.
Il faut donc multiplier ye par 5/6.
[edtdd]--Message édité par Dav Vador--[/edtdd]