Sunteți pe pagina 1din 14

Elemente de geometrie computaional.

Sisteme de coordonate. Transformri 3D.


Sistem de axe de coordonate
Sistem orientat drept:

Sistem orientat stng:

Punct
Un punct P din R
3
se poate preciza prin:
Coordonate carteziene: P(x, y, z)
Coordonate omogene: P(x, y, z, u)
Coordonate cilindrice: P(, r, z)
Coordonate sferice: P(r, , )

Conversia de la coordonate carteziene la cele omogene: (x,y,z) => (x,y,z,1)
z
y
x
O O
P(x,y,z)
O
P(, r, z)
P(r, , )
r
z

r


carteziene
cilindrice
sferice
y
z
z
y
x
O
sau
x O
y
z
z
y
x
O
sau
x O
Conversia de la coordonate omogene la cele carteziene: (x,y,z,u) => (x/u,y/u,z/u), pentru
u 0
Avantajele folosirii coordonatelor omogene (dup cum se va vedea n continuare):
descriere unitar a diverselor transformri
o succesiune de transformri se poate descrie cu ajutorul unei singure matrice de
transformare
In OpenGL un vrf dintr-o primitiv de desenare se precizeaz astfel:
) ]( [
4
3
2
glVertex coordonate v
ui
us
ub
f
i
s
b


unde numrul i tipul argumentelor se precizeaz n comand.
Cu dou dimensiuni n comand se preupune c valoarea z=0, iar cu 4 valori se
precizeaz coordonatele omogene.
Exemple:
glVertex2i(1, 0);
glVertex3f(0.0f, 1.5f, 2.0f);
In diferitele calcule (transformri) un punct (dat prin coordonate omogene) se reprezint
printr-o matrice coloan:
P=
|
|
|
|
|

\
|
w
z
y
x

Vector
Un vector este determinat de dou vrfuri i un sens
Un vector are: origine, direcie (suport
i sens), lungime.
Fie vectorul:

AB , A(x
1
, y
1
, z
1
), B(x
2
, y
2
, z
2
)
Vectorul

AB este paralel i de aceeai
lungime cu vectorul

OP , unde:
P(x
2
- x
1
, y
2
- y
1
, z
2
- z
1
).
Fie

v (a, b, c), atunci (a, b, c) sunt


parametrii directori ai vectorului,
iar
2 2 2
c b a v + + = este lungimea vectorului
Fie

u (a, b, c),

v (a', b', c'), doi vectori.


O
y
x
B
A
P
Produsul scalar: scalar(u,v) = aa'+bb'+cc' = ) cos( . . t v u , unde t este unghiul dintre
cei doi vectori. Cu produsul scalar se poate calcula unghiul dintre doi vectori.
Dac produsul scalar este nul, atunci cei doi vectori sunt perpendiculari.
Produsul vectorial: vect(u,v) este un vector w
perpendicular pe planul determinat de vectorii u
i v i pentru care triedrul (u,v,w) este drept.
) ' ' ( ) ' ' ( ) ' ' (
' ' '
b a ab k c a ac j c b bc i
c b a
c b a
k j i
w + = =
r r r
r r r
r
,
deci ) ' ' , ' ' , ' ' ( b a ab c a ac c b bc w
r

Alte operatii utile cu vectori:
o adunarea a doi vectori
o produsul unui vector cu un scalar
o scderea a doi vectori
o combinaia liniar a doi sau mai muli vectori
Plan
Un plan se poate preciza n urmtoarele moduri:
1. Planul care trece prin punctul P(a,b,c) i este perpendicular pe vectorul

v (A, B, C):
Ax + By + Cz + D = 0,
unde D= -Aa-Bb-Cc (punctul P aparine planului).
Se observ c parametrii directori ai normalei la plan sunt coeficienii variabilelor din
ecuaia planului:

2. Planul determinat de trei puncte P
i
(x
i
, y
i
, z
i
), i=1,2,3 (ecuaia planului sub form de
determinant) este:
0
1
1
1
1
3 3 3
2 2 2
1 1 1
=
z y x
z y x
z y x
z y x

3. Planul determinat de trei puncte P
i
(x
i
, y
i
, z
i
), i=1,2,3 (ecuaia planului sub form
parametric) este:

+ + =
+ + =
+ + =
), ( ) (
), ( ) (
), ( ) (
1 3 1 2 1
1 3 1 2 1
1 3 1 2 1
z z v z z u z z
y y v y y u y y
x x v x x u x x
unde R v u ,
(A, B, C)
P(a,b,c)
u
w
v
t
Probleme utile:
Determinarea distanei de la un punct P(a, b, c) la planul () Ax+By+Cz+D=0
Determinarea unghiului dintre dou plane
Condiia ca dou plane s fie perpendiculare
Dreapta
1. O dreapt se poate da prin intersecia a dou plane:

= + + +
= + + +
0
0
2 2 2 2
1 1 1 1
D z C y B x A
D z C y B x A
sau echivalent:

+ =
+ =
q pz y
n mz x ,

2. O dreapt care trece prin dou puncte P
i
(x
i
, y
i
, z
i
), i=1,2, are ecuaia:

1 2
1
1 2
1
1 2
1
z z
z z
y y
y y
x x
x x

,
sau parametric (mai uor de folosit):

+ =
+ =
+ =
R t z z t z z
y y t y y
x x t x x
), (
), (
), (
1 2 1
1 2 1
1 2 1

3. O dreapt care trece prin punctul P(x
0
, y
0
, z
0
) i are direcia dat de vectorul

v (a, b, c):

c
z z
b
y y
a
x x
0 0 0

=

,
sau sub form parametric (mai util):

+ =
+ =
+ =
R t tc z z
tb y y
ta x x
,
,
,
1
1
1

Transformari 3D de baza
Un punct P(x,y,z) se poate transforma uor ntr-un punct P'(x', y', z') printr-o
matrice 4x4, dac P i P' se precizeaz n coordonate omogene:
P(x,y,z,1) ---> P'(x', y', z',1)
( ) ( ) , 1 1 ' ' ' A z y x z y x = unde:
|
|
|
|
|

\
|
=
44 43 42 41
34 33 32 31
24 23 22 21
14 13 12 11
a a a a
a a a a
a a a a
a a a a
A ,
sau
|
|
|
|
|

\
|
=
|
|
|
|
|

\
|
1 1
'
'
'
z
y
x
T
z
y
x
, unde T=A
t
(transpusa lui A).
In OpenGL se folosete a doua variant de precizare a transformrii, cu un vector
coloan pentru coordonatele omogene ale unui punct.
In continuare se va determina matricea T pentru diverse transformri de baz.

Translaia
Translaia este transformarea prin care toate punctele unui obiect se deplaseaz n
aceeai direcie i cu aceeai distan.
Precizarea acestei transformri se poate face n trei moduri:
1. Prin indicarea deplasrilor, pe cele trei axe de coordonate, (dx, dy, dz), deplasri
pozitive sau negative, necesare pentru a transforma un punct iniial P
1
(x
1
, y
1
, z
1
) n
punctul final P
2
(x
2
, y
2
, z
2
):
x
2
= x
1
+ dx,
y
2
= y
1
+ dy,
z
2
= z
1
+ dz
Lungimea cu care se face translaia este:
2 2 2
dz dy dx d + + =
2. Prin precizarea direciei, un vector:

v (a, b, c), i a lungimii deplasrii: d.


Ecuaia dreptei care trece prin P
1
(x
1
, y
1
, z
1
) (punctul care se transform) i are direcia

v este:
x= x
1
+at, y=y
1
+bt, z=z
1
+ct.
Deoarece punctul P
2
(x
2
, y
2
, z
2
) = P
2
(x
1
+dx, y
1
+dy, z
1
+dz) va fi pe aceast dreapt, iar
distana dintre P
1
i P
2
va fi d, se determin:
2 2 2
/ c b a d t + + = , deci:
2 2 2
2 2 2
2 2 2
/
, /
, /
c b a c d dz
c b a b d dy
c b a a d a t dx
+ + =
+ + =
+ + = =

3. Prin coordonatele (x
2
, y
2
, z
2
) n care se translateaz (x
1
, y
1
, z
1
), deci:
dx = x
2
- x
1
, dy = y
2
- y
1
, dz = z
2
- z
1
.
Folosind valorile (dx, dy, dz), care se pot determina pentru fiecare caz, matricea de
translaie este:
|
|
|
|
|

\
|
=
1 0 0 0
1 0 0
0 1 0
0 0 1
) , , (
dz
dy
dx
dz dy dx T .
In OpenGL aceast transformare se precizeaz prin comanda:
glTranslate{f|d}(dx,dy,dz)
Rotaia n jurul unei axe
Rotaia se face cu un unghi n jurul:
unui punct - dac transformarea are loc n plan (reprezentat n figura de mai jos)
unei drepte (d) - dac transformarea se face n spaiu
Pentru nceput vom analiza o rotaie n plan. Considerm un sistem de axe xOy n
plan i un punct P(x,y) care se rotete n jurul punctului O. Dup o rotaie de unghi se
obine un punct P'(x',y').

O

y
z
O
(y)
(x)

z
x
Obinem succesiv relaiile:
) sin( cos( r x = ); = r y
); cos( ) sin( ) cos( ) sin( ) cos( ) sin( ( s r y'
), sin( ) cos( ) sin( ) sin( ) cos( ) cos( cos( r x'


+ = + = ) + =
= = ) + =
y x r r in
y x r r
(*)
Folosim relaiile de mai sus pentru a obine formulele de translaie n R
3
. Pentru o
rotaie n spaiu, n jurul axei Oz, un punct P(x,y,z) devine punctul P'(x', y', z'), unde x' i y'
se calculeaz dup formulele (*) de mai sus, iar z'=z.
Pentru o rotaie n jurul axei Ox obinem:


); cos( ) sin( z'
), sin( ) cos( y'
x; x'


+ =
=
=
z y
z y



Pentru o rotaie n jurul axei Oy obinem:


); cos( ) sin( x'
y; y'
), sin( ) cos( z'


+ =
=
=
x z
x z




Folosind coordonatele omogene, pentru rotaiile amintite mai sus se obin
urmtoarele matrici de transformare:
Rotaie n jurul axei Ox: ) (
1 0 0 0
0 ) cos( ) sin( 0
0 ) sin( ) cos( 0
0 0 0 1



RX T =
|
|
|
|
|

\
|

=
O
x'
x
r
y r


y
x
P(x,y)
P'(x',y')
y'
Rotaie n jurul axei Oy: ) (
1 0 0 0
0 ) cos( 0 ) sin(
0 0 1 0
0 ) sin( 0 ) cos(



RY T =
|
|
|
|
|

\
|

=
Rotaie n jurul axei Oz: ) (
1 0 0 0
0 1 0 0
0 0 ) cos( ) sin(
0 0 ) sin( ) cos(



RZ T =
|
|
|
|
|

\
|
=
Pentru rotaia n spaiu a unui punct P, fie unghiul de rotaie i () planul care
trece prin punctul P i este perpendicular pe dreapta de rotaie (d), iar B punctul de
intersecie dintre (d) i (). Punctul P, care nu este pe dreapta de rotaie (d), se transform
ntr-un punct P' astfel nct punctele P i P' sunt situate n planul (), distanele de la
dreapta de rotaie la P i P' sunt egale (BP=BP'), i unghiul PBP' are msura .

