Documente Academic
Documente Profesional
Documente Cultură
PROGRAMAREA
APLICAIILOR GRAFICE
Editura PRINTECH
Bucureti
Descrierea CIP a Bibliotecii Naionale
IONESCU, FELICIA
Programarea aplicaiilor grafice.
Felicia Ionescu, Bucureti: PRINTECH, 1999
203 p. :il. ; cm.
ISBN 973-9475-93-0
1.Programare
004.42
Refereni tiinifici:
Prof. Dr. Ing. R. Strungaru
.l. Dr. Ing. O. Grigore
Editura PRINTECH
Splaiul Independenei 313, Bucureti, Sector 6
Tel: 092 355 664
Director Editur:
Ecaterina Milic
Consilier Editorial:
Mihaela Toma
Toate drepturile asupra acestei ediii aparin autorului. Reproducerea parial sau total
a textului sau a ilustraiilor din aceast carte este posibil numai cu acordul scris al
autorului.
Cuprins
1.1
1.2
1.3
1
3
4
Modelarea obiectelor
2.1
2.2
2.3
2.4
7
8
8
11
13
16
17
18
19
8
21
22
Transformri geometrice
25
3.1
25
25
28
31
35
37
40
3.2
42
42
44
46
47
Sisteme de vizualizare
49
4.1
4.2
51
56
Transformarea de observare
Transformarea de proiecie
4.3
4.4
4.5
57
57
59
66
67
67
72
74
74
79
82
83
84
Transformarea de rastru
85
5.1
86
86
88
89
91
93
94
95
96
5.2
5.3
5.4
5.5
5.6
99
102
103
104
106
109
6.1
111
111
112
113
113
114
114
115
117
120
123
6.2
6.3
6.4
6.5
6.6
125
125
127
141
142
142
143
145
145
152
157
7.1
7.2
7.3
157
160
162
162
162
166
167
167
169
174
176
180
181
184
7.4
187
8.1
8.2
189
192
195
196
201
Bibliografie
203
Prefa
Octombrie, 1999
Autoarea
1.2Sisteme grafice
O aplicaie grafic, indiferent de domeniul creia i este destinat, se dezvolt
ntr-un sistem care prezint anumite faciliti grafice, sistem numit la modul general
sistem grafic.
Un sistem grafic este un calculator care dispune de componente hardware i
software pentru crearea sau prelucrarea imaginilor. Componenta hardware cea mai
important a unui sistem grafic este adaptorul (sau acceleratorul) grafic, prin
intermediul cruia este comandat un dispozitiv de afiare (display) color. La aceasta se
mai adaug diferite dispozitive de intrare (tastatur, mouse, joystick, trackball,
interfee specializate) care asigur interaciunea utilizatorului cu programul de
aplicaie.
n programarea aplicaiilor grafice intervin mai multe componente software,
care asigur crearea imaginilor pe display (Fig. 1.1).
Echipament
Biblioteci
grafice
Sistem
dede
operare
Sistem de Programul
dezvoltare
de
aplicaii (toolkit)
aplicaie
hardware
Utilizator
z
O
x
z
(a)
x
(b)
Modelarea obiectelor
Modul cel mai convenabil de modelare a scenelor virtuale este acela n care
fiecare obiect este modelat ntr-un sistem de coordonate propriu, numit sistem de
referin model (sau sistem de referin local), n care punctele (vrfurile) obiectului
sunt precizate relativ la un anumit punct de referin local. De fapt, n modelarea
ierarhic, un obiect complex poate avea un numr oarecare de sisteme de referin
locale, cte unul pentru fiecare parte component a sa. Instanierea unui obiect n
scena virtual nseamn amplasarea acestuia n sistemul de referin universal printr-o
succesiune de scalri, rotaii i translaii, care transform obiectul din sistemul de
referin local n sistemul de referin universal. Aceast succesiune de transformri
este cunoscut sub numele de transformare de modelare.
Proprietile obiectelor tridimensionale care se modeleaz n aplicaiile grafice
se pot mpri n dou categorii: forma i atribute de aspect. Informaia de form a
unui obiect este diferit de celelalte atribute ale obiectului, deoarece forma este aceea
care determin modul n care obiectul apare n redarea grafic i toate celelalte
atribute se coreleaz cu forma obiectului (de exemplu, culoarea se specific pentru
fiecare element de suprafa a obiectului).
Din punct de vedere al formei, obiectele tridimensionale reprezentate n
grafica pe calculator pot fi obiecte solide sau obiecte deformabile. Un solid este un
obiect tridimensional a crui form i dimensiuni nu se modific n funcie de timp sau
de poziia n scen (proprietatea de form volumetric invariant). Majoritatea
aplicaiilor de realitate virtual se bazeaz pe scene compuse din solide, dar exist i
aplicaii n care obiectele reprezentate i modific forma i dimensiunile ntr-un mod
predefinit sau ca urmare a unor aciuni interactive (de exemplu, n simulri ale
v0
v3
v5
v4
Fig. 2.1 Segmentele liniei poligonale sunt orientate i nu se autointerecteaz.
Un punct x din interiorul unui poligon poate vedea un alt punct y, dac i
numai dac segmentul xy nu este n nici un punct al su exterior poligonului, adic
xy P. Acest lucru nsemn c linia care unete dou puncte x i y, vizibile unul
altuia, poate atinge un vrf al poligonului. Vizibilitatea ntre dou puncte x i y este
complet (clearly visible), dac linia care unete cele dou puncte nu atinge frontiera
poligonal (Fig. 2.2).
O diagonal a unui poligon este un segment de dreapt ntre dou vrfuri a i
b, complet vizibile unul altuia. Acest lucru nseamn c intersecia dintre segmentul
nchis ab i P este mulimea {a,b}, adic segmentul ab nu atinge linia poligonal
P n alte puncte dect vrfurile a i b, de nceput i de sfrit ale segmentului.
Condiiile ca segmentul ab care unete vrfurile a i b ale unui poligon s fie o
diagonal n acel poligon sunt deci: ab P i ab P ={a, b}. Orice
diagonal mparte un poligon n dou poligoane mai mici (Fig. 2.2).
a
y
x
c
e f
6
3
7
2
0
1
Muchii
Vrfuri
Fig. 2.4 Reprezentarea prin suprafaa de frontier a unui poliedru.
Link
parte interioar suprafeei, care este o regiune limitat, i o parte exterioar suprafeei,
care este o regiune nelimitat.
Din punct de vedere geometric, orientarea consistent se verific prin direcia
normalelor la feele obiectului: dac normalele feelor sunt ndreptate ctre aceeai
regiune a spaiului (fie toate ndreptate spre interior, fie toate ndreptate spre exterior),
atunci suprafaa are o orientare consistent. Acest mod de verificare se refer la
obiectele tridimensionale fr caviti, dar se poate extinde cu uurin i la obiecte
care prezint caviti.
Fig. 2.6 Legea lui Mobius verific orientarea consistent a unei suprafee triangularizate.
int CubeIndexFace[6][4]={
{3, 2, 1, 0},
{4, 5, 6, 7},
{0, 1, 5, 4},
{2, 3, 7, 6},
{1, 2, 6, 5},
{0, 4, 7, 3}
};
(a)
(b)
Fig. 2.8 Reprezentarea plin (filled) i cadru de srm (wireframe)
a obiectelor.
2.1.4 Generarea
matematic
modelului
din
descrierea
(2.1)
Hiperboloid:
x 2 a 2 + y 2 b 2 z 2 c 2 1 = 0 si
x 2 a 2 + y2 b2 z2 c2 + 1 = 0
Paraboloid eliptic:
(2.2)
x 2 a 2 + y2 b2 = z
(2.3)
(2.4)
Prin rotaia unei curbe n jurul unei axe se pot obine obiecte tridimensionale
mai variate, n funcie de forma curbei care se rotete. De exemplu, un tor se obine
prin rotaia unui cerc n jurul unei axe paralele cu planul cercului. Suprafeele astfel
obinute se numesc suprafee de rotaie.
Fig. 2.9 Obiect poligonal modelat prin deplasarea unui cerc de diametru variabil
de-a lungul unei linii drepte.
Pentru definirea deplasrii unei suprafee de-a lungul unei curbe, este necesar
s se defineasc intervalul u al curbei pe care are loc deplasarea i modul n care se
divide intervalul parcurs. mprirea intervalului n distane egale nu d rezultate bune,
deoarece punctele obinute nu vor fi egal distribuite pe suprafaa obiectului. De aceea
este necesar divizarea intervalului n funcie de curbura curbei. Dac curbura este
pronunat, se aleg subdiviziuni mai mici ale intervalului, iar pentru curburi mai
reduse se aleg subdiviziuni mai mari ale intervalului.
(2.5)
z(u ) = a z u 3 + b z u 2 + c z u + d z
Aceasta este o curb cubic, definit ca form i mrime de cei 12 coeficieni,
numii coeficieni algebrici ai curbei. n notaie vectorial se poate scrie forma
parametric a unei curbe cubice:
Q( u ) = Au 3 + Bu 2 + Cu + D
(2.6)
Q( u ) = Pi B i ( u )
i =0
(2.7)
unde Q este vectorul de componente (x, y, z), Pi sunt punctele de control ale curbei,
fiecare vector Pi avnd componentele (xi, yi, zi), iar Bi sunt funciile de baz (sau de
amestec blending functions) ale reprezentrii parametrice.
Diferite funcii de baz au proprieti diferite n determinarea formei curbei
parametrice: ele pot interpola sau aproxima o curb dat, pot asigura anumite condiii
de continuitate a mai multor segmente de curb.
Specificarea unui segment de curb (sau a unui petic de suprafa curb) printr-un
set de puncte de control este o metod de baz n proiectarea grafic interactiv:
proiectantul definete punctele de control; curba este generat i vizualizat interactiv;
dac forma curbei nu este mulumitoare, proiectantul modific unul sau mai multe
puncte de control, pn obine rezultatul dorit.
Cele mai utilizate tipuri de curbe i suprafee parametrice n proiectarea grafic
sunt curbele (i suprafeele) Bzier i B-spline. n bibliotecile grafice exist funcii de
generare a curbelor i suprafeelor parametrice.
Fig. 2.12 arat reprezentarea CSG a unui obiect prin combinarea a trei obiecte
elementare: dou paralelilpipede dreptunghice i un cilindru. Arborele de reprezentare
are ca frunze primitivele geometrice, iar celelate noduri conin operatorii booleni.
Paralelipipedele sunt combinate folosind operaia de reunuine, iar o gaur este
practicat ntr-unul din paralelipipede prin scderea unui cilindru din ansamblul celor
dou paralelipipede.
Scadere
Reuniune
Bloc1
Cilindru
Bloc 2
Fig. 2.12 Arborele de construire a unui obiect din trei primitive geometrice.
Fig. 2.13(a) este prezentat ocuparea unei regiuni bidimensionale de trei obiecte, iar n
Fig. 2.14 este reprezentat arborele de ocupare a regiunii.
Arborele se creeaz pornind cu o regiune ptrat n plan, reprezentnd ntrega
zon care se modeleaz i care este reprezentat prin nodul rdcin al arborelui
cuaternar. n cazul spaiului tridimensional, acest regiune este un cub. Fiecare
regiune, ncepnd cu regiunea iniial, se subdivide n patru subregiuni, reprezentate
ca patru noduri fii n arbore. n Fig. 2.13(b) se arat ordinea de numerotare a nodurilor
fii obinui prin divizarea unei subregiuni.
2
1
2 3
(b)
(a)
Etichete:
t: triunghi
d: dreptunghi
c: cerc
e: spaiu vid
(empty)
e
e
e
e t e
t t
t e e t e
e e e c e e c c e c e e c
d
d
e
e d e d
d
e d e d
c e e
Transformri geometrice
P' = P + T , unde T = t y ; deci: y' = y + t y .
t z
z' z t z
Scalarea modific coordonatele tuturor punctelor unui obiect folosind factorii
de scal sx, sy, respectiv sz pe cele trei axe de coordonate. n aceast transformare de
scalare, numit scalare fa de origine, un punct P( x , y, z) se transform n punctul
P' ( x ' , y' , z' ) , unde:
x' = x s x
y' = y s y
z' = z s z
Pentru scrierea sub form matriceal a acestor relaii de transformare, se
definete matricea de scalare S de dimensiune 3x3 astfel:
s x
S = 0
0
0
sy
0
0
0
s z
0
sy
0
0 x
0 y
s z z
). Prin aceast transformare toate punctele dreptei d sunt fixe i numai ele sunt
puncte invariante ale transformrii. Transformarea de rotaie n raport cu o ax
oarecare se descompune o ntr-o succesiune de maximum trei transformri de rotaie
n raport cu axele de coordonate ale sistemului de referin.
Rotaia n raport cu axa z cu un unghi transform un punct P( x , y, z) n
punctul P' ( x ' , y' , z' ) , ambele aflate n planul peroendicular pe axa z. Pentru
deducerea relaiilor de transformare se exprim coordonatele punctelor P i P n acest
plan n coordonate polare (Fig. 3.1).
P
x = cos u
y = sin u
x ' = cos(u + )
y' = sin( u + )
P = RZP ,
convenia definit mai sus, tangajul este o rotaie n raport cu axa x, giraia este o
rotaie n raport cu axa y, iar ruliul este o rotaie n raport cu axa z (Fig. 3.2).
Aceste denumiri au originea n modul n care sunt definite micrile unui
avion poziionat n spaiu cu axa longitudinal orientat ctre z pozitiv: tangajul este
rotaia ntr-un plan vertical, care nclin botul avionului; giraia este o micare ntr-un
plan orizontal, care schimb direcia axei avionului, iar ruliul este rotaia ntr-un plan
vertical, care nclin aripile avionului.
y
Giraie
Tangaj
x
z
Ruliu
Fig. 3.2 Rotaiile n raport cu axele sistemului de referin.
x =X/w
y=Y/w
z = Z/w
(3.1)
n
coordonate
omogene,
P2 (X 2 , Y2 , Y2 , w 2 ) sunt egale dac :
dou
puncte
P1 ( X1 , Y1 , Z1 , w1 )
X 1 / w 1 = X 2 / w 2 , Y1 / w 1 = Y2 / w 2 si Z1 / w 1 = Z 2 / w 2
n sistemul de coordonate omogene, toate matricele de transformri sunt de
dimensiune 4x4 i toate operaiile de transformri geometrice se pot exprima prin
produse de matrice.
Matricea de translaie n coordonate omogene se definete astfel:
1
0
T( t x , t y , t z ) =
0
0
1
0
0
0 tx
0 t y
1 tz
0 1
(3.2)
0
1
0
0
0 t x X
X' = X + wt x
0 t y Y
Y' = Y + wt y
, rezult:
1 t z Z
Z' = Z + wt z
w ' = w
0 1 w
(3.3)
s x
0
S(s x , s y , s z ) =
0
0
sy
0
0
0
0
sz
0
0
0
0
(3.4)
P' = SP
X ' s x
Y ' 0
=
Z' 0
w ' 0
0
sy
0
0
0
0
sz
0
0 X
0 Y
, rezult:
0 Z
1 w
X ' = s x X
Y ' = s y Y
Z' = s z Z
w ' = w
(3.5)
0
0
0
0
0
0
(3.6)
0 X
0 Y
, rezult
0 Z
1 w
X ' = X
Y' = Y cos Z sin
(3.7)
cos
0
R Y () =
sin
0 sin 0
1
0
0
0 cos 0
0
0
1
(3.8)
0 sin 0 X
1
0
0 Y
, rezult:
0 cos 0 Z
0
0
1 w
(3.9)
0
0
0
0
1
0
0
0
0
(3.10)
0
0
1
0
0 X
0 Y
, rezult:
0 Z
1 w
Z' = Z
w ' = w
(3.11)
P
P
Transformarea efectuat asupra cubului din figura de mai sus se obine prin
aplicarea succesiv a trei transformri geometrice elementare (scalare, rotaie i
translaie) asupra fiecrui punct (vrf) al cubului. Pentru un vrf al cubului, reprezentat
prin matricea coloan P, succesiunea de transformri este:
Scalarea:
Rotaia n raport cu axa z:
Translaia:
P1 = S P
P2 = RZ P1= RZ(S P)
P' = T P2 = T(RZ(S P)) = (TRZS) P
0
1
0
0
-1
1.732
1
1,732
M=
0
0
0
0
8 0.866 0.5
0 0.5 0.866
0 0
0
1 0
0
0
0
1
0
0
0
2
0
0
0
1
0
0 2
0 0
0 0
1 0
0
2
0
0
0
0
2
0
0
0
0
8
0
0
0
0
0
0
2
0
8 1 8.732
0 1 3.732
=
0 1 2
1 1 1
0
0
0 6.928
7.560
7.06
0 4.330
, P'' = M'' P =
2
2
0
0
1
1
(3.12)
(3.13)
Punctul P este transformat n ordinea S1, S2,.Sn. Acesta este un mod mai
natural de a urmri secvenele de transformri geometrice i de aceea, n unele lucrri
este adoptat aceast convenie. Nu exist alte diferene ntre cele dou convenii (nici
de simplificare a calculelor, nici de eficien).
Se poate demonstra cu uurin c orice matrice de transformare elementar n
convenia de reprezentare prin matrice linie a unui punct n spaiul tridimensional este
transpusa matricei corespunztoare de transformare definit n convenia de
reprezentare prin matrice coloan a punctului. De exemplu, translaia unui punct
P(x,z,y) cu valorile tx, ty, tz se exprim astfel:
[ X'
1
0
Z w]
0
tx
0
1
0
ty
0
0
1
tz
0
0
0
0
0 0
0
0
0
(3.14)
r '12
r ' 22
r '32
0
r '13
r ' 23
r '33
0
tx
t y
tz
(3.15)
MM 1
1
0
= I, I =
0
0
1
0
0
0
0
1
0
0
0
,
0
(3.16)
(3.17)
=I
1
0 0 0
M 1 M 1-1
[S(s x , s y , s z )] 1
1 / s x
0
= S(1 / s x ,1 / s y ,1 / s z ) =
0
0
0
0
1
0 cos sin 0
[R x ()] 1 = R x () =
0 sin cos 0
0
0
1
0
0
0
1/ s y
0
0
1/ sz
0
0
0
0
0
(3.19)
(3.20)
[R y ()] 1
cos
0
= R y ( ) =
sin
0 sin
1
0
0 cos
0
0
0
0
0
(3.21)
[R z ()] 1
cos sin 0 0
sin cos 0 0
= R z ( ) =
0
0
1 0
0
0 1
0
(3.22)
(3.23)
0
0
1
0
(3.24)
P' = M -1 P
(3.25)
P = MP'
Se poate urmri cu mai mult uurin aceast modalitate de transformare ntrun caz simplu. Se consider un sistem de referin Oxyz i un alt sistem de referin
Oxyz care are originea O(x0,y0,z0) i aceeai orientare a axelor de coordonate ca i
sistemul Oxyz.
Poziionarea sistemului de referin Oxyz relativ la sistemul Oxyz este
definit de matricea de transformare M; poziionarea sistemului de referin Oxyz
relativ la sistemul Oxyz este definit de matricea de transformare invers M -1 :
1
0
M=
0
0
1
0
0
0 x0
1
0
0 y0
-1
, M =
0
1 z0
0 1
0
0
1
0
0
0 x0
0 y0
1 z0
0
1
P(6,3,0)
P'(2,1,0)
O'
O
z
x'
x
z'
Exemplul 3.2
1
0
R X ( / 2) =
0
0 0
0 1
1 0
0 0
0
0
0
y
P(0,1,1)
O
P(0,1,1)
P(0,-1,1)
O
x
z
P(0,-1,1)
(a)
(b)
0
1
0
0
0 t x cos sin
0 t y sin cos
1 0 0
0
0 1 0
0
cos sin
sin cos
Rd =
0
0
0
0
0
0
1
0
0 1
0 0
0 0
1 0
0
1
0
0
0 tx
0 t y
1
0
0
1
0 t x (1 cos ) + t y sin
0 t y (1 cos ) t x sin
1
0
0
1
(3.27)
Acest proces este descris n Fig. 3.7 (a) pentru un unghi de 30 grade, cu
reprezentarea unei proiecii n planul Oxy.
y
I
O
ty
O
tx
T( tx , ty ,0)
x
x
R z ()
(a)
x
x
T(tx , ty ,0)
ty
O
tx
I
x
I
O
T( tx , ty ,0)
I
O
R Z ()
T(tx , ty ,0)
(b)
Fig. 3.7 Rotaia fa de o dreapt paralel ca axa z a sistemului de referin:
considernd transformarea sistemelor de referin;
(b) considernd transformarea punctelor.
(a)
S F = T( x f , y f , z f )S(s x , s y , s z )T( x f , y f , z f )
1
0
SF =
0
0
s x
0
SF =
0
0
1
0
0
0 x f s x 0 0
0 y f 0 s y 0
1 zf 0 0 sz
0 1 0 0 0
0 0 x f (1 s x )
s y 0 y f (1 s y )
0 s z z f (1 s z )
0 0
1
0 1
0 0
0 0
1 0
0
1
0
0
0 xf
0 y f
1 zf
0
1
(3.28)
d 2y + d 2z ; sin = d y / d yz = d y
d 2y + d 2z
(3.29)
(unghiul drept n Mx) OMx= dx, OM= 1, MxM= dyz. Rezult unghiul OMMx (notat
unghiul ):
cos = d yz = d 2y + d 2z ; sin = d x
(3.30)
y
Mxy
My
Myz
(a)
Mzx
M
(b)
Myz
dz
Mz
z
d
dyz y
Mx
Mxy
My
O
Mz
M
z
dx
-
(c)
dyz
Mx
Mzx
dyz
0
0
0
0
0
0
(3.31)
0
0
0
0
0
sau
0
R = R Y () R X () R Z ()
(3.32)
Exemplul 3.3
Fig. 3.9 Scen virtual rezultat prin instanierea mai multor obiecte.
S XY
1
0
=
0
0 0
1 0
0 1
0 0
0
1
0
0
, S YZ =
0
0
1
0
0
1
0
0
0
0
1
0
0
1 0
0 1
0
, S ZX =
0 0
0
1
0 0
0
0
1
0
0
0
0
(3.34)
y
z
SXY
Fig. 3.10 Transformarea de simetrie SXY transform sistemul de coordonate drept Oxyz
n sistemul de coordonate stng Oxyz.
F
(
a
,
b
)
=
P' = P FX , unde X
0 0 1 0
0 0 0 1
n mod similar se definesc matricele de forfecare pe axele y i z:
1 0 0 0
1 0 0 0
c 1 d 0
0 1 0 0
,
FY (c, d) =
FZ (e, f ) =
0 0 1 0
e f 1 0
0 0 0 1
0 0 0 1
(3.35)
(3.36)
Transformarea de forfecare este folosit n definirea sistemelor de proiecie.
(3.38)
Sisteme de vizualizare
Sistem
de referin
universal
Sistem
de referin
de observare
Definire
obiecte
Definire
sistem de
referin
de observare
Definire
proiecie
i volum de
vizualizare
Transformare
de modelare
Transformare
de observare
Sistem
de referin
normalizat
Sistem
de referin
ecran 3D
Decupare
mprire
cu w
Calcul
proiecie
Transformare
de normalizare
Transformare
n ecran 3D
Sistem
de referin
imagine
Afiare
imagine
Transformare
de rastru
complete, care permit crearea simultan a mai multor imagini ale scenei, n ferestre de
vizualizare diferite. n majoritatea acestor sisteme de vizualizare, din motive de
eficien i precizie a calculelor (care sunt explicate mai jos), transformarea de
proiecie se execut n dou etape: prima etap este o transformare de normalizare,
care este o schimbare a sistemului de referin de la sistemul de referin de observare
la sistemul de referin normalizat. Volumul de vizualizare definit n sistemul de
referin de observare este transformat n sistemul de referin normalizat ntr-un
volum canonic (n general, un paralelipiped dreptunghic).
n sistemul de referin normalizat (normalized coordinates) se execut
decuparea obiectelor (clipping), astfel nct obiectele sau prile din obiecte care se
afl n afara volumului de vizualizare (volumul canonic) sunt eliminate (ignorate
pentru operaiile urmtoare de redare, nu terse din scen).
Urmtoarea transformare geometric este transformarea din sistemul
normalizat n sistemul de referin ecran tridimensional (three-dimensional sceen),
prin care fereastra definit n planul de vizualizare este transformat ntr-o regiune
corespunztoare zonei de afiare pe display, numit poart (viewport), iar coordonata z
se pstreaz nemodificat. n sistemul de referin ecran 3D se calculeaz
coordonatele tridimensionale ale punctelor din coordonatele omogene prin mprirea
cu w, dup care se execut transformarea de rastru (rasterization). Transformarea de
rastru calculeaz mulimea pixelilor care aparin unui segment sau poligon dat prin
coordonatele vrfurilor. Prin aceast transformare (care se mai numete i conversie de
baleiere scan conversion) spaiul bidimensional continuu al porii de afiare este
convertit n spaiul bidimensional discret al imaginii. n general, concomitent cu
transformarea de rastru sunt executate i alte operaii: eliminarea suprafeelor ascunse
(hidden surface removal), umbrirea (shading), texturarea (texturing).
Aceasta este succesiunea cea mai general a operaiilor de vizualizare a
scenelor, care este descris i utilizat n momentul de fa n grafic i realitatea
virtual. Trebuie ns remarcat faptul c evoluia tehnologic, deosebit de
spectaculoas n acest domeniu, a modificat, uneori substanial, modul de abordare a
generrii imaginii obiectelor tridimensionale. De exemplu, posibilitatea de
implementare eficient (uneori chiar n hardware) a operaiei de comparare a
adncimii punctelor a impus utilizarea algoritmului cunoscut sub numele de algoritm
Z-buffer i a condus la ignorarea complet a altor algoritmi de eliminare a suprafeelor
ascunse, care n sistemele mai vechi aveau o mare importan i implicaie asupra
ntregii succesiuni de operaii grafice. Se pot da numeroase exemple de modul n care
schimbrile tehnologice au influienat abordarea graficii tridimensionale, i, probabil,
astfel de influiene vor continua s apar i n viitor. De aceea, lucrarea i propune s
prezinte aspectele eseniale ale graficii utilizate n realitate virtual, mai puin
influienate de contextul tehnologic de moment.
Transformarea de observare
Transformarea de observare este analog cu poziionarea unei camere
fotografice sau de nregistrare, prin care se observ o anumit zon din scena virtual.
n sistemul de referin universal sunt reprezentate toate obiectele (modelele) scenei
virtuale, iar n fiecare cadru al imaginii (frame), este generat imaginea acelor obiecte
din scen care sunt vizibile din punctul de observare curent (view point).
Transformarea de observare este, aadar, o schimbare a sistemului de
coordonate de la sistemul de referin universal la sistemul de referin de observare
(view coordinate). n majoritatea aplicaiilor de realitate virtual (simulatoare, aplicaii
n arhitectur, etc) scena virtual reprezentat n sistemul de referin universal este
meninut ntr-o poziie constant (cel mult existnd anumite obiecte mobile n scen),
iar observatorul este cel care i modific poziia i orientarea, i n funcie de acestea
se red imaginea corespunztoare pe ecran. Direcia de observare a scenei este, n
majoritatea sistemelor de vizualizare, direcia axei z a sistemului de referin de
observare.
Localizarea i orientarea sistemului de referin de observare O VxVyVzV n
raport cu sistemul de referin universal Oxyz poate fi descris printr-o matrice de
transformare M de forma general:
M = TV R V
1
0
=
0
0
1
0
0
0 1 0
0
0
1 0
0
0
1
(4.1)
(4.2)
1
PV = R -1
V TV P = R Z ( ) R X ( )R Y ()T( x V , y v , z v )P
(4.3)
Exemplul 4.1
y
y
Exy
Exy
(a)
(b)
Fig. 4.2 Transformarea de observare: (a) translaia (b) rotaia n raport cu axa z.
0
1
0
0
0 cos sin
0 sin sin
1
cos
0
1
0
0
0
0
1
0
0
0
0
0
0
0
z
0
0
0
xV
zV
Exy
yV
(c)
(d)
Fig. 4.2 Transformarea de observare:
(c) rotaia n raport cu axa x(d) sistemul de referin rezultat
MV
cos
0
0
sin
cos cos sin cos sin 0
=
cos sin sin sin cos
0
0
0
1
[xV
yV
z V 1] T = M V [ x
y z 1] T
n Fig. 4.3 este reprezentat imaginea unui cub cu centrul n origine i laturile
egale cu 2 i paralele cu axele de coordonate, observat din punctul E(10,10,10).
Pentru punctul E:
= 10 3
cos = 2 2 , sin = 2 2 , = 45
cos = 3 3, sin = 6 3 , = 54 45 '
Matricea de transformare de observare are valoarea:
MV
2 2 2 2
0
0
6 6
6 6 6 3
0
3 3
3 3
3 3 10 3
0
0
0
1
y
z
Fig. 4.3 Exemplu de observare ctre centrul sistemului de referin universal.
Transformarea de proiecie
Proiecia unui obiect tridimensional pe un plan (numit plan de proiecie sau plan
de vizualizare view plane) este format din mulimea punctelor de intersecie ntre
acest plan i dreptele numite proiectori, care pornesc dintr-un punct fix numit centru
de proiecie i trec prin fiecare punct al obiectului.
n funcie de distana centrului de proiecie fa de planul de proiecie, proieciile
plane se clasific n proiecii perspectiv i proiecii paralele. n proieciile perspectiv
centrul de proiecie se afl la distan finit fa de planul de vizualizare, iar n
proieciile paralele centrul de proiecie este la infinit. n cazul proieciilor paralele,
proiectorii sunt drepte paralele i au o direcie comun, numit direcie de proiecie.
Proiecia paralel
n prioecia paralel, centrul de proiecie este la infinit, iar toate dreptele de
proiecie sunt paralele ntre ele, avnd o direcie numit direcia de proiecie.
Proieciile paralele sunt foarte rar folosite n grafica destinat sistemelor de
realitate virtual, dat fiind c imaginea rezultat nu d informaii asupra distanei
obiectelor n scen.
Planul de proiecie al unei proiecii paralele poate fi perpendicular pe direcia
de proiecie, i atunci proiecia se numete proiecie ortografic, sau poate avea o
inclinare oarecare fa de direcia de proiecie, i atunci proiecia se numete proiecie
oblic.
Dintre proieciile ortografice, cele mai utilizate sunt proieciile ortografice n
care planul de proiecie este unul din planurile sistemului de coordonate. Proieciile
ortografice sunt folosite frecvent n desenul tehnic i, de asemenea, ca o etap
intermediar n definirea sistemelor de vizualizare normalizate, care vor fi prezentate
n paragraful urmtor. Matricea de transformare de proiecie ortografic n planul z = 0
are urmtoarea expresie:
1
0
PZ =
0
0
1
0
0
0
0
0
0
0
0
0
(4.4)
0
1
0
0
0
0
1
0
0
0
,
0
1
0
PY =
0
0
0
0
0
0
0
1
0
0
0
0
(4 .5)
Proiecia perspectiv
Exist mai multe modaliti de definire a unei proiecii perspectiv, de la o
definire minimal, prin care se poate realiza proiecia punctelor din spaiu pe un plan,
pn la definirea adoptat n sisteme de vizualizare complexe, n care se specific
volumul de vizualizare, centrul de proiecie i ali parametri. n continuare, vor fi
prezentate cteva sisteme de vizualizare cu proiecie perspectiv, ncepnd cu cel mai
simplu sistem i pn la sistemul complet de vizualizare care se conformeaz
standardelor GKS i PHIGS.
Proiecia perspectiv se poate defini mai intuitiv pornind de la sistemul de
observare considerat ca un sistem de referin stng. Centrul de proiecie se fixeaz n
centrul sistemului de referin de observare OV, direcia de observare (de privire) este
n sensul pozitiv al axei OVzV, iar planul de vizualizare este un plan perpendicular pe
axa OVzV, la distana d fa de centru (Fig. 4.4(a)).
Direcia de observare
Direcia de observare
yV
P
B
OV
P
P
yV
yP
OV
A
d
xV
yV
zV
zV
zV
xV
yV
yP
A zV
d
zV
1
0
MP =
0
0 0
1 0
0 1
0 1/ d
0
0
0
(4.7)
0 X V
0 YV
0 Z V
0 w V
Rezult:
X P = X V
YP = YV
i
Z P = Z V
w P = Z V / d
x P = X P / w P = d X V / Z V = d x V z V
y P = YP / w P = d YV / Z V = d y V z V
z = Z / w = d
P
P
P
(4.8)
virtual, n care se exploreaz o scen virtual de dimensiuni mari, din care numai o
parte este vizibil i deci redat pe ecran.
Transformarea de proiecie perspectiv este o transformare costisitoare,
datorit faptului c necesit operaii de mprire, care consum timp de calcul ridicat,
dac este executat prin program, sau circuite complexe, dac este implementat
hardware. Execuia ei pentru toate obiectele scenei, inclusiv pentru cele care nu sunt
vizibile, deci nu sunt reprezentate pe display i nu necesit coordonatele n planul de
vizualizare, este costisitoare i inutil. n plus, operaia de decupare (clipping) a
prilor din obiectele tridimensionale care nu sunt vizibile dintr-un anumit punct de
observare, nu se poate executa eficient dup proiecie i este necesar execuia ei
nainte de proiectarea coordonatelor n planul de vizualizare. Asupra acestui aspect se
va reveni cu ocazia descrierii operaiei de decupare.
Este evident c, pentru redarea eficient a scenelor tridimensionale, este
necesar definirea unui volum de vizualizare (view volume), cunoscut sub numele de
piramida de vizualizare sau trunchiul de piramid de vizualizare (frustum). Trunchiul
de piramid de vizualizare se definete n sistemul de referin de observare. n forma
cea mai simpl, trunchiul de piramid de vizualizare este mrginit de patru plane
laterale care trec prin punctul de observare OV i de dou plane perpendiculare pe axa
OVzV, planul apropiat (near) pe care se execut proiecia, i planul deprtat (far). n
figura Fig. 4.5 este prezentat volumul de vizualizare ntr-un sistem de referin de
observare stng i direcia de observare ctre zV pozitiv.
Direcia de observare
yV
yV = h zV/d
B
OV
zV
xV
zV = d D
xV = g zV/d
zV = f
Fig. 4.5 Definirea trunchiului de piramid de vizualizare (frustum)
n sistemul de referin de observare stng.
x V = g z V d
y V = h z V d
z V = d
z V = f
(4.9)
unde:
d xV
x N =
g zV
d yV
y N =
h zV
z N = f 1 d
f d
z V
(4.10)
YN = d y V h
Z N = z V f /(f d) df/(f d)
w N = z V
(4.11)
MN
0
0
0
d / g
d/h
0
0
,
=
0
0
f /(f d) df/(f d)
0
1
0
0
X N
x V
Y
N = M y V
N
ZN
z V
1
w N
(4.12)
MN
1
0
=
0
0
0
0
0
d / g
1
0
0
d/h
0
0 f /(f d) df/(f d)
0
0
0
1
0
0
0
0
0
1
0
0
0
= M N2 M N1
0
unghiul la vrful piramidei de 90. Matricea MN2 transform acest trunchi de piramid
regulat n volumul canonic, care este un paralelipiped dreptunghic (Fig. 4.6).
n sistemul de referin normalizat se execut operaia de decupare a
obiectelor n coordonate normalizate omogene. n urma acestei operaii, din totalitatea
obiectelor scenei virtuale sunt reinute numai acele obiecte sau pri (rezultate prin
decupare) aflate n interiorul volumului de vizualizare canonic, ceea ce nseamn c,
nainte de transformarea de normalizare, acestea se aflau n interiorul trunchiului de
piramid de vizualizare.
Volumul
de vizualizare
yV
MN1
d
h
zV
OV
d
f
d
(b)
(a)
Volumul de vizibilitate n sistemul de
referin observator.
Scalarea care transform volumul de
vizibilitate n trunchi de piramid regulat
cu unghil la vrful piramidei de 90 grade.
Volumul de vizibilitate canonic n
sistemul de referin normalizat
tridimensional.
yN
MN2
zN
(c)
1
Fig. 4.6 Etapele transformrii de normalizare.
d xV
d yV
f
d
1
; y N = YN w N =
; z N = ZN w N =
g zV
h zV
f d
z V
S-au obinut, evident, expresii identice cu cele din relaiile 4.10, de la care s-a
pornit pentru definirea transformrii de proiecie perspectiv.
Coordonatele xN i yN n sistemul de referin normalizat reprezint
coordonatele proieciei ortografice n planul zN = 0 (care este planul de vizualizare) a
punctului corespunztor. Este de remarcat faptul c transformarea de proiecie
perspectiv din sistemul de referin observator a devenit o transformare de proiecie
ortografic n sistemul de referin normalizat. Dar aceaste operaii de trecere de la
coordonate omogene la coordonate tridimensionale i proiecia ortografic nu se
efectueaz n sistemul normalizat ci ntr-un alt sistem de referin, sistemul ecran 3D,
obinut prin transformarea fereastrei de vizualizare n poart de afiare.
xN = XN wN =
Unghiul dintre planele laterale ale piramidei de vizualizare (care trec prin axa
OVyV i au ecuaiile xV = g zV/d ) se numete unghi de vizualizare pe orizontal
(horizontal field of view fovx). Unghiul dintre planele piramidei de vizualizare care
trec prin axa OVxV se numete unghi de vizualizare pe vertical (vertical field of view
fovy). Valorile acestora se deduc din parametrii de proiecie perspectiv:
g
h
(4.13)
fovx = 2arctg , fovy = 2arctg
d
d
Valorile unghiurilor de vizualizare variaz pentru diferite sisteme grafice n
funcie de dispozitivele de afiare folosite.
O alt convenie de definire a unui sistem de vizualizare este aceea de a
considera sistemul de referin de observare ca un sistem drept, iar direcia de
observare i volumul de vizualizare ndreptate ctre zV negativ. Urmrind un
raionament asemntor celui de mai sus, se obine aceeai expresie a matricii de
normalizare (relaia 4.12), n care valorile d i f au valori negative, iar sistemul de
referin normalizat rezultat este un sistem de referin stng.
Exemplul 4.2
MN
0
0
1 0
0 1
0
0
=
0
0 1.025 1.025
0
1
0
0
(b) xV = 2
yV = 2
zV = 20
(a) xV = 2
yV = 2
zV = 20
===0
===0
(c) xV = 2
yV = 2
zV = 20
(d) xV = 2
yV = 2
zV = 20
===0
===0
(e) xV = 2
yV = 2
zV = 20
(f) xV = 2
yV = 2
zV = 20
= 30
==0
= 30
==0
Imaginile generate pe ecran mai necesit i alte transformri grafice, pe lng cele
prezentate pn acum: transformarea n coordonate ecran 3D, prin care se efectueaz o
coresponden ntre fereastra de vizualizare i zona de afiare alocat pe ecran (numit
poart viewport), precum i o transformare de rastru, prin care se genereaz mulimea
pixelilor afiai pe ecran. Aceste transformri vor fi descrise paragrafele urmtoare.
Imaginile prezentate au fost captate din fereastra de afiare a programului care
execut toate operaiile prezentate mai sus. Acest program a fost scris folosind
biblioteca grafic OpenGL, care ofer funcii adecvate acestor operaii de transformare
i redare a imaginilor. Funciile OpenGL pentru realizarea transformrilor grafice vor
fi descrise n seciunea 6.
vizualizare mai mari se folosesc imagini multicanal, n care fiecare canal reprezint un
volum de vizualizare care se proiecteaz n fereastra de vizualizare a acestuia. Mai
multe canale de imagine, care genereaz imagini pe monitoare juxtapuse sau
proiectate pe un ecran de dimensiuni corespunztoare, permit obinerea unor cmpuri
de vizualizare extinse n sistemele de realitate virtual imersive.
Pentru generarea imaginilor multicanal se utilizeaz un sistem de vizualizare care
permite definirea tuturor parametrilor necesari pentru generarea simultan a mai
multor ferestre de vizualizare. Un astfel de sistem de vizualizare este cel definit n
standardele GKS i PHIGS, i va fi descris n continuare.
n sistemul de vizualizare standard PHIGS, sistemul de referin observator (numit
view reference coordinate VRC) este definit prin punctul de observare VRP (view
reference point), iar centrul de proiecie este diferit de acesta i este specificat prin
punctul PRP (projection reference point). Planul de vizualizare (pe care se execut
proiecia imaginii) nu este n mod necesar perpendicular pe linia care unete centrul de
proiecie cu centrul ferestrei de vizualizare, ceea ce permite realizarea proieciilor
oblice. Fereastra de vizualizare este poziionat n orice loc n planul de vizualizare,
ceea se permite definirea i redarea simultan a mai multor imagini ale scenei.
Sistemul de vizualizare PHIGS se specific n trei etape. n prima etap se
definete sistemul de referin de observare; n cea de-a doua etap se definete
transformarea de normalizare, iar n ultima etap se definete transformarea fereastrpoart.
3.1.7Definirea
observare
sistemului
de
referin
de
Direcia de
observare
far
VPD
near
V
VRP U
(umax, vmax)
VPN
Planul de
vizualizare
(umin, vmin)
Planul
deprtat
Fereastra de
vizualizare
PRP
Planul apropiat
Fig. 4.8 Specificarea sistemului de vizualizare PHIGS n proieca perspectiv.
VPN
VPN
Planul de
vizualizare
Planul de
vizualizare
PRP
Fereastra de
vizualizare
Fereastra de
vizualizare
(a)
PRP
(b)
Planul
deprtat
y
Planul apropiat
Planul de
vizualizare
Volumul de
vizualizare
Axa volumului de
vizualizare
(0, ymax, d)
ymax
PRP
ymin
(0, ymin, d)
z
(a) Situaia dup
translaia
punctului PRP n origine
d
n
f
Forfecare
(xmax+xmin)/2, (ymaxymin)/2, d
(xmax+xmin)/2, (ymaxymin)/2, d
M N0
1
0
=
0
0 ( x max
1 ( y max
0
0
+ x min ) 2d
+ y min ) 2d
1
0
0
0
0
(4.14)
[
= [ (x
max +
M N1
0
2d ( x max x min )
0
2d ( y max y min )
=
0
0
0
0
0
0
1
0
0
0
0
(4.15)
M N2
1
0
=
0
0
0
0
1
0
0
0 f /(f n) nf/(f n)
0
1
0
(4.16)
Sistemul normalizat astfel definit este un sistem de referin stng. n acest sistem
se efectueaz operaiile de decupare a obiectelor, dup care secvena transformrilor
necesare pentru generarea imaginii continu cu transformarea n sistemul de referin
ecran 3D.
yN
ymax
yN
yCF
yPmax
yS
CP
yCP
CF
ymin
yPmin
xmin xN xCF
xmax
xN
xPmin
xS
xCP
xPmax
xS
(4.17)
Corespondena dintre coordonatele unui punct P(xN, yN) din fereastr cu ale
punctului P(xS, yS) n poarta de afiare se formuleaz matematic astfel:
x P max x P min
x max x min
sy =
y P max y P min
y max y min
(4.18)
sz =1
Rezult:
x S = x CP + s x ( x N x CF ) = s x x N + x CP s x x CF
y S = y CP + s y ( y y CF ) = s y y N + y CP s y y CF
(4.19)
zS = z N
Se poate deduce matricea de transformare ecran 3D prin compunerea a trei
transformri succesive. Mai nti se execut o translaie, astfel ca centrul CF al
ferestrei s ajung n origine, deci cu matricea de translaie T(xCF , yCF ,0).
Fereastra centrat n origine se scaleaz cu factorii de scar sx, sy, definii de relaia
4.18, astfel nct fereastra s ajung la dimensiunea porii, iar coordonata z se las
nemodificat. Matricea de scalare este deci S(sx, sy, sz). Ultima transformare necesar
este o translaie, prin care centrul porii este adus n punctul CP, deci cu matricea de
translaie T(xCP, yCP, 0). Rezult matricea de transformare din sistemul de referin
normalizat n sistemul de referin ecran 3D:
0 x CP s x 0 0 0 1 0 0 x CF
0 y CP 0 s y 0 0 0 1 0 y CF
M NS
1
0 0 0 1 0 0 0 1
0
0
1 0 0 0 1 0 0 0
1
(4.20)
X N
s x 0 0 x CP s x x CF X S
Y
0 s
Y
S
y 0 y CP s y y CF
M NS =
;
= M NS N
ZN
0 0 1
ZS
0
1
0 0 0
w S
w N
Din aceste relaii rezult ZS = ZN i wS = wN. n sistemul de referin ecran 3D se
trece de la coordonatele omogene XS, YS, ZS, wS, la coordonatele tridimensionale xS,
yS, zS prin mprirea cu wS.
Planul zS = 0 din sistemul de referin ecran 3D este planul de proiecie.
Coordonatele xS i yS reprezint coordonatele proieciei ortografice n planul zS = 0
(care este planul de porii de afiare). Transformarea de proiecie perspectiv din
sistemul de referin de observare a devenit o transformare de proiecie ortografic n
sistemul de referin ecran 3D. Coordonata zS n sistemul de referin ecran 3D este
utilizat n algoritmii de eliminare a suprafeelor ascunse. Volumul de vizualizare n
sistemul ecran 3D este un paralelipiped dreptunghic cu baza un dreptunghi de
1
0
=
0
0
1
0
0
yS
Poarta de
afiare
zS
xS
Decuparea obiectelor
Decuparea n plan
Fiind dat un poligon oarecare n plan i o regiune de decupare, problema
decuprii poligonului este de a reine numai acea parte din poligon care se afl n
interiorul regiunii de decupare. Se consider cazul cel mai frecvent ntlnit, n care
regiunea de decupare este un dreptunghi cu laturile paralele cu axele de coordonate.
Aceast regiune de decupare corespunde ferestrei de vizualizare.
Majoritatea algoritmilor de decupare, att n plan ct i n spaiu, se bazeaz
pe algoritmul de decupare Sutherland-Hodgman. Algoritmul Sutherland-Hodgman
mparte planul bidimensional n nou regiuni, dup poziia fa de regiunea
dreptunghiular de decupare dat prin ecuaiile a patru drepte: x = x min; x = xmax;
y = ymin; y = ymax. (Fig. 4.13).
Fiecrei regiuni i corespunde un cod de vizibilitate (cunoscut sub numele de
cod Sutherland-Cohen) reprezentat pe 4 bii, b0, b1, b2, b3, definii astfel:
b0 = semn(x xmin)
b1 = semn(xmaxx)
b2 = semn(y ymin)
b3 = semn(ymaxy)
n continuare codurile de vizibilitate se reprezint ca o secven de cifre
binare.
y
1001
1000
0001
0000
1010
y = ymax
0010
y = ymin
0101
0110
0100
x = xmin
x = xmax
Dac nu este ndeplinit nici condiia de acceptare sigur, nici condiia de rejecie sigur, atunci
decuparea se calculeaz prin intersecia laturilor poligonului cu dreptele care mrginesc regiunea de
decupare (Fig. 4.14 (c)).
Dreapta (infinit) corespunztoare unei laturi a regiunii de decupare mparte planul n dou semiplane:
semiplanul (regiunea) vizibil, care se afl de aceeai parte a dreptei ca i regiunea de decupare, i
semiplanul invizibil, care se afl de partea opus fa de regiunea de decupare. De exemplu, pentru latura
x = xmin, semiplanul
x < xmin, este invizibil iar semiplanul x xmin este vizibil.
n algoritmul de decupare Sutherland-Hodgman, decuparea unui poligon fa de o regiune dat se
efectueaz ntr-un numr de pai egal cu numrul de laturi ale regiunii de decupare. n fiecare pas se
decupeaz poligonul (iniial sau provenit dintr-un pas anterior) cu o latur a regiunii de decupare: se
elimin acea poriune din poligon care se afl n semiplanul invizibil corespunztor laturii i se reine
numai poriunea vizibil.
1010
1010
0010
0010
0110
SC = 0000
1000
Rejecie sigur
PC = 0010
0010
SC = 1111, PC = 0000
0001
0100
Vi
Vj
Semiplanul
invizibil
(a) Vi vizibil,
Vj vizibil
Se adaug Vj
Semiplanul
vizibil
Vi
(b) Vi invizibil,
Vj invizibil
Nu se adaug
nici un vrf
Vj
Semiplanul
invizibil
Semiplanul
vizibil
Vi
Vj
Semiplanul
invizibil
(c) Vi vizibil,
Vj invizibil
Se adaug I
Semiplanul
vizibil
Vj
Vi
Semiplanul
invizibil
I
(d) Vi invizibil,
Vj vizibil
Se adaug I, Vj
Semiplanul
vizibil
V1
V1
I4
V2
I1
I1
I2
I2
V3
Semiplan
invizibil
Semiplan
vizibil
x = xmin
V4
I3
Semiplan
vizibil
V3
x = xmin
Semiplan
invizibil
n semiplanul x xmax
Semiplan
V1
V1
invizibil
Fig. 4.16 (a), (b) Decuparea
relativ
la laturile
verticale ale regiunii de decupare
I4
I4
n algoritmul Sutherland-Hodgman.
y = ymax
Semiplan
I8
I7
I1
vizibil
I1
I1
I1
n semiplanul x xmin
I2
y = ymin
Semiplan
invizibil
I2
Semiplan
vizibil
I3
I5
I6
I2
I3
I2
I5
I6
V3
V4
Fig. 4.16 (c), (d) Decuparea relativ la laturile orizontale ale regiunii de decupare
n algoritmul Sutherland-Hodgman.
Poligonul rezultat este: I5 I6 I3I7 I8 I1 I2
n Fig.4.16 este ilustrat algoritmul de decupare Sutherland-Hodgman al unui poligon convex relativ la o
regiune de decupare rectangular, dar acest algoritm poate fi folosit n cazul general, al decuprii oricrui
tip de poligon (convex, concav sau cu guri) relativ la o regiune de decupare oarecare.
Decuparea (n plan sau n spaiu) poate fi executat n orice operaie care necesit construirea de
poligoare sau obiecte tridimensionale noi prin calcul, pornind de la obiecte de baz, care sunt intersectate
cu alte obiecte sau suprafee.
n generarea imaginilor bidimensionale, decuparea, ca operaie component a secvenei de transformri
de vizualizare, se efectueaz relativ la fereastra de vizualizare, care este o regiune rectangular.
Poligoanele sau liniile rezultate, limitate la dimensiunea ferestrei, sunt transformate n sistemul de
referin al porii de afiare i redate pe display. Dac nu se efectueaz decuparea poligoanelor la limitele
ferestrei, coordonatele vrfurilor n sistemul de referin al porii de afiare depesc limitele porii, iar
rezultatul conversiei de rastru este incorect.
Se poate efectua o decupare a poligoanelor i liniilor i n poarta de afiare, prin testul individual al
coordonatelor fiecrui pixel i rejectarea acelora care nu se ncadreaz n limitele porii de afiare. Acesta
este ns un procedeu deosebit de costisitor ca timp de execuie i nu se pune problema utilizrii lui n
grafica interactiv i n realitatea virtual.
Decuparea
suprafeelor
volumul de vizualizare
relativ
la
yV
h
g
g
z V ; xV z V ; xV z V ; z V d; z V f
d
d
d
(4.21)
Aceste teste implic operaii asupra coordonatelor vrfurilor, operaii care n form matriceal nseamn
nmulirea cu matricea MN1, component a matricei de normalizare. Aa cum se poate observa n Fig.
4.17(b), matricea MN1 transform sistemul de referin de observare ntr-un sistem de referin Oxyz,
n care volumul de vizualizare (deci volumul de decupare) este un trunchi de piramid regulat cu unghiul
de la vrful piramidei de 90. Relaiile 4.21 de testare a vizibilitii unui punct n sistemul de referin de
observare sunt echivalente cu urmtoarele relaii n sistemul Oxyz:
x z; x z; y z; y z; z f; z d
(4.22)
Dac s-ar executa decuparea n sistemul de referin intermediar Oxyz, atunci toate punctele din
sistemul de referin de observare se transform mai nti cu matricea MN1, pentru trecerea n sistemul
Oxyz, apoi se execut decuparea, iar dup decupare, vrfurile vizibile se transform cu matricea MN2,
pentru trecere n sistemul de referin normalizat i proiecie n fereastra de vizualizare (Fig. 4.17(c)).
Aplicarea separat a dou transformri, mai nti prin matricea MN1 i apoi prin matricea MN2 este
costisitoarte i nenecesar, dat fiind c decuparea se poate face direct n sistemul normalizat (Fig. 4.17
(c)).
g d 0
0 hd
MN1 =
0
0
0
0
yV
0 0
0 0
1 0
0 1
y = z
y
yV = hzV/d
zV
yV = hzV/d
zV = d
zV = f
(a)
(b)
z = d
1
0
MN2 =
0
yN
0
0
0
1
0
0
0 f (f - d) - fd (f - d)
0
1
0
z = f
yN = 1
zN
yN = 1
(c)
zN = 0
zN = 1
(4.23)
Aceste teste se pot efectua direct n coordonatele omogene n sistemul normalizat, fr s mai fie necesar
mprirea cu wN:
XN wN ; X N w N ;
YN wN ; YN wN ;
(4.24)
ZN wN ; ZN 0;
b0 = semn(XN wN)
b1 = semn(wN XN)
b2 = semn(YN wN)
b3 = semn(wN YN)
b4 = semn(ZN wN)
b5 = semn(ZN)
Spaiul omogen normalizat se mparte n 27 de regiuni dup poziia lor fa de planele care
definesc volumul canonic de vizualizare. n interiorul volumului canonic, toate punctele au codul de
vizibilitate cu toi biii egali cu 0 (C = 000000). n toate celelalte regiuni, codul de vizibilitate este diferit
de 0, avnd unul sau mai muli bii egali cu 1.
Algoritmul Sutherland-Hodgman de decupare n spaiu se desfoar n mod asemntor cu
algoritmul de decupare n plan. Pentru o suprafa dat prin vrfurile ei n spaiu, decuparea relativ la un
volumul dat prin ecuaiile planelor sale se efectueaz n modul urmtor:
(1) Se calculeaz codurile de vizibilitate ale vrfurilor suprafeei.
(2) Se efectueaz testele de acceptare i rejecie sigur. Pentru suprafeele care nu ndeplinesc
nici unul din aceste teste se continu cu decuparea prin intersecia cu volumul de decupare.
(3) Decuparea prin intersecie a unei suprafee se efectueaz ntr-un numr de pai egal cu
numrul de plane ale volumului de decupare. n fiecare pas se obine o nou suprafa, din
care a fost eliminat poriunea invizibil n raport cu planul de decupare respectiv.
Dup efectuarea decuprii, se calculeaz coordonatele xN, yN, zN ale vrfurilor suprafeelor vizibile
rezultate (prin mprirea cu wN), iar toate celelalte vrfuri (ale suprafeelor invizibile) sunt ignorate. Acest
lucru nseamn c operaia de mprire omogen se execut pentru un numr strict necesar de vrfuri,
ceea ce reprezint un ctig n viteza de execuie.
Se pune problema dac nu ar fi mai simplu s fie efectuat decuparea n plan, deci dup calculul
proieciilor suprafeelor, dat fiind c algoritmul de decupare n plan este mai simplu. Acest lucru ar
nsemna ca toate suprafeele s fie proiectate pe planul de vizualizare, dup care s se efectueze decuparea
relativ la fereastra de vizualizare. Aceast soluie este ns inacceptabil, datorit faptului c n fereastra
se proiece se proiecteaz att punctele (vrfuri ale suprafeelor) aflate n volumul de vizualizare, ct i
cele aflate ntr-un volum simetric cu acesta fa de planul zV = 0, care se afl n spatele observatorului.
Tratarea tuturor acestor suprafee proiectate n fereastra de vizualizare dar invizibile, consum un timp de
execuie n mod inutil. De aceea, decuparea obiectelor la volumul de vizualizare nu se poate executa
corect i eficient dect n spaiul tridimensional, i anume n coordonate normalizate omogene.
if (PC) {
Obiect sigur invizibi, va fi rejectat;
return 0;
}
else if (SC){
Obiect sigur vizibil n ntregime;
Nu se va mai testa fiecare suprafa;
return 1;
}
else {
Se va decupa fiecare suprafa;
return 1;
}
}
Ce anume se execut n fiecare din situaii depinde, evident, de modul de organizare al programului i de
biblioteca grafic folosit. n orice caz, dac obiectul este sigur invizibil, atunci se abandoneaz toate
operaiile referitoare la acest obiect i se trece la obiectul urmtor.
Selecia obiectelor, adic identificarea obiectelor potenial vizibile pentru redarea imaginii acestora i
eliminarea obiectelor sigur invizibile (culling), este o resurs puternic de cretere a eficienei de redare a
scenelor virtuale. n scenele virtuale de dimensiuni mari, care conin un numr mare de obiecte, n fiecare
cadru de imagine sunt vizibile i deci trebuie s fie prelucrate un numr mult mai mic obiecte dect
numrul total de obiecte ale scenei. De aceea, identificarea ct mai devreme posibil a obiectelor sigur
invizibile i eliminarea lor conduce la reducerea substanial a timpului de redare a scenei. n redarea
scenelor complexe, acest procedeu se implementeaz mai eficient dect modul simplu descris mai sus
prin definirea volumului de delimitare a obiectelor.
Volumul de delimitare
Volumul de delimitare (bounding box) al unui obiect sau al unui grup de obiecte (ierarhie de obiecte) este
un volum definit ct mai simplu, care include toate vrfurile obiectelor i are dimensiuni minime. Se
folosesc ca volume de delimitare paralelipipede dreptunghice sau sfere.
Fiind dat un obiect cu un volum de delimitare, testul de eliminare (culling) se efectueaz asupra
volumului de delimitare: se calculeaz intersecia codurilor de vizibilitate ale vrfurilor volumului de
delimitare i, dac este diferit de zero, atunci volumul de delimitare i implicit, ntregul obiect este
invizibil i abandonat.
Aceast modalitate de reprezentare i prelucrare a obiectelor este aproape unanim adoptat n realitatea
virtual, datorit execuiei eficiente a testului: decizia de eliminare a unui obiect se poate lua prin
considerarea unui numr de opt vrfuri, n locul unui numr foarte mare de vrfuri ct are un obiect n
mod obinuit.
Volumul de delimitare al unui obiect se definete n sistemul de referin local (de modelare) al obiectului,
ca un paralelipiped dreptunghic cu muchiile paralele cu axele de coordonate. Un astfel de paralelipiped se
poate specifica prin coordonatele a dou vrfuri opuse (xmin, ymin, zmin) i (xmax, ymax, zmax). Vrfurile lui sunt
transformate din sistemul de referin local n alte sisteme de referin (universal, de observare, etc.), la
fel ca i vrfurile obiectului. Calculul codurilor de vizibilitate i testul de eliminare se poate efectua n
sistemul de referin de observare sau n alt sistem de referin (sistemul normalizat) dac biblioteca
grafic permite accesul la coordonatele n acest sistem.
n Fig. 4.18 sunt reprezentate trei obiecte n poziii diferite fa de volumul de vizualizare. Volumul de
delimitare al primului obiect este complet exterior fa de volumul de vizualizare i obiectul
corespunztor (ceainic teapot) este ignorat pentru punctul de observare dat. Cel de-al doilea obiect
(icosaedru) este complet vizibil, volumul su de delimitare fiind inclus n volumul de vizualizare. Pentru
cel de-al treilea obiect (sfer reprezentat wireframe), volumul de delimitare intersecteaz volumul de
vizualizare i trebuie s fie executat decuparea suprafeelor sale relativ la volumul de vizualizare.
yV
OV
xV
zV
n scenele virtuale modelate ierarhic se construiesc volume de delimitare la fiecare nivel de ierarhie i
obiectele sau grupurile de obiecte sunt selectate pe baza testului de eliminare efectuat asupra volumului
de delimitare corespunztor.
Detecia coliziunii
Detecia coliziunii este un aspect important n modelarea mediului virtual, prin faptul c simuleaz un
aspect realist al mediului: obiectele reale nu pot trece unele prin altele; atunci cnd un obiect se atinge de
un altul exist un rspuns de coliziune: deformarea obiectelor, schimbarea traiectoriei de deplasare,
explozia, etc. La interaciunea dintre utilizator i obiectele virtuale se pot produce fore, vibraii, i alte
reacii tactile care sunt prelucrate n sistem.
Detecia coliziunii se poate calcula aproximativ, folosind volumele de delimitate, sau exact, prin
considerarea tuturor punctelor obiectelor. Dat fiind c volumul de delimitare depeste n multe puncte
suprafaa de frontier a obiectului, calculul aproximativ al coliziunii introduce coliziuni false ntre
obiecte: nu obiectele s-au atins ci volumele lor de delimitare.
Generarea exact a coliziunii se calculeaz ca a doua etap dup calculul aproximativ al coliziunii. Dac
dou obiecte au volumele de delimitare disjuncte, atunci ele sigur nu se ating. Dac dou obiecte au
volume de delimitare care se ating sau interptrund, atunci se calculeaz coliziunea exact prin
considerarea tuturor punctelor obiectelor
Transformarea de rastru
yS
yk+1
yk
yk
(a)
xk xk+1 x
S
(b)
xk
xi
Modelul RGB
n modelul RGB, culoarea este reprezentat printr-un triplet de culori primare,
rou (red) verde (green), albastru (blue). Utilizarea preponderent a modelului RGB
n grafic se datoreaz n primul rnd faptului c monitoarele color folosesc acest
model de producere a culorii. Culoarea este produs pe ecranul unui monitor prin
excitarea a trei puncte adiacente de substan fosforescent de culori rou, verde i,
respectiv, albastru. Punctele fosforescente fiind apropiate, ochiul percepe tripletul de
puncte ca un singur punct a crui culoare este suma celor trei componente.
Spaiul de reprezentare a tuturor culorilor n modelul RGB este un cub ntr-un
sistem de coordonate cu axele notate Red, Green, Blue (Fig. 5.2).
Orice culoare n modelul RGB se exprim printr-un triplet (r,g,b) i i
corespunde un punct n spaiul RGB al crui vector C este:
C = rR+gG+bG
(5.1)
unde R, G, B sunt versorii axelor Red, Green, Blue. n acest model culoarea negru
este reprezentat prin tripletul (0,0,0), iar culoarea alb este reprezentat prin tripletul
(1,1,1).
Blue
Cyan
Magenta
White
Black
Red
Green
Yellow
Fig. 5.2 Spaiul culorilor n modelul RGB
a acestei componente (=1) nseamn suprafa opac, iar valoarea minim (=0)
nseamn suprafa complet transparent. Dac transparena unei suprafee este
diferit de zero, atunci culoarea care se atribuie pixelilor acestei suprafee se modific
n funcie de culoarea existent n bufferul de imagine n poziiile corespunztoare.
Culoarea rezultat a unui pixel este C= f(,C,CP), unde:
C(r,g,b) este culoarea suprafeei
este transparena suprafeei, cu valori ntre 0 i 1
CP (rP,gP,gP) este culoarea precedent a pixelului, aflat n bufferul de
imagine
C(r,g,b) este noua culoare a pixelului, rezultat prin aplicarea unei
funcii f fiecrei componente de culoare
Bibliotecile grafice permit definirea mai multor funcii f de combinare liniar
ntre culoarea transparent cu culoarea de fond.
Modelul HSV
Modelul HSV reprezint o transformare neliniar a spaiului RGB, prin care
culorile sunt specificate prin componentele: nuan (hue), saturaie (saturation) i
valoare (value). Modelul HSV este folosit n definirea mai intuitiv a culorilor
(perceptual), dect selecia unor culori primare. De exemplu, sarcina de a modifica o
culoare astfel nct s fie mai luminos, mai palid, mai galben, etc, se
realizeaz mult mai simplu n modelul HSV dect n modelul RGB.
Spaiul culorilor n modelul HSV este o piramid hexagonal ntr-un sistem de
coordonate polare HVS (Fig. 5.3)
Green
V
White
Cyan
Blue
Yellow
Red
Magenta
H
Black
HSV
red
yellow
green
cyan
blue
magenta
Pentru aceei definiie a unei culori (de exemplu, prin tripletul rgb) este
posibil ca monitoare diferite s genereze culori diferite, datorit caracteristicilor
constructive diferite ale monitoarelor. n general, ntre componenta de culoare
transmis unui monitor i intensitatea produs de ecranul monitorului exist o relaie
neliniar de forma:
( ) ; G m = K ( G i' )
R m = K R i'
( )
; B m = K B i'
(5.2)
(5.3)
y
B
B
(a) a = 0.5
(b) a=2
nedorit de scar este atenuat, dar nu este eliminat. Netezirea liniilor se poate obine
prin diferite metode de filtrare, metode cunoscute sub numele de filtrare anti-aliasing.
Generarea poligoanelor
Metoda cea mai frecvent folosit pentru generarea mulimii pixelilor prin care
se aproximeaz o suprafa poligonal este metoda de baleiere pe linii a poligonului
(algoritmul scan-line). Principiul de baz al acestei metode pentru un poligon convex
este prezentat n Fig. 5.5.
Se consider poligonul ABCDE, care reprezint proiecia n planul z S=0
al sistemului de referin ecran 3D, a unei suprafee ABCDE din spaiul tridimensional
universal. Poligonul este baleiat cu o linie orizontal care ia valori succesive, y1,
y2,yi, yi+1.., unde y1 este valoarea coordonatei y minim a vrfurilor
poligonului, iar yi+1 = yi+1. Pentru fiecare poziie yi a liniei de baleiere, se
calculeaz interseciile xi,1, xi,2 cu dou din laturile poligonului. Pixelii a cror
adrese sunt cuprinse n intervalul (xi,1,yi), (xi,2,yi), aparin poligonului i sunt
prelucrai n mod corespunztor. Pentru algoritmul simplu de generare a poligoanelor,
culoarea poligonului (cunoscut ca atribut a feei corespunztoare a obiectului) este
nscris n bufferul de imagine la toate adresele cuprinse n intervalul respectiv. n
algoritmii n care se combin generarea cu eliminarea suprafeelor ascunse sau
umbrire, se prelucreaz toi pixelii corespunztori acestui interval.
y
D
E
C
yi+1=yi +1
yi
Mi+1,1
Mi+1, 2
Mi,1
y1
Mi,2
B
xi+1,1 xi,1
xi,2 x
i+1,2
xi,2
xi,3
xi,4
(a)
(b)
Fig. 5.6 Generarea poligoanelor concave:
generare direct prin baleiere pe linii;
transformare n mulime de triunghiuri (triangularizare).
Compararea adncimilor
Pentru eliminarea suprafeelor ascunse se compar adncimea (distana fa de punctul de observare) a
tuturor suprafeelor sau a pixelilor rezultai prin conversia de rastru.
Un punct P este ascuns de o suprafa S, dac adncimea punctului este mai mare dect adncimea
interseciei I a dreaptei care unete punctul P cu centrul de proiecie (se consider centrul de proiecie
identic cu originea sistemului de referin de observare OV , Fig. 5.7(a)), deci dac OVP > OVI.
P
I
OV
OV
S
(a)
A
S
O suprafa A este ascuns de alt suprafa S dac toate punctele suprafeei A sunt ascunse de suprafaa
S (Fig. 5.7(b)). Dac o suprafa ascunde S suprafaa A, atunci se consider c adncimea suprafeei S
este mai mic dect cea a suprafeei ascunse A.
Compararea adncimilor a dou puncte n sistemul de referin de observare este destul de complicat,
deoarece comparaia are sens numai dac cele dou puncte se afl pe aceeai linie de proiecie (Fig. 5.7).
Aceast operaie este mai simpl n sistemul de referin ecran 3D. n acest sistem, zS = zN, iar zN este
definit de relaia 4.10 astfel:
zS = z N =
f
d
1
f d
z V
Acest relaie transform, de exemplu, un cub n sistemul de referin de observare, ntr-un trunchi de
piramid n sistemul ecran 3D (Fig. 5.8).
Proiecia perspectiv din sistemul de referin de observare se transform n proiecie paralel n sistemul
de referin ecran 3D. Deoarece zV = 0 se transform n zS = , liniile de proiecie n sistemul ecran 3D
sunt linii paralele ndreptate ctre
. Adncimea unui punct P1(x1,y1,z1) n sistemul de referin de
observare, care este dat de distana
yV
Direcia de
observare
yS
zV
-zV
zS
xV
xS
Se poate trage concluzia
c operaiile
care implic
compararea
adncimilor se execut mai
Fig. 5.8
Transformarea
unuitestarea
cub i asau
liniilor
de proiecie
simplu ndin
sistemul
de
referin
ecran
3D.
Acest
lucru
este
utilizat
att
n
algoritmii
eliminare a
sistemul de referin de observare n sistemul de referin ecrande3D.
suprafeelor ascunse n spaiul obiect ct i n algoritmii n spaiul imagine.
Unul din cei mai cunoscui algoritmi de eliminare a suprafeelor ascunse n spaiul obiect este algoritmul
propus de Newell, cunoscut i sub numele de algoritmul pictorului, datorit analogiei cu modul n care un
pictor creeaz un tablou. n acest algoritm, se sorteaz suprafeele n ordinea descresctoare a adncimii i
se redau n aceast ordine pe display. Eliminarea suprafeelor ascunse se obine prin suprapunerea noii
suprafee (mai apropiat) peste suprafeele mai deprtate, deja desenate. Lista ordonat de suprafee
(numit list de display) se creeaz n sistemul de referin de observare sau n sistemul de referin ecran
3D, dup operaia de decupare.
Ordonarea suprafeelor dup adncime este o operaie complicat, mai ales dac dou suprafee se
intersecteaz ntre ele, situaie n care nu se poate decide care suprafa este mai apropiat, dect prin
divizarea uneia din ele de-a lungul liniei de intersecie.
Un alt algoritm de eliminare a suprafeelor ascunse n spaiul obiect este algoritmul cu subdivizarea
recursiv a poligoanelor (algoritmul Weiler-Atherton). Spre deosebire de algoritmul pictorului, n care
intersectarea suprafeelor proiectate se efectueaz prin supranscrierea suprafeelor mai apropiate peste
cele mai deprtate, n algoritmul Weiler-Atherton se execut o operaie de decupare n sistemul de
referin normalizat ntre toate suprafeele obiectelor i se rein numai suprafeele nvintoare, adic
cele mai apropiate. Lista acestora (lista de display) nu mai conine suprafee care se pot suprapune pe
ecran i nu mai trebuie s fie ordonat. Ca i n algoritmul pictorului, operaiile de creare a listei de
display necesit un timp de execuie foarte mare, care depinde de numrul de suprafee care se
prelucreaz. Acest lucru limiteaz drastic posibilitatea de utilizare a algoritmilor n spaiul obiect.
D
E
yi+1=yi +1
yi
A M
i+1,1
Mi+1,2
Mi,1 Mi,2
yB
B
zi+1,1 zi,1
zi,2
zi+1,2
z = m1zy+n1z
z = m2zy+n2z
(5.7)
(5.8)
(5.9)
=
unde:
mixx+nix
(5.10)
mix = (xi,2 xi,1)/(zi,2 zi,1), nix = zi,1 mix xi,1
Mi,2
zi,2
zi,1
Mi,1
xi,1
xi,2
Z_buffer[x][y]
buffer */
max_z;
/*
initializare
Z-
}
for (fiecare poligon){
calculul ymin, ymax ale poligonului;
for (yi = ymin; yi<= ymax;yi++){
calcul xi,1, xi,2
calcul zi,1, zi,2
for (x=xi,1;x<xi,2;x++){
calcul z;
if(z < Z_buffer[x][y]){
Z_buffer[x][y] = z;
image_buffer[x][y] = culoare;
}
}
}
Cel mai important avantaj al algoritmului Z-buffer este simplitatea implementrii lui, iar dezavantajul
principal l constitue memoria suplimentar necesar pentru implementarea bufferului de adncime.
Dimensiunea fiecrei locaii (fiecare locaie corespunznd unui pixel din imagine) este dat de precizia de
reprezentare a adncimii z. Datorit compresiei pe care o introduce transformarea de la sistemul de
referin de observare la sistemele de referin normalizat i ecran 3D (relaia 4.10), este posibil ca dou
valori zV distincte s fie transformate n valori zS identice. n mod obinuit, se folosesc 20 sau 32 de bii
pentru reprezentarea adncimii unui pixel, ceea ce nseamn c Z-bufferul poate deveni mai mare dect
bufferul de imagine, construit n mod obinuit cu 24 de bii/pixel.
n realizrile mai vechi ale sistemelor grafice, bufferul de adncime era implementat n memoria
principal. n momentul actual, sunt disponibile terminale grafice care au Z-bufferul realizat ca o
memorie dedicat, i aceasta reprezint cea mai bun soluie.
Un alt avantaj al Z-bufferului l reprezint independena de forma de reprezentare a obiectelor.
Descrierea dat mai sus se refer la utilizarea Z-bufferului n redarea obiectelor modelate prin suprafee
poligonale, dar aceasta nu este o restricie, deoarece se poate calcula adncimea z pentru orice tip de
suprafa, iar mecanismul de comparaie a adncimilor este acelai.
Dac un obiect opac ale crui normale la fee sunt ndreptate spre exterior, este
privit dintr-un punct de observare, feele ale cror normale sunt orientate ctre punctul
de observare ascund (mascheaz) feele ale cror normale sunt orientate n direcie
invers.
Orientarea consistent a feelor unui obiect permite selecia numai a acelor fee ale obiectului care sunt
orientate ctre punctul de observare. Aceast operaie de selecie (numit eliminarea feelor orientate
invers - din spate - backface elimination) se efectueaz n sistemul de referin de observare (Fig. 5.11).
Pentru testul de vizibilitate al feelor n funcie de orientare se calculeaz produsul scalar dintre normala
la suprafa i un vector dintr-un punct al feei spre punctul de observare. Dac normalele la feele
obiectului sunt ndreptate ctre exterior (sens pozitiv, invers acelor de ceas) i unghiul dintre cei doi
vectori este mai mic de 90, atunci suprafaa este vizibil.
Normala la suprafa
Vizibil
Punctul de
observare
< 90
> 90
Normala la suprafa
< 90
Invizibil
Normala la suprafa
Fig. 5.11 Selecia feelor n funcie de orientare
Vizibil
Produsul scalar
a doi vectori, N i V este:
V N = V N cos
unde |V| i |N| sunt modulele celor doi vectori, iar este unghiul dintre ei. Se poate scrie deci:
V5
N
V1
V5
V4
V2
(a)
V1
V
Fig. 5.12 Calculul normalei la2 o suprafa.
V3
V3
(b)
V4
N
i
j
k
N = (V2 V1) (V3 V2 ) = x2 x1 y2 y1 z2 z1
x3 x 2 y3 y 2 z 3 z 2
Se dezvolt determinantul dup prima linie, i rezult:
N = ((y2 y1) (z3 z2) (y3 y2) (z2 z1)) i +
((x3 x2) (z2 z1) (x2 x1) (z3 z2)) j +
((x2 x1) (y3 y2) (x3 x2) (y2 y1)) k
(5.13)
Dac ordinea de parcurgere a vrfurilor feei se inverseaz, deci se consider faa Vn,V2V1, atunci
normala se calculeaz prin produsul N=(V2V3)x(V1 V2) care are semnul inversat (Fig. 5.12 (b)), ceea
ce se regsete n formula de calcul a produsului vectorial.
Rezult c sensul vectorului normal la o fa este dat de ordinea de parcurgere a vrfurilor feei. Dac n
sistemul de referin local (de modelare) feele unui obiect sunt definite (prin ordinea vrfurilor) astfel
nct toate normalele s fie ndreptate spre aceeai regiune a spaiului (spre exteriorul obiectului), aceast
orientare se pstreaz dup transformarea de instaniere i observare i n sistemul de referin de
observare obiectele vor avea normalele orientate consistent (toate orientate ctre exterior). Aceast
condiie este suficient pentru calculul vizibilitii fiecrei fee prin produs scalar al normalei cu vectorul
de direcie de la un punct al feei ctre punctul de observare.
Eliminarea suprafeelor orientate invers ale obiectelor opace trebuie s fie efectuat n orice sistem de
vizualizare, deoarece este un test care se execut eficient i elimin n medie jumtate din suprafeele
obiectelor din scen.
Dac scena este compus dintr-un singur obiect convex opac, eliminarea
feelor orientate invers este suficient pentru a rezolva problema ascunderii feelor
invizibile. Dac, ns, obiectul este concav, este posibil ca o fa orientat direct (ctre
punctul de observare) s fie parial mascat de o fa orientat invers i atunci
eliminarea suprafeelor orientate invers nu mai este suficient, fiind necesar unul din
algoritmii de eliminare a suprafeelor ascunse care se bazeaz pe calculul adncimii.
La fel, dac n scen exist mai mult de un obiect, pe lng eliminarea suprafeelor
orientate invers, este necesar eliminarea suprafeelor ascunse.
Anti-aliasing
Se poate observa uor c liniile afiate pe display apar ca o secven de puncte
care dau un aspect zimat (n trepte de scar), aspect cunoscut sub numele de aliasing.
n text se va pstra termenul original de aliasing, dat fiind c traducerile sunt mai puin
sugestive.
Cauza fundamental a aliasing-ului n grafica pe calculator este crearea
imaginilor prin eantionare n domeniul spaiului i, pentru imaginile animate, i n
domeniul timp. Pentru generarea unei imagini, pasul final l constitue calculul
intensitii pixelilor, care reprezint trecerea de la intensitatea I(x,y) definit n
spaiul bidimensional continuu, la intensitatea fiecrui pixel, n spaiul imagine discret.
Aceast trecere este echivalent cu eantionarea spaiului bidimensional continuu cu o
gril de puncte de eantionare, considerate, de exemplu, n centrul fiecrui pixel
Cea mai familiar manifestare a aliasing-ului l constitue aspectul de asperitate
(jagged) al liniilor sau al muchiilor poligoanelor. De asemenea, suprafeele nguste pot
apare ntrerupte, n funcie de orientarea lor. Un alt efect al aliasing-ului l constitue
apariia i dispariia obiectelor mici, care ocup o suprafa mai mic dect suprafaa
unui pixel i care sunt redate sau nu n funcie de intersecia cu grila de eantionare.
Aceste efecte sunt mai suprtoare n secvenele de imagini n micare.
Muchiile n form de scar sau suprafeele ntrerupte dau o senzaie de micare
necontrolat a acestora (crowl), care este intolerabil n multe aplicaii de realitate
virtual, de exemplu n simulatoarele de zbor.
Tehnicile de prelucrare a imaginii pentru atenuarea efectelor de aliasing sunt
cunoscute sub numele de anti-aliasing. Toi algoritmii folosii pentru diminuarea
efectului de aliasing necesit resurse de memorie i de calcul considerabile i, cu ct
se admit aproximri mai grosiere, cu att scade calitatea imaginii datorit zgomotului
de spectru transpus. n seciunea 7 este prezentat o modalitate de netezire a muchiilor
poligoanelor implementat n biblioteca grafic OpenGL.
Texturarea
(a)
(b)
Fig. 5.13 Suprafee texturate prin aplicarea unei texturi bidimensionale
Aplicaia texturilor
Proiecie
Spaiul obiect
(xm, zm, ym)
Spaiul ecran 3D
(xS, yS)
s
1.0
(a)
(b1)
(b2)
(c)
Filtrarea texturilor
Fenomenul de aliasing care apare n texturare are cauza n eantionarea
imaginii de textur. Transformarea din spaiul ecran 3D n spaiul texturii
bidimensionale genereaz o suprafa n form de patrulater corespunztoare fiecrui
pixel, care este numit pre-imaginea pixelului. Pentru simplificarea prezentrii se
presupune c pre-imaginea pixelului este un ptrat n spaiul texturii (Fig. 5.16).
Pre-imagine
pixel
Pixel
Dac nu se efectueaz
filtrarea texturii, atunci se
Textur
Poligon
atribuie
pixelului
culoarea
texelului cel mai apropiat de
centrul pre-imaginii acestuia. Probelemele de aliasing care apar n aceast situaie sunt
foarte grave, mai ales pentru imaginile suprafeelor privite n perspectiv, n care
variaz mult dimensiunea pre-imaginii pixelilor.
Pre-imaginea unui pixel n planul texturii depinde de poziia suprafeei fa de
punctul i direcia de observare. Se presupune o suprafa ptrat cu parametrii texturii
(0,0), (1,0), (1,1), (0,1), perpendicular pe direcia de observare, la o distan D astfel
c imaginea ei pe ecran este un ptrat de N x N pixeli. Se mai presupune, de
asemenea, c textura folosit are rezoluia de N x N texeli. n aceast situaie, aria preimaginii unui pixel n spaiul texturii este egal un aria unui texel (Fig. 5.17).
Pre-imagine
pixel
Textur
Pixel
Poligon
Pixel
Textur
Poligon
Fig. 5.18 Pre-imaginea unui pixel cu arie mai mic dect aria texelului
Pixel
Poligon
Textur
Fig. 5.19 Pre-imaginea unui pixel cu aria mai mare dect aria unui texel.
Cu ct suprafaa se deprteaz mai mult, cu att crete dimensiunea preimaginii pixelului n planul texturii i, deci, scade frecvena de eantionare a texturii
L=0
L=1
L=2
L=3 L=4
Funcii
afiare
de
control
ale
ferestrei
de
Funcii callback.
Funciile callback se definesc n program i se nregistreaz n sistem prin
intermediul unor funcii GLUT. Ele sunt apelate de sistemul de operare atunci cnd
este necesar, n funcie de evenimentele aprute.
glutDisplayFunc(void(*Display)(void));
Aceast funcie nregistreaz funcia callback Display n care se calculeaz
i se afieaz imaginea. Argumentul funciei este un pointer la o funcie fr
argumente care nu returneaz nici o valoare. Funcia Display (a aplicaiei) este
apelat oridecte ori este necesar desenarea ferestrei: la iniializare, la modificarea
dimensiunilor ferestrei, sau la apelul explicit al funciei gluPostRedisplay().
glutReshapeFunc(void(*Reshape)(int w, int h));
nregistreaz funcia callback Reshape care este apelat oridecte ori se
modific dimensiunea ferestrei de afiare. Argumentul este un pointer la funcia cu
numele Reshape cu dou argumente de tip ntreg i care nu returneaz nici o valoare.
n aceast funcie, programul de aplicaie trebuie s refac transformarea fereastrpoart, dat fiind c fereastra de afiare i-a modificat dimensiunile.
glutKeyboardFunc(void(*Keyboard)(unsigned int key,
int x, int y);
nregistreaz funcia callback Keyboard care este apelat atunci cnd se
acioneaz o tast. Parametrul key este codul tastei, iar x i y sunt coordonatele
(relativ la fereastra de afiare) a mouse-ului n momentul acionrii tastei.
glutMouseFunc(void(*MouseFunc)(unsigned int button,
int state, int x, int y);
nregistreaz funcia callback MouseFunc care este apelat atunci cnd este
apsat sau eliberat un buton al mouse-ului. Parametrul button este codul butonului
(poate avea una din constantele GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON
sau GLUT_RIGHT_BUTTON) . Parametrul state indic apsarea (GLUT_DOWN) sau
eliberarea (GLUT_UP) al unui buton al mouse-ului. Parametrii x i y sunt coordonatele
relativ la fereastra de afiare a mouse-ului n momentul evenimentului.
1
0
0x0000
0x0001
0x0002
0x0003
0x0004
0x0005
0x0006
0x0007
0x0008
0x0009
Bufferul de cadru
Bufferul de cadru (frame buffer) conine toate datele care definesc o imagine
i const din mai multe seciuni logice: bufferul de imagine (sau bufferul de culoare),
deoarece se ofer posibilitatea creerii att a imaginilor cu simplu sau dublu buffer,
monografice i stereografice i selectarea bufferului n care se scrie sau se citete la un
moment dat. Funcia:
void glDrawBuffer(GLenum mode);
stabilete bufferul n care se deseneaz primitivele geometrice. Parametrul mode
poate lua una din valorile: GL_NONE, GL_FRONT_LEFT, GL_FRONT_RIGHT,
GL_BACK_LEFT, GL_BACK_RIGHT, GL_FRONT, GL_BACK, GL_LEFT,
GL_RIGHT, GL_FRONT_AND_BACK. Valoarea implicit este GL_FRONT
pentru imagini cu un singur buffer i GL_BACK pentru imagini cu dublu buffer.
Celelate opiuni se refer la imagini stereoscopice.
Funcia glReadBuffer(GLenum mode) stabilete bufferul curent din
care se citesc pixelii surs n operaii de combinare sau acumulare. Parametrul mode
poate lua una din valorile descrise mai sus. Valoarea implicit este GL_FRONT pentru
imagini monografice cu un singur buffer de culoare sau GL_BACK pentru imagini
monografice cu dou buffere de culoare.
Pentru imaginile stereografice, biblioteca OpenGL pune la dispoziie bufferele
necesare pentru definirea celor dou imagini diferite (stnga, dreapta), pentru simplu
i dublu buffer i funcii pentru selecia ntre acestea. Crearea propriu-zis a imaginilor
stereoscopice este rezolvat la nivelul programului de aplicaie i necesit dispozitive
de afiare adecvate.
Bufferul de adncime (depth buffer) memoreaz adncimea fiecrui pixel i,
prin aceasta, permite eliminarea suprafeelor ascunse. Bufferul de adncime conine
acelai numr de locaii ca i un buffer de imagine, fiecare locaie corespunznd unui
pixel, de o anumit adres.. Valoarea memorat n locaia corespunztoare unui pixel
este distana fa de punctul de observare (adncimea pixelului). La generarea unui
nou pixel cu aceeai adres, se compar adncimea noului pixel cu adncimea
memorat n bufferul de adncime, i noul pixel nlocuiete vechiul pixel (l
ascunde) dac este mai apropiat de punctul de observare. Bufferul de adncime se
mai numete i Z-buffer, de la coordonata z, care reprezint adncimea n sistemul de
referin ecran 3D.
Bufferul ablon (stencil buffer) este un buffer auxiliar care este utilizat pentru
restricionarea desenrii n anumite zone ale porii de afiare. Se pot obine astfel
imagini ncadrate n anumite abloane, ca de exemplu, instrumente de afiare folosite
n simulatoare de antrenament. Bufferul ablon poate fi folosit i pentru redarea
suprafeelor coplanare.
Bufferul de acumulare (accumulation buffer) este folosit pentru crearea
imaginilor antialising prin acumularea intensitilor de culoare a pixelilor rezultai prin
eantionarea imaginii.
vrfuri (vertices). Un vrf definete un punct, captul unei linii sau vrful unui
poligon. Fiecare vrf are asociat un set de date:
coordonate,
culoare,
normal,
coordonate de textur.
Aceste date sunt prelucrate independent, n ordine i n acelai mod pentru
toate primitivele geometrice. Singura deosebire care apare este aceea c, dac o linie
sau o suprafa este decupat, atunci grupul de vrfuri care descriau iniial primitiva
respectiv este nlocuit cu un alt grup, n care pot apare vrfuri noi rezultate din
intersecia laturilor cu planele volumului de decupare (volumul canonic) sau unele
vrfuri din cele iniiale pot s dispar.
Comenzile sunt prelucrate n ordinea n care au fost primite n OpenGL, adic
orice comand este complet executat nainte ca s fie executat o nou comand.
OpenGL este o interfa procedural, secvena de comenzi (apeluri de funcii)
prescriu ce operaii s fie executate i nu ce rezultat s-ar dori s fie obinut. Se pot
specifica valori ale matricelor de transformare, tipul proieciei, coeficieni de reflexie,
etc. Datorit naturii procedurale a bibliotecii OpenGL, este important s fie cunoscut
modul n care operaz, pentru a putea s fie folosit cu succes.
Modelul de execuie OpenGL este modelul client-server. O aplicaie (client)
genereaz comenzi care sunt interpretate i executate de ctre OpenGL (server).
Serverul OpenGL poate s fie execut pe un alt calculator dect aplicaia, dar atunci
trebuie s fie definit un protocol de comunicaie client-server, dat fiind c nu exist
comenzi OpenGL pentru astfel de operaii.
Efectul comenzilor OpenGL asupra bufferului de imagine este controlat de
sistemul Windows care aloc zona de afiare a porii (viewport) OpenGL pe ecran.
Figura 6.1 prezint o diagram bloc simplificat a modului n care OpenGL
prelucreaz datele. S-au ignorat pentru nceput aspectele legate de texturare i antialising. Secvena de operaii OpenGL (numit pipeline grafic) se execut asupra
vrfurilor i asupra datelor asociate acestora: coordonate, culoare, normal (i
coordonate de textur, care nu sunt reprezentate n figur). Succesiunea operaiilor
OpenGL urmeaz aproape identic succesiunea generic a operaiilor grafice prezentat
n Fig. 4.1.
Biblioteca OpenGL primete o succesiune de primitive geometrice pe care le
deseneaz, adic le convertete n mulimea de pixeli corespunztoare, nscriind
valorile culorilor acestora ntr-un buffer de imagine. n continuare sunt detaliate
fiecare dintre operaiile grafice prezentate n figur.
Modul n care este executat secvena de operaii pentru redarea primitivelor
grafice depinde de starea bibliotecii OpenGL, stare care este definit prin mai multe
variabile de stare ale acesteia (parametri). Numrul de variabile de stare ale bibliotecii
este destul de mare, descrierea lor ele poate fi gsit n manualul de referin (OpenGL
Reference Manual), iar pe parcursul expunerii vor fi prezentate numai cele mai
importante dintre acestea.
Vertex
0x0B00
0x0B02
Normal
Culoare
Normala
curent
Culoarea
curent
Matricea ModelView
Iluminare i colorare
Asamblare primitive
mprirea la w; proiecie
Transformarea ferestr-poart
Conversie de rastru
Buffer de imagine
la o valoare dat prin trei componente: rou (red), verde (green), albastru (blue).
Fiind o bibliotec dezvoltat n limbajul C, fr posibilitatea de suprancrcare
a funciilor, selecia unei funcii apelate cu diferite tipuri de argumente de apel este
realizat prin modificarea (printr-un sufix) a numelui funciei. De exemplu, funcia de
setare a culorii curente are mai multe variante, dup tipul i numrul argumentelor:
glColor3f(), glColor3ub(), glColor4d(), etc. n continuare, n
aceast lucrare se noteaz generic cu # sufixul dintr-o familie de funcii (de exemplu,
glColor#()).
Valoarea unui parametru (variabil de stare) OpenGL care nu este de tip binar
se poate obine n orice loc n program prin apelul uneia din funciile glGet#():
void glGetBooleanv(GLenum pname, GLboolean* params);
void glGetDoublev(GLenum pname, GLdouble* params);
void glGetFloatv(GLenum pname, GLfloat* params);
void glGetIntegerv(GLenum pname, GLint* params);
unde params este adreasa unde se depun valorile componente ale parametrului
pname. De exemplu, prin instruciunile:
GLfloat color[4];
glGetFloatv(GL_CURRENT_COLOR, color);
se obin cele patru componente ale culorii curente (red, green, blue, alpha) n vectorul
color.
Primitive geometrice
OpenGL execut secvena de operaii grafice asupra fiecrei primitive
geometrice, definit printr-o mulime de vrfuri i tipul acesteia. Coordonatele unui
vrf sunt transmise ctre OpenGL prin apelul unei funcii glVertex#(). Aceasta
are mai multe variante, dup numrul i tipul argumentelor. Iat, de exemplu, numai
cteva din prototipurile funciilor glVertex#():
void glVertex2d(GLdouble x, GLdouble y);
void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
void glVertex4d(GLdouble x, GLdouble y,
GLdouble z, GLdouble w);
GL_TRIANGLE_STRIP
GL_TRIANGLE_FAN
Primitiv geometric
Deseneaz n puncte
Deseneaz segmentele de dreapt izolate (v0,v1), (v2,v3),
.a.m.d. Dac n este impar ultimul vrf este ignorat
Deseneaz linia poligonal format din segmentele (v0,v1),
(v1,v2), .. . (vn2, v n1)
La fel ca primitiva GL_LINE_STRIP, dar se mai desenez
segmentul (vn, v0) care nchide o bucl.
Deseneaz o serie de triunghiuri folosind vrfurile (v0,v1,v2),
(v3,v4,v5), .a.m.d. Dac n nu este multiplu de 3, atunci ultimele
1 sau 2 vrfuri sunt ignorate.
Deseneaz o serie de triunghiuri folosind vrfurile (v0,v1,v2),
(v2,v1,v3),...a.m.d. Ordinea este aleas astfel ca triunghiurile s
aib aceeai orientare, deci s poat forma o suprafa nchis.
Deseneaz triunghiurile (v0,v1,v2), (v0,v2,v3), .a.m.d.
GL_QUADS
GL_QUADS_STRIP
GL_POLYGON
Acest tabel, mpreun cu figura de mai jos (Fig. 6.2) sunt suficiente pentru
nelegerea modului n care OpenGL interpreteaz primitivele geometrice.
v2
v1
v3
v0
v5
v4
GL_POINTS
v2
v1
v3
v0
v5
v4
v2
v1
v4
v5
v2
v3
v1
v5
v0
v3
v4
GL_QUADS
v0
v7
v2
v1
v3
v0
v5
v4
v5
v5
GL_TRIANGLE_FAN
v7
v6
v3
v4
GL_LINE_LOOP
v4
GL_TRIANGLE_STRIP
GL_TRIANGLES
v1
v2
v2
v3
v0
v5
GL_LINE_STRIP
v0
v2
v1
v3
v5
v3
v0
v4
v0
GL_LINES
v1
v1
v2
v2
v1
v0
v2 v4
v6
GL_QUAD_STRIP
Fig. 6.2 Primitivele geometrice OpenGL
v5
v3
v4
GL_POLYGON
Culoarea se poate specifica prin trei sau patru valori, care corespund
componentelor rou (red), verde (green), albastru (blue), respectiv transparen
(alpha) ca a patra component pentru funciile cu 4 argumente. Fiecare component a
culorii curente este memorat ca un numr n virgul flotant cuprins n intervalul
[0,1]. Valorile argumentelor de tip ntreg fr semn (unsigned int, unsigned char, etc.)
sunt convertite liniar n numere n virgul flotant, astfel nct valoarea 0 este
transformat n 0.0, iar valoarea maxim reprezentabil este transformat n 1.0
(intensitate maxim). Valorile argumentelor de tip ntreg cu semn sunt convertite liniar
n numere n virgul flotant, astfel nct valoarea negativ maxim este transformat
n 1.0, iar valoarea pozitiv maxim este transformat n 1.0 (intensitate maxim).
Valoarea final a culorii unui pixel, rezultat din toate calculele de umbrire,
anti-aliasing, texturare, etc, este memorat n bufferul de imagine, o component fiind
reprezentat printr-un numr n de bii (nu neaprat acelai numr de bii pentru
fiecare component). Deci componentele culorilor pixelilor memorate n bufferul de
imagine sunt numere ntreg n intervalul (0 , 2n 1), care se obin prin conversia
numerelor n virgul mobil prin care sunt reprezentate i prelucrate culorile
primitivelor geometrice, ale materialelor, etc.
Exemplul 6.1
care selecteaz unul din mai multe moduri de combinare liniar ntre culoarea
primitivei i culoarea existent n buffer. Prin combinarea culorilor se simuleaz
transparena suprafeelor precum i alte tehnici de redare realist a imaginilor (antialiasing, cea). Exemple de transparen obinut prin combinarea culorilor sunt date
n seciunea 7.4.5.1.
Exemplul 6.2
Sistemele de referin
Sistemul de referin universal definit n OpenGL este un sistem drept, iar
matricea care reprezint un punct (n plan, n spaiul tridimensional sau n coordonate
omogene) este matrice coloan.
Pentru reprezentarea unei matrice 4x4 folosite pentru transformri geometrice
n coordonate omogene, n OpenGL este utilizat convenia coloan major: fiind dat
un numr de 16 valori reale (tip float sau double), n ordinea a0, a1, a2, a15,
matricea corespunztoare este:
a0
a
A= 1
a2
a3
a4 a8
a5 a9
a6 a10
a7 a11
a12
a13
a14
a15
Direcia de observare
yV
B
A
zV
OV
zV
xV
zV = znear D
zV = zfar
Fig. 6.3 Definirea proieciei perspectiv i a volumului de vizualizare n OpenGL.
Transformri geometrice
Aa dup cum s-a mai artat, nu este eficient s se calculeze produsul dintre
matricea de reprezentare a fiecrui punct i matricele de transformri succesive, ci se
calculeaz o matrice de transformare compus, care se poate aplica unuia sau mai
multor obiecte. Pentru calculul matricelor de transformare compuse (prin produs de
matrice) se folosete o matrice de transformare curent i operaii de acumulare n
matricea curent prin postmultiplicare (nmulire la dreapta): se nmulete matricea
curent cu noua matrice (n aceast ordine) i rezultatul nlocuiete coninutul matricei
curente.
Pentru secvena de transformri n ordinea M1, M2Mn, aplicate obiectelor,
se iniializeaz matricea curent C cu matricea identitate, dup care se calculeaz
matricea compus prin postmultiplicare n ordine invers celei n care se aplic
matricele componente:
C=I
C = CM n = M n
C = CM n-1 = M n M n-1
...............................
C = CM 2 = M n M n -1 ......M 2
C = CM 1 = M n M n-1 ......M 2 M 1
C = M = M n M n-1 ......M 2 M 1
P' = MP = M n M n-1 ......M 2 M 1 P
n aceast transformare, se aplic mai nti matricea M1 punctului P; punctului
transformat rezultat i se aplic transformarea M2, .a.m.d.
Se poate reine deci c matricea compus M se scrie ca produs n ordinea
invers aplicrii transformrilor componente i tot n ordine invers se acumuleaz n
matricea curent.
Acest mod de calcul al matricelor compuse are suport n OpenGL prin mai
multe variabile interne (matrice curente) i funcii prin care acestea pot fi calculate.
Transformarea M3 = T(8,0,0)RZ(/4)S(2,1,2):
glTranslated(8,0,0);
glRotated(45,0,0,1);
glScaled(2,1,2);
Transformarea M4 = T(8,0,0)RZ(/4)S(2,1,2):
glTranslated(-8,0,0);
glRotated(-45,0,0,1);
glScaled(2,1,2);
pentru obiectul 1
,
pentru obiectul 2
..
pentru obiectul k
Cadrul i+1:
pentru obiectul 1
pentru obiectul 2
..
pentru obiectul k
Se pune problema care este cea mai eficient organizare a acestor operaii de
transformri succesive. Dac s-ar utiliza o singur matrice curent, secvena
operaiilor de compunere ar trebui s fie efectuat pentru fiecare obiect, n fiecare
cadru de imagine. Este evident c utilizarea unei singure matrice curente de
transformare este ineficient i nejustificat, dat fiind c o matrice este o resurs
extrem de puin costisitoare.
Soluia adoptat n OpenGL este de a se folosi mai multe stive de matrice de
transformare, n care s fie reinute i reutilizate matricele intermediare de
transformare.
Transformrile de modelare i de observare sunt efectuate ntr-o stiv de
matrice, numit stiva matricelor de modelare-vizualizare (modelview matrix stack).
Transformarea de normalizare este prelucrat ntr-o stiv de matrice separat, numit
stiva matricelor de proiecie (projection matrix stack). Mai exist nc o stiv de
matrice pentru operaiile de texturare, numit stiva matricelor de texturare (texture
matrix stack). Separarea matricelor de modelare-vizualizare i de proiecie permite
execuia n paralel a operaiilor din pipeline-ul grafic al acceleratoarelor hardware care
au prevzute resurse pentru astfel de prelucrri.
Fiecare stiv de matrice se comport asemntor cu o stiv obinuit, asupra
creia se opereaz prin funcii de introducere (push) i extragere (pop). Aceste
funcii difer foarte puin fa de funciile push i pop folosite n general n
programare.
n orice moment, una din cele trei stive de matrice este declarat ca stiv
curent i toate operaiile cu matricele de transformare sunt adresate stivei curente.
Setarea unei stive curente se face prin apelul funciei
void glMatrixMode(GLenum mode);
adaug o nou matrice n stiva curent, egal cu matricea din vrful acesteia, care
devine noul vrf al stivei (Fig. 6.4). ncrcarea unei noi valori n noua matrice curent
se face prin operaii ulterioare de ncrcare sau acumulare prin postmultiplicare. De
fapt, aceasta este caracteristica cea mai important a stivelor matricelor de
transformri, c operaia push se execut prin dou sau mai multe funcii:
glPushMatrix() creaz o nou poziie n capul stivei, identic cu valoarea
glPushMatrix()
glTranslate#()
glPopMatrix()
C=M
C=M T
C=M
C=M
Funcia:
void glPopMatrix();
elimin matricea din vrful stivei curente, iar matricea precedent acesteia devine
noua matrice curent. Aceast funcie nu salveaz matricea eliminat (deci ea nu este
extras, ca n operaiile pop obinuite), iar dac aceast matrice ar mai fi necesar,
ea trebuie s fie copiat n alt zon de memorie, nainte de apelul funciei
glPopMatrix().
Funcia glPushMatrix() se apeleaz atunci cnd o matrice aflat n capul
stivei trebuie s fie salvat pentru a fi utilizat ulterior. Funcia glPopMatrix() se
apeleaz atunci cnd operaiile de compunere a matricelor trebuie s continue cu o
matrice aflat sub capul stivei.
La iniializarea bibliotecii OpenGL, fiecare stiv de matrice conine o matrice
care este vrful stivei respective.
Se poate prezenta acum un program OpenGL simplu, folosind utilitarul GLUT,
care exemplific folosirea stivelor matricelor de transformri geometrice.
Exemplul 6.3
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
(3) Primul obiect are matricea de instaniere MI1 = I, deci matricea curent
(care conine matricea de vizualizare) se aplic coordonatelor vrfurilor
cubului din sistemul de referin de modelare. Funcia Cube() transmite
aceste vrfuri ctre OpenGL:
Cube();
glPopMatrix();
// Redare cub
void Cube(){
glColor3f(0.8,0.8,0.8);
glBegin(GL_POLYGON);
glVertex3d(-1,-1, 1);
glVertex3d( 1,-1, 1);
glVertex3d( 1, 1, 1);
glVertex3d(-1, 1, 1);
glEnd();
glColor3f(0,0,0);
glBegin(GL_LINE_LOOP);
glVertex3d(-1,-1,-1);
glVertex3d( 1,-1,-1);
glVertex3d( 1, 1,-1);
glVertex3d(-1, 1,-1);
glEnd();
glBegin(GL_LINE_LOOP);
glVertex3d(-1,-1,-1);
glVertex3d( 1,-1,-1);
glVertex3d( 1,-1, 1);
glVertex3d(-1,-1, 1);
glEnd();
glBegin(GL_LINE_LOOP);
glVertex3d(-1,1,-1);
glVertex3d( 1,1,-1);
glVertex3d( 1,1, 1);
glVertex3d(-1,1, 1);
glEnd();
glBegin(GL_LINE_LOOP);
glVertex3d(-1,-1,-1);
glVertex3d(-1, 1,-1);
glVertex3d(-1, 1, 1);
glVertex3d(-1,-1, 1);
glEnd();
glBegin(GL_LINE_LOOP);
glVertex3d(1,-1,-1);
glVertex3d(1, 1,-1);
glVertex3d(1, 1, 1);
glVertex3d(1,-1, 1);
glEnd();
// primul obiect
glPushMatrix();
// al doilea obiect
glTranslated(0,-8,0);
glScaled(2,2,2);
// C = RZ(30)T(2,2,20)T(0,8,0)S(2,2,2)
Cube();
glPopMatrix();
// C = RZ(30)T(2,2,20)
glPushMatrix();
// al treilea obiect
glTranslated(8,0,0);
glRotated(45,0,0,1);
glScaled(2,1,2);
// C = RZ(30)T(2,2,20)T(8,0,0)RZ(45)S(2,2,2)
Cube();
glPopMatrix();
// C = RZ(30)T(2,2,20)
glPushMatrix();
// al patrulea obiect
glTranslated(-8,0,0);
glRotated(-45,0,0,1);
glScaled(2,1,2);
//C = RZ(30)T(2,2,20)T(8,0,0)RZ(45)S(2,1,2)
Cube();
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
Exemplul 6.4
rop1 = (rop1+10)%360;
rop2 = (rop2+10)%360;
glutPostRedisplay();
break;
case 'p':
rop1 = (rop1-10)%360;
rop2 = (rop2-10)%360;
glutPostRedisplay();
break;
case 'S':
ros1 = (ros1+10)%360;
glutPostRedisplay();
break;
case 's':
ros1 = (ros1-10)%360;
glutPostRedisplay();
break;
}
}
void Display(void){
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(-1,-1,-zpos);
Axes(3,1.5,2.5);
glColor3f(0.4,0.4,0.4);
glutSolidSphere(0.6, 16, 16);
//transf.de obs.
// soare
glColor3f(0,0,0);
glPushMatrix();
glRotatef(rop1, 0,0,1);
glTranslatef(rp1,0,0);
glutWireSphere(0.25, 8, 8); // planeta 1
Axes(1,0.8,1.8);
glRotatef(ros1, 0,0,1);
glTranslatef(rs1,0,0);
glutSolidSphere(0.1, 8, 8); // satelit 1
Axes(0.5,0.5,1);
glPopMatrix();
glRotatef(rop2, 0,0,1);
glTranslatef(rp2,0,0);
glutWireSphere(0.2, 8, 8);
Axes(0.5,1.1,2.5);
glPopMatrix();
glutSwapBuffers();
// planeta 2
}
void Reshape(int w, int h){
h = (h == 0) ? 1 : h;
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0,(GLfloat)w/(GLfloat)h, 1, 40.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
unde fovy este unghiul de vizibilitate pe vertical (n grade); aspect este raportul
w/h a dimensiunilor pe orizontal i vertical a ferestrei de afiare; zNear i zFar
sunt valorile absolute ale distanelor planelor de vizibilitate apropiat, respectiv
deprtat.
necesar, funcia glPopMatrix()o elimin din stiv i vrful stivei conine acum
matricea de transformare de observare, care poate fi folosit pentru compunerea
matricei pentru cea de-a doua planet. n Fig. 4.5 sunt prezentate dou imagini captate
din fereastra de afiare a programului pentru diferite valori ale poziiilor planetelor i
satelitului. Imaginea nefiind color, s-a considerat c reprezentarea wireframe pentru
planete este mai sugestiv. Pentru fiecare obiect s-au desenat i axele de coordonate
ale sistemul de referin local.
Este interesant de precizat faptul c, n marea majoritate a aplicaiilor grafice,
fiecare imagine (cadru, frame) se genereaz independent de imaginile precedente.
Pentru fiecare cadru se calculeaz poziia de observare i poziia obiectelor n scen
(dac aceasta variaz, aa cum este situaia n exemplul sistemului solar) i imaginea
se genereaz pornind de fiecare dat de la aceste informaii. Trecerea de la o imagine
la urmtoarea prin acumularea unor valori (de micare sau de poziie) nu aduce nici un
beneficiu semnificativ ca vitez de execuie i poate produce erori de poziionare la
execuie un timp ndelungat. Chiar modificarea cu o valoare extrem de mic a poziiei
primitivelor geometrice redate pe display necesit tergerea imaginii precedente i
construirea uneia noi prin reluarea ntregii succesiuni a operaiilor grafice, deoarece
este foarte complicat (practic imposibil) de a se calcula ce pri ale ecranului rmn
neschimbate i ce pri se modific i cum se modific.
unde func poate fi una din mai multe constante simbolice admise (GL_NEVER,
GL_LESS, GL_EQUAL, GL_LEQUAL, GL_GREATER, GL_NOTEQUAL,
GL_GEQUAL, GL_ALWAYS) .
Selecia suprafeelor
orientare
funcie
de
Parametrul list este un indice care identific lista de display i este folosit la
apelul acesteia. Parametrul mode poate lua una din constantele simbolice
GL_COMPILE sau GL_COMPILE_AND_EXECUTE. Modul GL_COMPILE are ca
efect compunerea listei de displaz. Modul GL_COMPILE_END_EXECUTE are ca
efect compunerea listei i execuia ei imediat.
O list de display cu indicele list este executat la apelul funciei:
void glCallList(GLuint list);
glNewList(1,GL_COMPILE);
int n = 8;
double radius = 10;
glColor3d(0,0,0);
glBegin(GL_LINE_LOOP);
for (int i=0;i<n;i++){
double angle = 2*PI*i/n;
glVertex3d(radius*cos(angle),
radius*sin(angle),-40);
}
glEnd();
glEndList();
}
void Init(){
glClearColor(1.0,1.0,1.0,1.0);
DispList1();
}
void Display(){
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glCallList(1);
glutSwapBuffers();
}
Texturarea n OpenGL
Biblioteca OpenGL permite texturarea obiectelor, oferind suport pentru un
numr foarte mare de posibiliti de definire, aplicare i filtrare a texturilor. n lucrare
vor fi prezentate numai o parte dintre aceste posibiliti, ca exemplificare a modului de
implementare a texturrii i ca baz de pornire n crearea aplicaiilor grafice. Celelate
aspecte, mai de detaliu, se pot urmri n manualul de referin al bibliotecii, precum i
n numeroasele exemple care sunt disponibile n OpenGL i GLUT. .
Se pot defini texturi unidimensionale sau bidimensionale, cu rezoluii (numr
de texeli) care se specific la crearea imaginii texturii. Fiecare texel const din una,
dou, trei sau patru componente, reprezentnd valori de modulare sau cvadruple
RGBA. Texturarea poate fi validat sau invalidat prin apelul funciei glEnable(),
respectiv glDisable(), cu argument una din constantele simbolice
GLTEXTURE_1D sau GL_TEXTURE_2D, pentru texturi unidimensionale sau
bidimensionale.
Definirea texturilor
n OpenGL se pot defini mai multe texturi (n general, la iniializarea
programului) i fiecare suprafa se textureaz folosind una dintre acestea. Fiecare
textur (obiect textur - texture object) are un nume unic n program i este definit
printr-un set de date care permit aplicarea acesteia suprafeelor: adresa imaginii
texturii, funcia texturii (modulare, nlocuire, combinare), i proprietile texturii
(filtrri, mod de repetare, etc).
Posibilitatea de a manevra mai multe texturi n timpul execuiei, fr s fie
necesar ncrcarea sau generarea imaginii texturii de fiecare dat, mbuntete
performanele de texturare. Deoarece OpenGL este o interfa de programare scris n
limbajul C, obiectele textur sunt definite prin date i funcii separate, care trebuie s
fie specificate ntr-o anumit ordine:
(a) Generarea numelor texturilor.
(b) Crearea obiectelor textur i conectarea lor (bind) la numele texturilor.
(c) Activarea unei texturi, pentru aplicarea acesteia primitivelor geometrice
care urmeaz.
Numele texturii. Numele texturilor sunt numere ntregi fr semn (de tipul
GLuint) care sunt memorate ntr-un vector transmis ca argument funciei:
void glGenTextures(GLsizei n, GLuint *textureNames);
Aceast funcie creeaz un vector de n nume de texturi, unice n program, pe
care le memoreaz n vectorul textureNames. Numele create nu sunt neaprat
numere succesive. Funcia glGenTextures() creeaz numai numele texturilor i
le marcheaz ca utilizate, dar obiectele textur se creeaz numai la conectarea (bind)
acestora.
Crearea texturilor. Funcia glBindTexture() se folosete att pentru
crearea ct i pentru utilizarea unei texturi. Prototipul ei este:
void glBindTexture(GLenum target, GLuint texName);
Parametrul target poate avea ca valoare una din constantele simbolice
GL_TEXTURE_1D sau GL_TEXTURE_2D, pentru texturi unidimensionale, respectiv
bidimensionale. Argumentul texName este numele unei texturi, generat de funcia
glGenTextures() i memorat n vectorul de nume ale texturilor.
Atunci cnd este apelat prima oar pentru un nume de textur, funcia
glBindTexture() creeaz un nou obiect textur, cu toate datele referitoare la
imaginea
i
proprietile
texturii
implicite.
Dup
apelul
funciei
glBindTexture(), textura cu numele dat ca argument devine textur curent i
toate operaiile ulterioare, att pentru definirea unor proprieti ale texturii, ct i
pentru aplicaia texturii, folosesc textura curent. Textura curent se schimb prin
apelul unei noi funcii glBindTexture().
Crearea imaginii de textur. Imaginea texturii este un tablou unidimensional
sau bidimensional de texeli, fiecare texel avnd una, dou, trei sau patru componente.
n aceste funcii, parametrul target reprezint tipul texturii i poate lua una
din constantele simbolice GL_TEXTURE_1D sau GL_TEXTURE_2D. Parametrul
pname specific numele simbolic al unei proprieti a texturii. i poate lua una din
constantele:
GL_TEXTURE_MIN_FILTER,
GL_TEXTURE_MAX_FILTER,
GL_TEXTURE_WRAP_S,
GL_TEXTURE_WRAP_T. Primele dou valori se
refer la opiunile de filtrare ale texturii i vor fi prezentate n paragraful urmtor.
Urmtoarele valori, seteaz proprietatea de repetare a texturii pentru coordonata s,
respectiv t. n acest caz, parametrul param poate fi GL_REPEAT, pentru repetarea
texturii, sau GL_CLAMP, pentru limitarea texturii la intervalul [0,1].
Mai multe aspecte privind definirea i folosirea texturilor n OpenGL vor fi
detaliate n exemplele care urmeaz.
Exemplul 6.5
n acest exemplu este prezentat programul prin care se aplic texturi n tabl
de ah unor suprafee n spaiu. Imaginea pe care o genereaz este o variant a celei
din Fig. 5.15.
#include <GL/glut.h>
#define imageWidth 64
#define imageHeight 64
static GLubyte image4[imageHeight][imageWidth][4];
static GLubyte image8[imageHeight][imageWidth][4];
static GLuint texName[2];
void Makeimages(){
int c;
for (int i=0;i<imageHeight;i++){
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D, texName[1]);
glPushMatrix();
glTranslated(-2.0,0.0,-8);
glBegin(GL_QUADS);
glTexCoord2f(0.0,0.0);glVertex3f(-0.5,-1.0,0.0);
glTexCoord2f(0.5,0.0);glVertex3f( 0.5,-1.0,0.0);
glTexCoord2f(0.5,1.0);glVertex3f( 0.5, 1.0,0.0);
glTexCoord2f(0.0,1.0);glVertex3f(-0.5, 1.0,0.0);
glEnd();
glPopMatrix();
glPushMatrix();
glTranslated(0.0,0.0,-8);
glRotated(-70,1.0,0.0,0.0);
glBegin(GL_QUADS);
glTexCoord2f(0.0,0.0);glVertex3f(-0.5,-1.0,0.0);
glTexCoord2f(0.5,0.0);glVertex3f( 0.5,-1.0,0.0);
glTexCoord2f(0.5,1.0);glVertex3f( 0.5, 1.0,0.0);
glTexCoord2f(0.0,1.0);glVertex3f(-0.5, 1.0,0.0);
glEnd();
glPopMatrix();
glBindTexture(GL_TEXTURE_2D, texName[0]);
glPushMatrix();
glTranslated(1.5,0.0,-8);
glBegin(GL_QUADS);
glTexCoord2f(0.5,0.0);glVertex3f(0.0,-1.0,0.0);
glTexCoord2f(1.0,0.0);glVertex3f( 1.0,-1.0,0.0);
glTexCoord2f(1.0,1.0);glVertex3f( 1.0, 1.0,0.0);
glTexCoord2f(0.5,0.5);glVertex3f(-0.0, 0.0,0.0);
glEnd();
glPopMatrix();
glutSwapBuffers();
}
void Reshape(int w, int h){
h = (h == 0) ? 1 : h;
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, (GLfloat) w/(GLfloat) h,
0.1, 4000.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main(int argc, char** argv){
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
glutInitWindowSize(500,500);
glutInitWindowPosition(100,100);
glutCreateWindow("Texture Check Image");
Init();
glutDisplayFunc(Display);
glutReshapeFunc(Reshape);
glutMainLoop();
return 0;
}
Imaginea captat din fereastra afiat la execuia acestui program este dat n
Fig. 6.6 i difer de imaginea din Fig. 5.15 prin faptul c se folosesc dou texturi.
n mod obinuit, imaginile texturilor se citesc din fiiere, dar texturile simple,
n tabl de ah, se pot genera prin program. Funcia Makeimages() creeaz dou
tablouri de 64 x 64 locaii, fiecare locaie fiind un vector cu patru componente R, G, B,
A. n primul tablou (image4) este creat o tabl cu 16 x 16 ptrate alternante de
culoare alb i neagr, fiecare ptrat de dimensiune 4 x 4 texeli. n al doilea tablou
(image8) este creat o tabl cu 8 x 8 ptrate alternante de culoare alb i neagr,
fiecare ptrat de dimensiune 8 x 8 texeli.
Texturile sunt definite n funcia Init(). Mai nti se creeaz numele a
dou texturi n vectorul texName[2], prin funcia glGenTextures(). Pentru
crearea i definirea proprietilor fiecrei texturi, se conecteaz mai nti textura
specificat prin numele ei (funcia glBindTexture()) i apoi se specific
proprietile texturii.
n funcia Display() se utilizeaz texturile definite pentru texturarea unor
primitive geometrice. Textura care se aplic este textura curent, activat prin numele
ei dat ca argument funciei de conectare glBindTexture(). Ca urmare, primele
dou suprafee sunt texturate cu textura cu numele texName[1], iar a treia suprafa
este texturat cu textura cu numele texName[0], ceea ce se poate observa n
imaginea din Fig. 4.15. Imaginea din Fig. 3.65 a fost generat cu acelai program, dar
s-a activat numai textura cu numele texName[1], adic textura format din 8 x 8
ptrate. ntr-un bloc glBegin()- glEnd() se transmit vrfurile unei primitive
geometrice; pentru fiecare vrf se definesc mai nti coordonatele de texturare (cu
glTexCoord2f()) i apoi coordonatele spaiale ale vrfului (cu glVertex3f()).
Restul funciilor din program efectueaz operaiile deja cunoscute, de transformri
geometrice, setare culori de tergere, etc.
Filtrarea texturilor
Tipul de filtrare care se aplic unei texturi este definit prin valorile a doi
parametri, GL_TEXTURE_MAG_FILTER i GL_TEXTURE_MIN_FILTER. setai
prin apelul funciei glTexParameter#(). Filtrarea de mrire (magnification,
GL_TEXTURE_MAG_FILTER) se aplic atunci cnd dimensiunea pre-imaginii
pixelului este egal sau mai mic dect dimensiunea texelului (Fig. 6.7(a)). Filtrarea
de micorare (minification, GL_TEXTURE_MIN_FILTER) se aplic atunci cnd
dimensiunea pre-imaginii pixelului este mai mare dect dimensiunea texelului (Fig.
6.7(b)).
Dac nu este definit imagine mip-map a texturii, cei doi parametri de filtrare
GL_TEXTURE_MAG_FILTER i GL_TEXTURE_MAG_FILTER pot lua numai
una din valorile GL_NEAREST sau GL_LINEAR. Valoarea GL_NEAREST
nseamn, de fapt, lipsa filtrrii: se selecteaz texelul cel mai apropiat de centrul preimaginii pixelului. Valoarea GL_LINEAR asigur filtrarea texturii prin calculul mediei
ponderate a patru texeli cei mai apropiai de centrul pre-imaginii pixelului. Dac este
implementat software, filtrarea texturii (GL_LINEAR) este executat mai lent dect
eantionarea acesteia (GL_NEAREST).
n unele cazuri nu este simplu de decis dac trebuie s se execute o filtrare de
mrire sau o filtrare de micorare. Patrulaterul prin care se reprezint pre-imaginea
pixelului poate s aib dimensiunea ntr-o direcie mai mic dect dimensiunea
texelului, iar n alt direcie mai mare dect dimensiunea texelului. n astfel de situaii
OpenGL selecteaz filtrul care d cel mai bun rezultat posibil.
Pre-imagine
pixel
Pixel
Textur
Poligon
(a) GL_TEXTURE_MAG_FILTER
Textur
Poligon
(b) GL_TEXTURE_MIN_FILTER
Exemplul 6.6
#include <GL/glut.h>
#include <gl/glaux.h>
AUX_RGBImageRec *image;
void Cube(){
glBegin(GL_QUADS);
glTexCoord2f(0.0,0.0);glVertex3f(-1.0,-1.0,1.0);
glTexCoord2f(1.0,0.0);glVertex3f( 1.0,-1.0,1.0);
glTexCoord2f(1.0,1.0);glVertex3f( 1.0, 1.0,1.0);
glTexCoord2f(0.0,1.0);glVertex3f(-1.0, 1.0,1.0);
glTexCoord2f(0.0,0.0);glVertex3f(-1.0, 1.0, 1.0);
glTexCoord2f(1.0,0.0);glVertex3f( 1.0, 1.0, 1.0);
glTexCoord2f(1.0,1.0);glVertex3f( 1.0, 1.0,-2.0);
glTexCoord2f(0.0,1.0);glVertex3f(-1.0, 1.0,-2.0);
glTexCoord2f(0.0,0.0);glVertex3f(1.0,-1.0, 1.0);
glTexCoord2f(1.0,0.0);glVertex3f(1.0,-1.0,-2.0);
glTexCoord2f(1.0,1.0);glVertex3f(1.0, 1.0,-2.0);
glTexCoord2f(0.0,1.0);glVertex3f(1.0, 1.0, 1.0);
.
glEnd();
}
void Init(void){
glClearColor(1.0, 1.0, 1.0, 1.0);
glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
image = auxRGBImageLoad("../textures/brick.rgb");
//image = auxRGBImageLoad("../textures/circles.rgb");
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, image->sizeX,
image->sizeY,GL_RGB,GL_UNSIGNED_BYTE,image->data);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,
GL_DECAL);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
GL_REPEAT);
glEnable(GL_TEXTURE_2D);
}
void Display(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Primul obiect,fara filtrarea texturii
glPushMatrix();
glTranslatef(-2.0, -2.5, -8.0);
glRotated(-30, 0.0,1.0,0.0);
glRotated( 20, 1.0,0.0,0.0);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_NEAREST);
Cube();
glPopMatrix();
// Al doilea obiect,cu filtrarea texturii
glPushMatrix();
glTranslatef(-2.0, -2.5, -8.0);
glRotated(20, 0.0,1.0,0.0);
glRotated(20, 1.0,0.0,0.0);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_LINEAR_MIPMAP_LINEAR);
Cube();
glPopMatrix();
glutSwapBuffers();
}
void Reshape(int w, int h){
h = (h == 0) ? 1 : h;
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0,(GLfloat)w /(GLfloat)h,0.1,1000);
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glScaled(4,4,4);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
Funcia main() este identic cu cea din exemplul anterior i nu a mai fost
prezentat din nou. n funcia Reshape() se ncarc matricea din vrful stivei
matricelor de texturare cu o matrice de scalare, care multiplic coordonatele de
texturare cu factorul 4.
n acest program se folosete o singur textur, care este n permanen textura
curent. Toate funciile de definire a parametrilor i de aplicare a texturii se refer la
acest unic textur i nu a mai fost necesar atribuirea unui nume i conectarea (bind)
texturii pentru definire i activare.
Imaginea texturii se citete dintr-un fiier, folosind funcia
auxRGBImageLoad() care aparine unei biblioteci auxiliare OpenGL,
glaux.lib, care nu a fost nc descris. Acest bibliotec auxiliar este o versiune
mai veche a sistemului de dezvoltare GLUT, care a nlocuit-o pentru cea mai mare
parte din funciile de creare a ferestrei de afiare OpenGL, tratare a evenimentelor din
sistem sau generarea unor obiecte tridimensionale. Deoarece n versiunea 3.6 a
sistemului GLUT n care au fost scrise programele, nu exist o funcie de ncrcare a
imaginilor de textur, s-a apelat funcia din glaux.lib. Imaginile n format. Prin
funcii ale bibliotecii glaux.lib se pot ncrca imagini de textur n format RGB
sau n format bitmap DIB (Device Independent Bitmap).
Imaginea citit din fiier este folosit pentru crearea secvenei mip-map de
imagini prefiltrate ale texturii. Acest operaie se poate efectua prin funcia
gluBuild2DMipmaps(). Dup crearea imaginii mip-map a texturii, operaiile de
definire i aplicaie a texturii sunt asemntoare cu cele prezentate n exemplele
precedente. Setarea tipului de filtrare se face n funcia Display() pentru fiecare
din obiecte generate, prin funciile glTexParameterf(). n Fig. 6.8 se observ
diferena dintre imaginea filtrat i imaginea nefiltrat.
(a)
(b)
Lumina
mprtiat
i emis
Lumina
incident
A
Reflexie
difuz
B
Lumina
transmis
Reflexie
direcionat
(specular)
Lumina
absorbit
Reflexie
intern
I V ( i , i , v , v )
E i ( i , i )
(7.1)
V
i
v
i
v
(7.2)
Reflexie
de prim ordin
Reflexie
multipl
Reflexii ale
subsuprafeelor
Orientarea medie
a suprafeei
inciden, dar exist o direcie preferinial, care este direcia reflexiei speculare
pentru suprafeele cu rugozitate redus.
Componenta de difuzie ideal reflect lumina n toate direciile n interiorul
unei semisfere centrate n punctul de inciden, datorit mprtierii provocate de
subsuprafeele componente.
Prin descompunerea funciei de reflexie bidirecional n trei componente se
poate dezvolta un model analitic bazat pe aspecte fizice, optice i geometrice, care s
permit simularea iluminrii i a reflexiei n grafica pe calculator. Modelul de reflexie
Phong este cel mai cunoscut model n grafica pe calculator, care adopt o reprezentare
empiric i fenomenologic, prin formule de calcul simple de imitare a comportrii
teoretice a reflexiei luminii, descrise mai sus.
(7.3)
unde Ii este intensitatea luminii incidente, L este vectorul unitate ndreptat ctre sursa
de lumin i N este vectorul unitate normal la suprafa n punctul de inciden (Fig.
7.4(a)). Pentru o suprafa plan unghiul este constant i, deci, componenta de
reflexie difuz este constant. kd este un coeficient de reflexie (reflectan) empiric,
care depinde de lungimea de und a luminii i de natura suprafeei. Dat fiind c n
reflexia difuz lumina este reflectat n toate direciile, aceast component nu
depinde de poziia de observare.
Dac exist mai multe surse de lumin, atunci:
I d = k d I i , n (L n N )
(7.4)
n
unde Ln este vectorul unitate n direcia celei de-a n-a surs de lumin.
(a)
(b)
(7.5)
N
L
L
V
R
V
(b)
(a)
Fig. 7.5 (a) Indice n mare simuleaz reflexie specular n lob ngust.
(b) Indice n mic simuleaz reflexie specular n lob larg.
nu sunt vizibile din sursa de lumin, dar sunt vizibile din punctul de observare. Fr
componenta ambiental, suprafeele care nu sunt ndreptate ctre o surs de lumin ar
fi redate complet negre, ceea ce ar crea un efect nerealist. Componenta ambiental
aproximeaz iluminarea indirect a suprafeelor, de exemplu datorit reflexiilor
multiple fa de pereii unei incinte. Aceste reflexii sunt foarte de complicat de
simulat, astfel nct modelul Phong le ignor i adaug o component de lumin
ambiental constant dat de relaia:
Ig = Ia k a
(7.6)
I = I a k a + I i k d ( L N) + k s ( R V) n
(7.7)
I r = I a k ar + I i k dr ( L N ) + k sr ( R V ) n
I g = I a k ag + I i k dg ( L N ) + k sg ( R V ) n
I b = I a k ab + I i k db ( L N ) + k sb ( R V ) n
(7.8)
I ( r , g , b ) = I a k a ( r , g , b) + I i k d ( r , g , b ) ( L N ) + k s ( R V ) n
(7.9)
Modele de umbrire
Aplicarea direct a relaiei 7.8 pentru calculul culorii fiecrui pixel necesit un
timp de execuie extrem de ridicat, care nu este acceptabil n grafica interactiv. De
aceea, n sinteza de imagine se folosesc anumite metode simplificate de calcul a
culorii fiecrui pixel, numite tehnici (modele) de umbrire. Tehnicile de umbrire depind
de modul de reprezentare a obiectelor. Pentru obiectele modelate prin reea de
poligoane, se folosesc mai multe modele de umbrire: umbrirea constant (poligonal,
flat), umbrirea Gouraud i umbrirea Phong.
Nv =
i =1
Ni
m
(7.10)
N2
N1
NA
N3
N4
Fig. 7.6 Normala la vrful NA este media normalelor N1, N2, N3, N4
a poligoanelor adiacente n vrful respectiv.
(7.12)
(7.13)
IE
y
yAC
yi+1=yi +1
yi
yB
IC
IA
IB
Ii+1,1 Ii,1
Ii,j
Ii,2
Ii+1,2
(7.14)
(7.15)
O Fig.
alt7.9
deficien
O suprafa
a modelului
pliat regulat
Gouraud
produce este
normale
c nu
n vrfuri
se poate
egale,
obine o pat de
deci colorare
suprafeelor
umbrireaunui
Gouraud
lumin (highlight)
datoratconstant
reflexieiaspeculare
n n
interiorul
poligon, dac vrfurile
poligonului nu sunt cuprinse n aceast pat de lumin.
O parte din deficienele tehnicii de umbrire Gouraud sunt eliminate n modelul
de umbrire Phong.
NC
NA
Ni,j
Linie de baleiere
Ni,1
Ni,2
NB
(7.16)
k c + k ld + k qd 2
Implicit, aceti parametri au valorile: kc=1, kl=0, kq=0, dar ei pot fi setai prin
apelul uneia din funciile glLightf() sau glLighti() astfel:
glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 2.0);
glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 1.0);
glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.5);
Dac se folosesc mai multe surse de lumin, pentru fiecare dintre ele se
definesc componentele intensitii, poziia i caracteristicile de atenuare.
Valoare implicit
Semnificaie
GL_AMBIENT
(0.2,0.2,0.2,1.0)
Reflectana (coeficient de
reflexie) ambiental
GL_DIFFUSE
(0.8,0.8,0.8,1.0)
Reflectana de difuzie
GL_AMBIENT_AND
_DIFFUSE
Reflectana ambiental i
de difuzie
GL_SPECULAR
(0.0,0.0,0.0,1.0)
Reflectana specular
GL_EMISSION
(0.0,0.0,0.0,1.0)
GL_SHININESS
0.0
GL_COLOR_INDEX
(0,1,1)
Exponentul
de
reflexie specular
Indicii culorilor
ambiental, difuz i
specular
ale
materialului
Modelul
de
umbrire
se
definete
prin
apelul
funciei
glShadeModel(GLenum mode), unde argumentul mode poate lua una din
valorile GL_FLAT, pentru modelul de umbrire poligonal, sau GL_SMOOTH, pentru
modelul de umbrire Gouraud. Valoarea implicit este GL_SMOOTH.
Dac nu este validat sistemul de iluminare (prin apelul funciei
glEnable(GL_LIGHTING);) atunci culoarea care se atribuie vrfurilor
primitivelor geometrice este culoarea curent, setat prin apelul unei funcii
glColor#(). Dac s-a definit modelul de umbrire poligonal (GL_FLAT),
primitivele geometrice se genereaz de culoare constant (culoarea curent ntlnit la
primul vrf introdus prin funcia glVertex#()). Dac s-a definit modelul de
umbrire Gouraud (GL_SMOOTH), atunci culorile definite n vrfuri se folosesc pentru
calculul intensitii culorii pixelilor primitivei prin interpolarea biliniar.
Exemplul 7.1
n Fig 7.11 (a) s-a definit umbrirea Gouraud (GL_SMOOTH), iar n Fig 7.11 (b)
s-a definit umbrirea poligonal (GL_FLAT), toate celelate funcii fiind aceleai.
glShadeModel(GL_SMOOTH);
glBegin(GL_POLYGON);
glColor3f(0.5,0.5,0.5);
glVertex3d(-1,-1,-8);
glColor3f(0.1,0.1,0.1);
glVertex3d(1,-1,-8);
glColor3f(0.5,0.5,0.5);
glVertex3d(1,1,-8);
glColor3f(0.9,0.9,0.9);
glVertex3d(-1,1,-8);
glEnd();
(a)
glShadeModel(GL_FLAT);
glBegin(GL_POLYGON);
glColor3f(0.5,0.5,0.5);
glVertex3d(-1,-1,-8);
glColor3f(0.1,0.1,0.1);
glVertex3d(1,-1,-8);
glColor3f(0.5,0.5,0.5);
glVertex3d(1,1,-8);
glColor3f(0.9,0.9,0.9);
glVertex3d(-1,1,-8);
glEnd();
(b)
Exemplul 7.2
Pentru generarea imaginii din Fig. 7.8 din seciunea precedent, s-a validat
sistemul de iluminare, s-a definit sursa de lumin GL_LIGHT0 i s-au definit
parametrii materialului feelor sferei. Programul scris folosind sistemul de dezvoltare
GLUT este urmtorul:
#include <GL/glut.h>
void Init(){
GLfloat light_ambient[] = {1.0, 1.0, 1.0, 1.0};
GLfloat light_diffuse[] = {1.0, 1.0, 1.0, 1.0};
GLfloat light_specular[] = {1.0, 1.0, 1.0, 1.0};
GLfloat mat_ambient[] = {0.1, 0.1, 0.1, 1.0};
GLfloat mat_diffuse[] = {0.9, 0.9, 0.9, 1.0};
GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};
GLfloat mat_shininess = 50.0 ;
glClearColor(0.0,0.0,0.0,0.0);
glEnable(GL_DEPTH_TEST);
glClearDepth(1.0f);
// implicit
glDepthFunc(GL_LESS);
// implicit
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialf(GL_FRONT, GL_SHININESS, mat_shininess);
glShadeModel(GL_SMOOTH);
// implicit
}
void Display(void){
GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0};
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glPushMatrix();
glTranslatef(-1.5,0,-8);
//transf. modelare
glShadeModel(GL_FLAT);
glutSolidSphere(1,16,16);
glPopMatrix();
glPushMatrix();
glTranslatef(1.5,0,-8);
glShadeModel (GL_SMOOTH);
glutSolidSphere(1,16,16);
glPopMatrix();
glutSwapBuffers();
// transf. modelare
}
void Reshape(int w, int h){
h = (h == 0) ? 1 : h;
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0,(GLfloat)w/(GLfloat)h, 1, 40.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
Normalele
n
geometrice
vrfurile
primitivelor
Normala se poate specifica prin componentele nx, ny, nz, sau printr-un
pointer la un vector care conine cele trei componente, de tipul cerut prin numele
funciei glNormal#().
Normalele se poate defini n orice loc n program, n exteriorul sau n
interiorul unui bloc glBegin()-glEnd(). Dac normala se definete o singur
dat pentru o primitiv geometric, aceast valoare este folosit pentru calculul
intensitilor tuturor vrfurilor primitivei geometrice. n mod normal ns, pentru
calculul corect al intensitilor culorii n vrfuri, este necesar ca normala s fie definit
pentru fiecare vrf al primitivei geometrice, deci funciile glNormal#() se apeleaz
alternant cu funciile glVertex#() n interiorul blocului glBegin()-glEnd().
n exemplul precedent nu a fost necesar definirea normalelor, deoarece
funcia glutSolidSphere() le definete n mod automat, dar, pentru calculul
iluminrii unui obiect definit printr-o mulime de primitive date prin vrfurile lor, este
nesesar s fie definite toate normalele n vrfuri.
Normalele se specific n aceelai sistem de referin ca i vrfurile
primitivelor geometrice, deci n sistemul de referin de modelare. Acest mod de
calcul permite ca normalele n vrfuri s fie calculate o singur dat, la modelare, i
memorate ca parte a modelului obiectului n baza de date grafic. Asupra lor se aplic
n mod automat transformarea de modelare-vizualizare folosind valoarea matricei din
vrful stivei de modelare-vizualizare, existent n momentul apelului funciei
glNormal#(). n felul acesta, normalele sunt transformate n sistemul de referin
de observare, unde se calculeaz intensitile componentelor de reflexie n vrfurile
primitivelor geometrice.
Exemplul 7.3
(b)
(a)
glVertex3d( 1, 1,1);
glNormal3d(-1, 1,1);
glVertex3d(-1, 1,1);
glEnd();
glBegin(GL_POLYGON);
glNormal3d(1,-1, 1);
glVertex3d(1,-1, 1);
glNormal3d(1,-1,-1);
glVertex3d(1,-1,-1);
glNormal3d(1, 1,-1);
glVertex3d(1, 1,-1);
glNormal3d(1, 1, 1);
glVertex3d(1, 1, 1);
glEnd();
glPopMatrix();
glutSwapBuffers();
}
n funcia Display() sunt introduse numai trei din cele ase fee ale cubului;
celelate trei se definesc n mod similar. Funcia glEnable(GL_NORMALIZE) are
ca efect scalarea la valoarea unitate a vectorilor normalelor introduse prin funciile
glNormal#().
Dac se comenteaz toate funciile glNormal3d() din programul de mai sus, se
obine imaginea din Fig. 7.13(b), n care nu se obine umbrirea feelor cubului.
Exemplul 7.4
(a) =0
(e) =180
(b) =45
(f) =225
Fig. 7.14 Surs de lumin fix n direcia (1.0, 1.0, 1.0, 0.0).
Exemplul 7.5
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
Sursa de lumin direcional are direcia (1.0, 1.0, 1.0, 1.0) care, transformat
cu matricea identitate, pstreaz aceeai valoare n sistemul de referin de observare.
De aceea, indiferent de poziia i direcia de observare, obiectele sunt iluminate dintr-o
direcie fix fa de direcia de observare.
n Fig. 7.15 sunt reprezentate mai multe imagini, pentru direcii de observare
diferite. Unghiul (gamma n program) de rotaie fa de axa y se modific prin
comenzi de la tastatur, prelucrate de funcia callback Keyboard().
(a) =0
(c) =90
(b) = 30
(c) =150
Exemplul 7.6
(a) =0
(b) = 60
(c) = 180
Combinarea culorilor
Mai multe efecte n redarea obiectelor (transparen, anti-aliasing, cea) se
obin prin combinarea culorilor la nivel de pixel.
Pentru validarea operaiei de combinare a culorilor la nivel de pixel (blending)
se apeleaz funcia glEnable(GL_BLEND). n cursul combinrii, culoarea unui
Surs-destinaie
Factorul de combinare
GL_ZERO
(0,0,0,0)
GL_ONE
(1,1,1,1)
GL_DST_COLOR
surs
(Rd,Gd,Bd,Ad)
GL_SRC_COLOR
destinaie
(Rs,Gs,Bs,As)
GL_ONE_MINUS_DST_COLOR
surs
(1,1,1,1)-(Rd,Gd,Bd,Ad)
GL_ONE_MINUS_SRC_COLOR
destinaie
(1,1,1,1)-(Rs,Gs,Bs,As)
GL_SRC_ALPHA
(As,As,As,As)
GL_DST_ALPHA
(Ad,Ad,Ad,Ad)
GL_ONE_MINUS_SRC_ALPHA
(1,1,1,1)- (As,As,As,As)
GL_ONE_MINUS_DST_ALPHA
(1,1,1,1)- (Ad,Ad,Ad,Ad)
GL_SRC_ALPHA_SATURATE
surs
(f,f,f,1);
f=min(As,1-Ad)
Transparena
Transparena suprafeelor se implementeaz folosind combinarea cu factorii
de combinare GL_SRC_ALPHA, pentru surs i GL_ONE_MINUS_SRC_ALPHA
pentru destinaie.
Exemplul 7.7
0.90
0.85
0.80
0.35
0.50
0.65
0.80
0.20
Fig. 7.17 Combinarea culorilor n calculul transparenei.
Triangle();
glPopMatrix();
glPushMatrix();
glTranslated(-2.0,4.0,0.0);
glColor4d(0.8,0.8,0.8,0.50);
Triangle();
glPopMatrix();
glPushMatrix();
glTranslated(2.0,4.0,0.0);
glColor4d(0.8,0.8,0.8,0.75);
Triangle();
glPopMatrix();
// al doilea triunghi
// al doilea triunghi
// al treilea triunghi
glPushMatrix();
glTranslated(6.0,4.0,0.0);
glColor4d(0.8,0.8,0.8,1.0);
Triangle();
// al patrulea triunghi
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
n funcia Init() se seteaz culoarea de tergere alb (1.0, 1.0, 1.0, 1.0) a
bufferului de culoare i factorii de combinare GL_SRC_ALPHA, pentru surs i
GL_ONE_MINUS_SRC_ALPHA pentru destinaie.
Dreptunghiul se nscrie n buffer cu culorea lui iniial. Culoarea fiecruia din
cele 4 triunghiuri care urmeaz (poligoane surs) se combin la nivel de pixel cu
culoarea existent n buffer (care poate fi culoarea de tergere sau culoarea
dreptunghiului) folosind pentru factorii de combinare valoarea transparenei sale.
Primele trei triunghiuri sunt compuse din dou culori: una rezultat din combinarea
culorii proprii cu culoarea dreptunghiului, cealalt rezultat din combinarea culorii
proprii cu culoarea de tergere. De exemplu, pentru primul triunghi, n partea de jos,
suprapus peste dreptunghi, fiecare component de culoare R,G,B are intensitatea
0.25 * 0.8 + (1- 0.25)*0.2 = 0.35; n partea de sus, prin combinare cu culoarea de
tergere, fiecare component de culoare R,G,B rezultat are intensitatea 0.25 * 0.8 +
(1- 0.25)*1.8 = 0.95. Pentru al doilea triunghi componentele de culoare sunt 0.5 pentru
partea de jos i 0.9 pentru partea de sus; pentru al treilea triunghi componentele de
culoare sunt 0.65 pentru partea de jos i 0.85 pentru partea de sus. Ultimul triunghi, cu
As = 1, nlocuiete complet valorile existente n buffer i este desenat cu componentele
de culoare 0.8 n ambele pri de suprapunere.
De remarcat c n acest program simplu nu este validat bufferul de adncime.
n mod implicit, n OpenGL testul de adncime este invalidat i, deoarece nu se
valideaz nici la iniializare nici n alt parte n program, testul de adncime nu se
efectueaz i poligoanele sunt nscrise n bufferul de imagine n ordinea n care sunt
transmise, indiferent de adncimea lor.
Acest lucru trebuie s fie evitat atunci cnd sunt reprezentate obiecte
tridimensionale opace i transparente n scen. Dat fiind c obiectele tridimensionale
se pot ascunde unele pe altele este necesar s se valideze testul de adncime prin
Anti-aliasing
Biblioteca OpenGL pune la dispoziie dou modaliti de redare antialiasing:
prin combinarea culorilor (blending) i prin buffer de acumulare (A-buffer).
Redarea anti-aliasing prin combinarea culorilor este o tehnic de prefiltrare a
imaginii i d rezultate de netezire numai dac se renun la mecanismul de Z-buffer
(buffer de adncime) i se deseneaz suprafeele n ordinea n care sunt transmise
bibliotecii. n aceast situaie, culoarea unui pixel acoperit parial de un poligon se
obine prin combinarea culorii poligonului cu culoarea pixelului, aflat n bufferul de
culoare. n modul RGBA, OpenGL multiplic componenta A a culorii poligonului cu
ponderea de acoperire (raportul dintre aria acoperit de fragmentul poligonului i aria
pixelului). Aceast valoare poate fi folosit pentru ponderarea culorii n fiecare pixel
prin combinare cu factorul GL_SRC_ALPHA pentru surs i factorul
GL_ONE_MINUS_SRC_ALPHA i pentru destinaie. Pentru efectuarea acestor
calcule, mai este nesesar validarea anti-aliasing-ului prin apelul funciei
glEnable() cu unul din argumentele GL_POINT_SMOOTH, GL_LINE_SMOOTH,
GL_POLYGON_SMOOTH, pentru puncte, linii i, respectiv, poligoane.
Exemplul 7.8
Programul din acest exemplu este cel folosit pentru generarea imaginilor a
dou triunghiuri cu i fr antialiasing. Funciile callback Init() i Display() ale
programului dezvoltat sub GLUT sunt urmtoarele:
void Init(){
glClearColor(1.0,1.0,1.0,1.0);
glLineWidth (1.5);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
void Display(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(0.0,0.0,0.0);
glPushMatrix();
glTranslated(0.0,0.0,-25.0);
// Triunghiuri fr antialiasing
glDisable(GL_BLEND);
glDisable(GL_LINE_SMOOTH);
glDisable(GL_POLYGON_SMOOTH);
glPushMatrix();
glTranslated(-8,0,0.0);
glBegin(GL_LINE_LOOP);
glVertex3d(-3,-3,0);
glVertex3d( 3,-2,0);
glVertex3d( 2,3,0);
glEnd();
glPopMatrix();
glPushMatrix();
glTranslated(-2,0,0.0);
glBegin(GL_POLYGON);
glVertex3d(-3,-3,0);
glVertex3d( 3,-2,0);
glVertex3d( 2,3,0);
glEnd();
glPopMatrix();
// Triunghiuri cu antialiasing
glEnable(GL_BLEND);
glEnable(GL_LINE_SMOOTH);
glEnable(GL_POLYGON_SMOOTH);
glPushMatrix();
glTranslated(4,0,0.0);
glBegin(GL_LINE_LOOP);
glVertex3d(-3,-3,0);
glVertex3d( 3,-2,0);
glVertex3d( 2,3,0);
glEnd();
glPopMatrix();
glPushMatrix();
glTranslated(10,0,0.0);
glBegin(GL_POLYGON);
glVertex3d(-3,-3,0);
glVertex3d( 3,-2,0);
glVertex3d( 2,3,0);
glEnd();
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
(a)
(b)
Descriere
3ds
dxf
obj
phd
iv
dwb
flt14
T2
O2
O1
T11
T12
G1
T21
T22
G21
G22
Construirea
Fig. 8.1Graful
ierarhic
unui scene
a virtuale
sceneireprezentat
permite printr-o
reutilizarea
ierarhie de
obiectelor
noduri.
i a
transformrilor geometrice. Un obiect complex se compune din gruparea mai multor
obiecte mai simple, dintre care unele se repet, n poziii de instaniere diferite. n felul
acesta, un nod poate avea mai mult de un nod printe.
Nodurile grafului sunt de mai multe tipuri, dintre care cele mai importante
sunt: nodurile de descriere geometric (forma) a obiectelor tridimensionale, noduri de
transformare i noduri de grupare.
Nodurile de descriere geometric conin modele ale unor obiecte elementare,
reprezentate poligonal, parametric sau prin descrierea matematic ntr-un sistem de
referin local (de modelare). n Fig.8.1 nodurile A, B, C, D, E, F reprezint obiecte
tridimensionale. Nodul G1 grupeaz mai multe obiecte simple, formnd un obiect
compus care, la rndul lui este instaniat de dou ori, n poziii definite prin
intermediul nodurilor de transformare T1 i T2, rezultnd obiecul O1, s.a.m.d. Nodul R
este un nod grup i reprezint rdcina grafului scenei.
Graful scenei descrie relaiile de motenire ntre noduri. Atributele unui obiect
descris de un nod pot fi cele motenite de la nodul printe, pot fi completate, sau
redefinite n nodul fiu.
Scena virtual este definit n sistemul de referin universal, n care se
poziioneaz i orienteaz punctul de observare n fiecare cadru al imaginii generate.
Obiectele din nodurile frunz sunt reprezentate ntr-un sistem de referin local. Un
nod de transformare conine o matrice de transformare M care definete poziia i
orientarea sistemului de referin al nodului fiu n sistemul de referin al nodului
printe. Transformarea prin aplicarea matricei M punctelor obiectelor din nodul fiu, le
transform din sistemul de referin al nodului fiu n sistemul de referin al nodului
printe.
Redarea imaginii unei scene reprezentat printr-un graf aciclic direcionat se
obine prin parcurgerea (traversarea) grafului scenei. Traversarea grafului scenei este
o operaie de parcurgere a grafului n adncime (depth first search), care ncepe cu
nodul rdcin al grafului i parcurge toate drumurile n graf pn la fiecare nod
frunz. n acest fel, un nod poate fi traversat de mai multe ori, pe ci diferite de
parcurgere. De exemplu, n graful din Fig. 8.1 nodul A este instaniat de dou ori,
odat pe calea RT1O1T11G1A i a doua oar pe calea RT1O1T12G1A; la fel i nodurile B
i C.
n reprezentarea ierarhic a obiectelor i a scenei, un obiect tridimensional
este instaniat (plasat n sistemul de referin universal) prin aplicarea unei secvene de
transformri de instaniere, i anume toate transformrile din nodurile de transformare
de la rdcin pn la nodul frunz pe una din cile de parcurgere a grafului.
Combinarea dintre operaia de parcurgere n adncime a grafului i operaiile de
concatenare a matricelor de transformare prin intermediul stivelor de transformare
Notaiile care s-au folosit n acest algoritm sunt evidente. Tipul nodului
(node->type) determin modul de prelucrare a acestuia. Un nod grup are
nChilds noduri fii, numerotai childs[i]. Un nod de transformare conine o
matrice de transformare M. Travesarea ncepe prin iniializarea matricei curente de
transformare cu matricea identitate (C = I) i apelul funciei de traversare pentru nodul
rdcin al scenei (Traversal(R)).
Matricele de instaniere se introduc n stiv n ordinea invers aplicrii lor
asupra obiectului, aa cum este necesar n operaia de acumulare prin postmultiplicare.
De exemplu, pentru prima instan a obiectului A, se execut operaiile:
C=I
C = C M1 = M1
C = C M12 = M1M12
Un punct oarecare P a obiectului A este instaniat prin transformarea:
P = CP = M1M12P
8.2Limbajul VRML
Limbajul VRML (Virtual Reality Modeling Language) este un limbaj folosit n
crearea scenelor virtuale tridimensionale, cu posibilitatea de acces a acestora prin
reeaua internet WWW (World Wide Web). Versiunea folosit n momentul de fa este
VRML 2.0 (numit i VRML 97, fiind standard ISO din anul 1997) i este o revizuire
a versiunii VRML 1.0, stabilit n 1995. Numeroase informaii referitoare la limbajul
VRML se pot gsi n reeaua internet (http://www.vrml.org).
n prima versiune, limbajul VRML 1.0 permitea crearea unei scene virtuale
compus din obiecte tridimensionale, dar cu posibiliti limitate de interactivitate prin
reeaua internet. VRML 1.0 s fost dezvoltat pe baza formatului de descriere a bazelor
de date Open Inventor, dezvoltat de firma Silicon Graphics, care suport descrierea
scenelor ierarhice cu obiecte poligonale, lumini, materiale i efecte realiste. Un subset
a formatului Open Inventor, cu extensii pentru acces prin reeaua internet, a constituit
baza de pornire pentru limbajul de descriere a scenelor virtuale VRML. n momentul
de fa, numeroase titluri de cri, articole, reviste, documentaie, exemple, adrese de
grupuri de lucru, etc., se gsesc pe reea despre limbajul VRML i utilizarea acestuia.
Un fiier VRML este un fiier ASCII care conine descrierea unei scenei
virtuale i a unor aciuni interactive, i poate fi accesat prin reea folosind programe de
navigare (browsere). Pentru a afia o scen VRML din reeaua internet sau dintr-un
fiier de pe disc (cu extensia .vrl) este necesar un browser VRML, configurat ca o
extensie (plug-in) al unui browser Web. Pentru browserul Netscape Navigator, exist
browserul Cosmo Player (de la compania Platinum Technology) pentru interpretarea
fiierelor VRML. Un browser VRML citete fiierul care conine descrierea scenei
virtuale, creaz graful scenei i memoreaz datele de comportare a obiectelor i de
interaciuni corespunztoare. Observarea scenei virtuale i navigarea n direcia dorit
se realizeaz prin comenzi ale browserului. Aceste comenzi sunt foarte simple i se
gsesc n Help.
Dei utilizarea cea mai frecvent a limbajului VRML este n crearea i redarea
scenelor 3D prin reeaua www, un fiier VRML poate fi folosit i ca descriere a unei
scene virtuale pentru aplicaii de realitate virtual care nu se desfoar n reea. n
aceast situaie, pentru citirea fiierelor VRML se folosete un program de interpretare
a fiierelor VRML (parser) care creeaz graful scenei n concordan cu structura
programului de aplicaie. n domeniul public pe reeaua internet sunt disponibile un
mare numr de parsere care pot fi integrate ntr-o aplicaie. De exemplu, exist VRML
2.0 Parser de la Silicon Graphics (http://vrml.sgi.com/) sau Viper Parser (de
la NIST- National Institute of Standard and Technology) implementat n limbajul Java,
orientat pe obiecte.
n oricare situaie, formatul VRML permite construirea grafului scenei,
furniznd toate informaiile despre obiectele tridimensionale, ierarhia acestora,
condiii de mediu ambiant, materiale, etc. Graful scenei, construit prin citirea unuia
sau mai multor fiiere VRML, este apoi traversat pentru obinerea imaginii obiectelor
n diferite situaii de navigare a scenei. Redarea imaginii obiectelor pe display se
realizeaz prin intermediul bibliotecilor grafice de nivel mai sczut, cum sunt OpenGL
sau Direct3D (de la Microsoft). Aceste biblioteci asigur interfaa corespunztoare cu
acceleratorul grafic al sistemului.
Specificaiile limbajului VRML 97 descriu conceptele de realizare a scenelor
virtuale, descrierea nodurilor, descrierea cmpurilor, a evenimetelor i interaciunea
ntre noduri. Similar limbajelor de programare standard, specificaiile VRML conin
reguli sintactice i reguli semantice ale limbajului.
Un fiier VRML conine un header (acelai pentru ISO VRML 97 i VRML
2.0), urmat de descrierea nodurilor grafului scenei, care specific formele geometrice,
grupurile, transformrile i atributele mediului virtual care se contruiete i
vizualizeaz. Sintaxa VRML este simpl, cu cuvinte cheie n limba Englez sugestive
pentru entitatea definit. Headerul fiierului este:
#VRML 2.0 utf8
# Alte comentarii
unde utf8 este setul de caractere folosit. Este obligatorie introducerea versiunii
VRML 2.0 imediat dup caracterul # (fr nici un spaiu liber).
Un nod este specificat prin tipul nodului, urmat de un bloc cuprins ntre
acolade. Blocul din interiorul acoladelor conine zero sau mai multe cmpuri (fields) i
pentru fiecare cmp se specific valoarea (sau valorile) acestuia (field value). Fiecare
cmp al unui nod are un nume i admite una sau mai multe valori de un tip de date
determinat de tipul parametrului.
n VRML este extins noiunea de nod pentru orice entitate care grupeaz mai
multe informaii. Se poate observa diferena dintre noiunea de nod VRML i noiunea
de nod ntr-un graf al scenei. Un nod ntr-un graf este o component a unei structuri
ierarhice, fiecare nod avnd unul sau mai muli prini (cu excepia nodului rdcin
care nu are nici un printe) i unul sau mai muli fii (cu excepia nodurilor frunz care
nu au fii). Un nod VRML poate fi nod n graful scenei, sau poate s fie inclus (ca
valoare a unui cmp) ntr-un alt nod. Modul cum se construiete graful scenei pornind
de la specificarea nodurilor VRML depinde de programul de aplicaie.
Sistemele de coordonate folosite n VRML sunt aceleai cu sistemle de
coordonate din OpenGL: sistemul de referin universal este un sistem drept, sistemul
de referin observator este de asemenea un sistem de referin drept, definit ca
localizare i orientare relativ la sistemul de referin universal; proiecia perspectiv se
definete printr-un plan perpendicular pe axa z a sistemului de referin de observare,
cu direcia de observare spre z .
Cylinder,
EvaluationGrid,
Extrusion,
IndexedFaceSet,
IndexedLineSet, Normal, PointSet, Shape, Sphere, Text.
Aspect
(appearance):
Appearance,
Color,
FontStyle,
ImageTexture,
Material,
MovieTexture,
PixelTexture,
Texture-Coordinate, TextureTransform.
Grupuri (grouping): Anchor, Billboard, Collision, Group,
Inline, LOD, Switch, Transform.
Mediu (environment): AudioClip, Background, DirectionalLight, Fog, PointLight, Sound, SpotLight.
Vizualizare (viewing): NavigationInfo, Viewpoint.
Animaie
(animation):
ColorInterpolator,
CoordinateInterpolator,
NormalInterpolator,
OrientationInterpolator, PositionInterpolator, ScalarInterpolator,
TimeSensor.
Interaciuni
(interaction):
CylinderSensor,
PlaneSensor,
ProximitySensor,
SphereSensor,
TouchSensor,
VisibilitySensor.
Alte noduri: Script, WordInfo.
n total sunt 54 de tipuri de noduri, i fiecare tip admite unul sau mai multe
tipuri de cmpuri. Tipurile de date prin care se specific valoarea unui cmp pot fi:
numere ntregi, numere n virgul mobil, valori boolene, iruri de caractere, sau pot fi
folosite chiar noduri VRML. Un exemplu de fiier VRML foarte simplu este dat n
continuare.
Exemplul 8.1
#VRML 2.0 utf8
# Construieste un cilindru 3D
Shape {
appearance Appearance {
material Material {
diffuseColor 0.0, 0.5, 1.0
}
}
geometry Cylinder {
height 2.0
radius 1.5
}
}
Nodul de tipul Shape introduce un obiect tridimensional pentru care se
specific cmpurile cu numele appearance i geometry, pentru definirea
aspectului i a formei. Valoarea cmpului appearance este un nod de tipul
Appearance, definit imediat prin blocul corespunztor ntre acolade. Nodul
Apperence are specificat cmpul material a crui valoare este dat printr-un nod
de tipul Material. Nodul de tip Material conine cmpul diffuseColor,
pentru care se specific valoarea prin trei numere n virgul flotant, pentru
componentele rou, verde, albastru. Valoarea cmpului geometry este un nod de
tipul Cylinder, care este definit prin cmpurile heigth i radius, cu valori
numere n virgul mobil.
Un fiier VRML poate conine mii de noduri i fiecare nod conine un numr
variabil de cmpuri, tipic dou-trei cmpuri, dar pot fi i zeci de cmpuri. Din fericire,
toate cmpurile nodurilor au prevzute valori implicite rezonabile, astfel c nodurile
pot fi folosite chiar dac nu se specific valoarea tuturor cmpuri. De exemplu,
valoarea implicit a culorii de tergere este negru, i, dac nu se specific alt culoare
de fundal (printr-un nod Background), atunci, la navigare prin intermediul
browserelor fundalul rmne negru. Poziia iniial a punctului de observare este este
la (0.0, 0.0, 10.0) i, dac nu se specific alt poziie, (printr-un nod Viewpoint),
atunci navigarea ncepe cu aceast poziie.
Sunt considerate comentarii toate caracterele dup caracterul # pn la
sfritul liniei. Nodurile, cmpurile i valorile cmpurilor pot fi aranjate n oricte
linii; spaiile, tab-urile, virgulele i caracterul de linie nou sunt considerate spaii albe
(white spaces) i ignorate la citire. VRML este case-senzitive, adic difereniaz
literele mici de cele mari.
Exemplul 8.2
#VRML V2.0 utf8
# cub.wrl - construiete un cub prin fee indexate
Shape {
appearance Appearance {
material Material { }
}
geometry IndexedFaceSet {
coord Coordinate {
point [
# Coordonatele de deasupra a cubului
-1.0 1.0 1.0,
1.0 1.0 1.0,
1.0 1.0 -1.0,
-1.0 1.0 -1.0,
# Coordonatele de jos ale cubului
-1.0 -1.0 1.0,
1.0 -1.0 1.0,
1.0 -1.0 -1.0,
-1.0 -1.0 -1.0
]
}
coordIndex [
0, 1, 2, 3, -1,
7, 6, 5, 4, -1,
0, 4, 5, 1, -1,
1, 5, 6, 2, -1,
2, 6, 7, 3, -1,
3, 7, 4, 0
]
}
Exemplul 8.3
#VRML V2.0 utf8
# semn3D.wrl semnul plus tridimensional
Group {
children [
Background {
skyColor 1.0 1.0 1.0
},
Viewpoint {
Shape {
appearance USE White
geometry Box {
size 2.0 25.0 2.0
}
},
Shape {
appearance USE White
geometry Box {
size 2.0 2.0 25.0
}
}
Imaginea care se obine la vizualizarea acestui fiier VRML este dat n Fig.
8.2 . Grupul conine ase noduri fii, trei noduri de descriere a unei forme geometrice
(nodurile Shape), un nod de surs lumin (DirectionalLight), un nod de
definire a culorii de tergere (Background) i un nod de poziionare a punctului de
observare (Viewpoint). Lista de fii este introdus ntre paranteze drepte precedate
de cuvntul cheie children.
n acest exemplu este folosit etichetarea nodurilor. Orice nod poate primi o
etichet introdus prin cuvntul-cheie DEF. Un nod odat etichetat la definiie, poate fi
folosit ca valoare a unui cmp prin simpla introducere a cuvntului-cheie USE urmat
de eticheta nodului. n exemplul de mai sus, un nod de aspect a fost etichetat cu
numele White (DEF White Appearance{}) i apoi folosit cu acest nume
ca valoare a unui cmp (appearance USE White).
Aceast imagine se obine fie prin intermediul unui browser (Cosmo Player
pentru Netscape), fie prin interpretare (parsarea) fiierului, crearea grafului scenei i
redarea imaginii acestuia.
n fiierul semn3D.wrl mai este folosit un nod pentru definirea culorii de
fundal (nodul Background cu cmpul skyColor), nodul Viewpoint pentru
definirea poziiei de observare i nodul DirectionalLight pentru definirea unei
surse de lumin direcional. Se pot remarca unele diferene ntre conveniile de
definire a unor date n VRML i cele din OpenGL. De exemplu, pentru rotaie se
specific mai nti componentele axei de rotaie, apoi unghiul de rotaie n radiani (n
OpenGL se d mai nti valoarea unghiului n grade, apoi componentele axei de
rotaie).
Nodul Switch conine o list ordonat de noduri fii care conin reprezentri
variate ale aceluiai obiect. n cursul redrii, se selecteaz n secven cte unul din fii
la fiecare cadru de imagine, ceea ce creeaz impresia de evoluie (modificare
dinamic) a obiectului. n acest fel sunt redate luminile de semnalizare (care i
schimb culoarea sau intensitatea la intervale stabilite de timp) sau flcrile, fumul,
etc.
Nodul LOD conine reprezentarea unui obiect cu nivele de detaliu multiple.
Fiecare nod fiu al nodului LOD este selectat ntr-un interval de distane specificat n
vectorul de distane al nodului LOD.
Nodul Transform definete transformarea de coordonate a tuturor nodurilor
fii ai acestuia fa de nodul printe. Prin aplicarea acestei transformri, un nod fiu este
transformat din sistemul de referin propriu n sistemul de referin al nodului printe.
Succesiunea de transformri care se aplic unui nod frunz l transform din sistemul
de referin local n sistemul de referin universal.
Exemplul 8.4
height 2.0
radius 2.0
}
},
# Acoperiul cupolei
Transform {
translation 0.0 2.0 0.0
children [
Shape {
appearance USE Brown
geometry Cone {
height 2.0
bottomRadius 2.5
}
}
]
}
}
Cupola este reprezentat printr-un nod Group cu doi fii. Primul fiu este un
cilindru, care red pereii cupolei; cel de-al doilea fiu este un con translatat cu 2 uniti
fa de nodul printe (nodul Group) i reprezint acoperiul. Imaginea obinut prin
ncrcarea fiierului cupola.wrl este dat n Fig. 8.3. (a).
Exemplul 8.5
Group
Shape
Group
Transform
Shape
(a)
Transform
Transform
Viewpoint
Shape
(b)
Fig. 8.4 (a) Graful scenei cupola.wrl (b) Graful acenei asterix.wrl.
Nodul Inline este un nod de grupare care permite introducerea unuia sau
mai multor noduri fii dintr-un alt fiier VRML extern specificat prin codul URL. n
acest fel, o scen virtual se poate compune din mai multe module (fiiere) existente.
Bibliografie
[Aur91]
[Azu97]
[Baciu99]
[Burd92]
[Burd93]
[Burd94]
[Burd97]
[Dog88]
[Fang95]
[Fjall93]
[Foley90]
[Giga93]
[Gour71]
[Ion99]
[Man95]
[Mold96]
[New81]
[Prep85]
[Rour93]
[Sher92]
[Suth74]
[Watt95]
[Woo97]
[Ames97]