Documente Academic
Documente Profesional
Documente Cultură
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
u (a, b, c),
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 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 se va translata n
vectorul OP paralel cu
v .
T
2
: Rotaie n jurul axei Ox astfel nct vectorul
v
se transform n vectorul '
v = 3