In OpenGL rotaia se precizeaz prin comanda:
glRotate{f|d}(a,p,q,r)
care precizeaz o rotatie de unghi "a", dat n grade, n jurul dreptei specificate de
parametrii directori (p,q,r). Pentru diferite valori particulare ale parametrilor directori (p,q,r)
se obin rotaiile descrise mai sus.
Scalarea
Scalarea presupune nmulirea coordonatelor cu anumite constante, numii factori
de scar. Dac aceste constante sunt f
x
, f
y
, f
z
(corespunztor celor trei axe de
coordonate), atunci matricea de transformare este:
|
|
|
|
|

\
|
=
1 0 0 0
0 0 0
0 0 0
0 0 0
z
y
x
f
f
f
T =SC(f
x
,f
y
,f
z
)
B
P
P'
(d)
()

Simetria
Vom preciza simetria (reflexia) pentru: origine, axele de coordonate, planele de
coordonate. Aceste transformri se pot descrie unitar prin matricea de transformare:
|
|
|
|
|

\
|
=
1 0 0 0
0 0 0
0 0 0
0 0 0
c
b
a
T = SIM (a, b, c).
Cazuri particulare de transformri obinem astfel:
a=b=c=-1, se obine simetria fa de origine;
a=b=1, c=-1, se obine simetria fa de planul xOy;
a=1, b=-1, c=1, se obine simetria fa de planul xOz;
a=-1, b=c=1, se obine simetria fa de planul yOz;
a=1, b=c=-1, se obine simetria fa de axa Ox;
a=-1, b=1, c=-1, se obine simetria fa de axa Oy;
a=b=-1, c=1, se obine simetria fa de axa Oz;
Observaie: Din matricea de transformare pentru scalare i simetrie se observ c
acestea se pot descrie unitar, printr-o singur matrice, deci scalarea i simetria se pot
preciza n paralel printr-o singur matrice de transformare.
In OpenGL ultimele dou transformri se precizeaz prin comanda:
glScale{f|d}(x,y,z)
Forfecare (shear)
Aceast transformare modific dimensiune i forma obiectelor. In imaginea
urmtoare se d un exemplu de astfel de transformare, unde primul obiect (cilindru) este
transformat n al doilea obiect.



Transformarea se poate face n direcia axei Ox, a axei Oy, a axei Oz, a dou sau trei axe.
In urmtoarea figur se precizeaz faptul c un punct (x,y) din plan se transform n
punctul (x',y'), unde valoarea coordonatei x este proporionat cu valoarea lui y.

Urmtoarea figur precizeaz un patrat care se transform n direcia axei Ox, apoi Oy, iar
n final n direcia ambelor axe.

In cazul n care aceast transformare se face n spaiu, n direcia axelor x i y, cu
coordonata z neschimbat, formula de calcul este:
x' = x + az
y' = y + bz
z' = z
In OpenGL nu exist comenzi pentru precizarea acestor tipuri de transformri. Ele se pot
specifica prin folosirea comenzilor:
glLoadMatrix{f|d}(matrice, adr) - se ncarc o matrice precizat de argument (se iau
datele ncepnd cu o anumit adres)
glMultMatrix{f|d}(matrice, adr) - matricea curent de transformare se nmulete cu
matricea din argument
Exemplu:
float M1[] = {1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1}; //matricea unitate
M1[4]=a; //x'=x+a*y
M1[1]=b; //y'=b*x+y
gl.glMultMatrixf(M1,0); //matrice memorata coloana dupa coloana
Rezumat transformri 3D


Transformari 3D compuse
Fie T
1
i T
2
dou transformri, care transform succesiv P(x,y,z) n P
1
(x
1
,y
1
,z
1
),
apoi P
1
n P
2
(x
2
,y
2
,z
2
).
Fie A
1
i A
2
matricile corespunztoare acestor dou transformri. In acest caz
obinem formula de calcul pentru punctele P
1
i P
2
:
|
|
|
|
|

\
|
=
|
|
|
|
|

\
|
1 1
1
1
1
1
z
y
x
A
z
y
x
;
|
|
|
|
|

\
|
=
|
|
|
|
|

\
|
=
|
|
|
|
|

\
|
1 1 1
1 2
1
1
1
2
2
2
2
z
y
x
A A
z
y
x
A
z
y
x
.
Din ultima relaie se observ c produsul matricelor de transformare (deci i
precizarea lor n OpenGL) se face n ordinea invers efecturii transformrilor (A
2
A
1
).
Deoarece produsul matricelor nu este comutativ, rezultatul succesiunii de transformri T
1

urmat de T
2
este (n general) diferit de transformarea T
2
urmat de transformarea T
1
.
In continuare este dat un exemplu, n plan, din care se vede o justificare a acestei
afirmaii.

original
translatie
rotatie
scalare
shear

Transformrile din acest exemplu sunt:
Ex.1: 1 - translaie pe Ox; 2 - rotaie de 90
0
;
Ex.2: 1 - rotaie de 90
0
; 2 - translaie pe Ox;
Transformrile complexe pot s fie descompuse n transformri de baz (descrise
mai sus). Ca exemplificare vom lua dou astfel de transformri.
1. Simetria fa de un punct P(a,b,c) oarecare:
T
1
: Translatm P n origine: T(-a,-b,-c);
T
2
: Determinm simetria fa de origine: SIM(-1,-1,-1);
T
3
: Translatm O n P: T(a,b,c).
De aici se deduce o matrice pentru transformare:.
T(a,b,c) * SIM(-1,-1,-1) * T(-a,-b,-c).
2. Rotaia n jurul unei drepte oarecare:

1
2
1
(1)
(2)
(d'')
B
(d
)
(d')


(3)
(2)
(2)
(1)
y
x
z
M'

M
P
3
P
2
P
1
P(p,q,r)
' v
r

v
r

v
r

A
O
Presupunem c dreapta (axa) de rotaie (d) trece prin punctul A(a,b,c) i are
parametrii directori

v (p,q,r). Se cere efectuarea unei rotaii de unghi n jurul dreptei (d).


Fie M un punct oarecare pentru care se face aceast rotaie.
O modalitate de reducere a acestei transformri la transformri de baz amintite
mai sus este descris n continuare (nu este singura variant). Se va aduce dreapta (d)
peste una din axele de coordonate, prin transformri de baz, iar n jurul acestei axe de
coordonate se va efectua rotaia de unghi . Dup acest rotaie se va readuce dreapta
(d) la locul ei iniial.
T
1
: Translaia lui A n O, descris de matricea T1=T(-a,-b,-c). Dup aceast transformare
dreapta (d) se va translata ntr-o dreapt paralel (d'), iar vectorul

v se va translata n
vectorul OP paralel cu

v .
T
2
: Rotaie n jurul axei Ox astfel nct vectorul

v s ajung n planul xOz, deci vectorul

v
se transform n vectorul '

v = 3

OP . Dup aceast rotaie punctul P ajunge n punctul


P
3
, punctul P
1
ajunge n P
2
, iar dreapta (d') se transform n (d''), inclus n planul
xOz. Unghiul de rotaie se poate determina din triunghiul P
1
OB. Transformarea
astfel precizat este T2=RX().
T
3
: Rotaie n jurul axei Oy astfel nct dreapta (d'') se suprapune peste axa Oz (vectorul
'

v se suprapune peste Oz). Unghiul de rotaie se poate determin din triunghiul


OP
2
P
3
. Rotaia n jurul axei Oy se face de la axa Ox spre Oz, deci transformarea de
baz aa cum este descris mai sus (care este de la z spre x) se face cu unghiul (-).
Transformarea astfel realizat este T3=RY(-).
T
4
: In jurul axei Oz se face rotaia de unghi , deci transformarea este T4=RZ().
T
5
: Se efectueaz transformarea invers de la T
3
, deci o rotaie de unghi n jurul axe Oy.
Transformarea astfel descris este T5=RY().
T
6
: Se face o rotaie de unghi (-) n jurul axei Ox, deci avem transformarea T6= RX(-)
(este transformarea invers de la T
2
).
T
7
: Se face o translaie T7=T(a,b,c), invers transformrii T
1
.
Din cele descrise mai sus rezult c matricea de transformare pentru rotaia n jurul
unei axe oarecare este:
T=T(a,b,c) RX(-) RY() RZ() RY(-) RX() T(-a,-b,-c).

Precizarea transformrilor succesive n OpenGL:
la precizarea unui punct dintr-o primitiv se folosete o matrice curent de
transformare prin care se determin poziia punctului curent n spaiu
pentru stabilirea matricei curente de transformare se folosesc urmtoarele comenzi:
o se precizeaz o matrice iniial prin glLoadIdentity() sau
glLoadMatrix{f|d}(matrice, adr)
o matricea curent se poate nmuli (la dreapta) cu o matrice dat prin comanda
glMultMatrix{f|d}(matrice, adr) sau printr-o matrice determinat de una din
transformrile descrise mai sus: glTranslate, glRotate, glScale..
o comenzile glLoadMatrix i glMultMatrix se folosesc pentru transformri
particulare (de ex. forfecarea)
o ordinea de precizare a comenzilor este invers ordinii de efectuare a
transformrilor (ultima comand/matrice precizat corespunde la prima
transformare care se aplic). In tabelul urmtor se precizeaz, printr-un
exemplu, modul de stabilire a transformrilor n program i echivalena acestora
la desenare.

In program se precizeaz matricea de
transformare i desenarea unui obiect:
Matricea de transformare i modul de
aplicare a transformrilor:
Matricea unitate (I)
Translaie (T)
Rotaie (R)
Scalare (S)
desenare obiect
I I*T I*T*R I*T*R*S
La desenare: T(R(S(obiect)))
In OpenGL se poate gestiona cte o stiv de matrici pentru fiecare tip de transformare
(obiect, observator, textur). Iniial aceast stiv conine matricea unitate. Cu ajutorul a
dou comenzi se pot aduga i extrage elemente (matrice) din stiv:
o glPushMatrix() - care salveaz matricea curent (o memoreaz n vrful stivei),
o glPopMatrix() - care nlocuiete
matricea curent de transformare
cu matricea aflat n vrful stivei
(iar aceast poziie se elimin din
stiv).
Ierarhii de transformri
Sa presupunem c dorim s vizualizm o
figur asemntoare cu cea din imaginea
alturat (un robot simplificat n plan).
Pentru construirea acestui obiect se poate
proceda n mai multe moduri. Obiectul se
va desena la o anumit adres, deci
vizualizarea efectiv a obiectului nu trebuie
s depind de adresa unde se ncepe
desenarea. Aceasta se poate face numai
dac matricea curent de transformare (deci contextul curent) trebuie salvat (n stiv). Se
pot sugera urmtorii pai pentru desenarea minii din dreapta:
Pasul 1: Se pleac de la un
patrat.

Pasul 2: Se face o scalare.


Pasul 3: Se revine la
contextul de la pasul 1 (se
revine n origine).

Pasul 4: Se adaug un nou
patrat.

Pasul 5: Se face o scalare a
acestui patrat.

Pasul 6: Se face o rotaie a
ultimului patrat.

Pasul 7: Se face o translaie.


Pasul 8: Se face o translaie
a celor dou patrate.



Desenarea ntregului obiect (n diverse poziii) se poate vedea n fiierul exemple/Ex03-
Desene-2.

S-ar putea să vă placă și