Sunteți pe pagina 1din 30

Grafica 3D - Lucrarea de Laborator Nr.

1. SISTEME DE VIZUALIZARE
Un sistem de vizualizare este definit printr-o colectie de sisteme de referinta, conventii de reprezentare si relatii (matriceale) de transformare care permit executarea unei succesiuni de transformari av nd ca efect generarea pe display a imaginii obiectelor tridimensionale (scena virtuala). ntr-un sistem de vizualizare, generarea imaginii scenei virtuale este un proces complex care poate fi parcurs prin reprezentari n mai multe sisteme de referinta, fiecare sistem de referinta facilitnd specificarea si executarea anumitor operatii (fig. 3.1). n multe lucrari, generarea imaginii mai este denumita si vizualizarea sau redarea scenelor (viewing, rendering). Pe parcursul lucrarii vor fi utilizati toti acesti termeni.
Sistem de referinta local Sistem de referinta universal
Definire sistem de referinta de observare

Sistem de referinta de observare


Definire proiectie si volum de vizualizare

Sistem de referinta normalizat

Sistem de referinta ecran 3D mpartire cu w Calcul proiectie

Sistem de referinta imagine

Definire obiecte

Decupare

Afisare imagine

Transformare de modelare

Transformare de observare

Transformare de normalizare

Transformare n ecran 3D

Transformare de rastru

Transformarea de proiectie Fig. 1 Succesiunea operatiilor de vizualizare.

Obiectele tridimensionale componente ale scenei sunt modelate si reprezentate n sisteme de referinta locale (sau de modelare), care au originea si orientarea alese cel mai convenabil pentru reprezentarea obiectelor respective. Pentru construirea scenei, obiectele specificate n sistemul de referinta de modelare sunt instantiate prin aplicarea unei succesiuni de transformari geometrice, care constitue transformarea de modelare. Prin transformarea de modelare se obtine descrierea obiectelor ntr-un sistem de referinta unic al scenei virtuale, numit sistemul de referinta universal. n sistemul de referinta universal mai sunt definite si alte elemente necesare redarii realiste a scenelor, cum sunt sursele de lumina. n sistemul de referinta universal se defineste un sistem de referinta de observare ( view reference), care specifica punctul si directia din care este privita (observata) scena. Este evident ca, pentru aceeasi scena, imaginea care se reda pe display depinde de punctul si directia din care este observata scena, deci de felul n care este definit sistemul de referinta de observare (care mai este denumit si sistem de referinta ochi eye coordinate space). Transformarea obiectelor din sistemul de referinta universal n sistemul de referinta de observare este numita transformare de observare (sau de vizualizare view transformation; s-a evitat, nsa, aceasta traducere, datorita suprautilizarii termenului de vizualizare). n sistemul de referinta de observare se poate face o analogie simpla cu modul n care este privita o scena reala prin ochiul uman sau printr-un aparat fotografic (camera). Pozitia si orientarea sistemului de referinta de observare corespund pozitiei si orientarii ochiului sau camerei ntr-o scena reala. Dintr-un punct de observare dat, numai o parte a scenei poate fi vazuta, restul aflndu-se n spatele sau n partile laterale ale directiei de observare. Partea vizibila din scena (reala sau virtuala)

este definita ca volum de vizualizare (viewing volume), care, n general, este o piramida (sau un trunchi de piramida) cu centrul n punctul de observare si cu directia data de directia de observare. Desi exista si unele dispozitive de afisare tridimensionala, majoritatea sistemelor grafice afiseaza imaginile pe o suprafata plana a unui dispozitiv de afisare (display). De aceea, n succesiunea operatiilor de vizualizare a obiectelor sau a scenelor tridimensionale, este necesara introducerea unei proiectii, care converteste spatiul tridimensional ntr-o reprezentare bidimensionala. n general, proiectiile transforma spatiul Rn n spatiul Rm , unde m < n. Modul n care se realizeaza proiectia obiectelor tridimensionale se defineste n sistemul de referinta de observare prin mai multi parametri, dintre care cei mai importanti sunt: tipul proiectiei si planul de vizualizare (view plane). Intersectia dintre planul de vizualizare si piramida de vizualizare defineste o regiune plana numita fereastra de vizualizare (view plane window ), n care sunt reprezentate toate imaginile bidimensionale ale obiectelor (sau partilor de obiecte) vizibile din scena. n grafica tridimensionala exista mai multe posibilitati de definire a sistemelor de vizualizare, de la definiri simple, utile n mici programe grafice, pna la definiri complexe, care permit crearea simultana a mai multor imagini ale scenei, n ferestre de vizualizare diferite. n majoritatea acestor sisteme de vizualizare, din motive de eficienta si precizie a calculelor, transformarea de proiectie se executa n doua etape: transformarea de normalizare si transformarea n sistemul ecran 3D. Transformare de normalizare este o schimbare a sistemului de referinta de la sistemul de referinta de observare la sistemul de referinta normalizat. Volumul de vizualizare definit n sistemul de referinta de observare este transformat, n sistemul de referinta normalizat, ntr-un volum canonic (n general, un paralelipiped dreptunghic). n sistemul de referinta normalizat (normalized coordinates) se executa decuparea obiectelor (clipping), astfel nct obiectele sau partile din obiecte care se afla n afara volumului de vizualizare (volumul canonic) sunt eliminate (ignorate pentru operatiile urmatoare de redare, nu sterse din scena). Transformarea n sistemul de referinta ecran 3D (three-dimensional sceen) transforma fereastra de vizualizare ntr-o regiune corespunzatoare zonei de afisare pe display, numita poarta de afisare (viewport), iar coordonata z se pastreaza nemodificata. n sistemul de referinta ecran 3D s e calculeaza coordonatele tridimensionale ale punctelor, din coordonatele omogene, prin mpartirea cu w, dupa care se executa transformarea de rastru (rasterization ). Transformarea de rastru calculeaza multimea pixelilor care apartin unui segment sau poligon dat prin coordonatele vrfurilor (n poarta de afisare). Prin aceasta transformare (care se mai numeste si conversie de baleiere scan conversion) spatiul bidimensional continuu al portii de afisare este convertit n spatiul bidimensional discret al i maginii. n general, concomitent cu transformarea de rastru sunt executate si alte operatii: eliminarea suprafetelor ascunse (hidden surface removal), umbrirea (shading ), texturarea (texturing ). O mare parte a transformarilor grafice de vizualizare sunt transformari geometrice n spatiul tridimensional, care vor fi prezentate n continuare.

1.1 TRANSFORMARI GEOMETRICE N SPATIU


Obiectele unei scenei pot fi modificate sau manevrate n spatiul tridimensional folosind diferite transformari geometrice. Dintre acestea, cele mai importante sunt: translatia, care modifica localizarea obiectului; rotatia, care modifica orientarea; scalarea, care modifica dimensiunea obiectului. Aceste transformari sunt denumite transformari geometrice primitive.

1.1.1

TRANSFORMARI GEOMETRICE PRIMITIVE

Translatia este transformarea prin care toate punctele se deplaseaza n aceeasi directie si cu aceeasi distanta ntre punct si transformatul sau. Translatia se poate descrie printr-un vector de translatie T, avnd componentele tx, ty, tz pe cele trei axe de coordonate; un punct P(x,y,z) se transforma n punctul P(x,y,z) astfel:

?x' ? x ? tx ? ? y' ? y ? t y ? ?z' ? z ? t z

n notatie matriceala, transformarea prin translatie cu vectorul de translatie T, avnd componentele t x, ty , tz pe cele trei axe de coordo nate a unui punct P(x, y, z) n punctul P(x, y, z) se exprima printr-o nsumare de matrice:
?t x ? ?x '? ? ? ? ? P' = P + T , unde T ? ?t y ? ; deci: ?y'? ? ? ? ?t z ? ? ?z' ? ? ?x ? ? ? ?y ? ? ? ?z ? ? ?t x ? ? ? ?t y ? ? ?tz ? ?

Scalarea modifica coordonatele tuturor punctelor unui obiect folosind factorii de scala sx, sy , respectiv sz pe cele trei axe de coordonate. n aceasta transformare de scalare, numita scalare fata de origine, un punct P(x, y, z) se transforma n punctul P(x, y, z), unde:
? x ' ? x ?s x ? ? y' ? y ?s y ? ? z ' ? z ?s z Pentru scrierea sub forma matriceala a acestor relatii de transformare, se defineste o matrice de scalare S de dimensiune 3 ? 3, iar transformarea de scalare n notatie matriceala este:

?x '? P' ? S P , adica ?y'? ? ? ? ? ?z' ? ?

?s x ?0 ? ? ?0

0 sy 0

0 ? ?x ? 0 ? ?y? ?? ? sz ? ?? ?z ? ?

Rotatia cu un unghi ? n raport cu o axa D este o transformare prin care orice punct P care nu este situat pe dreapta D se transforma ntr-un punct P astfel nct P si P sunt situate ntr-un plan perpendicular ? pe dreapta D, unghiul PIPeste egal cu ? , iar modulele |IP| si |IP| sunt egale (punctul I este intersectia dintre dreapta D si planul ?). Prin aceasta transformare toate punctele dreptei D sunt fixe si numai ele sunt puncte invariante ale transformarii. Transformarea de rotatie n raport cu o axa oarecare se descompune ntr-o succesiune de maximum trei transformari de rotatie n raport cu axele de coordonate ale sistemului de referinta. Rotatia n raport cu axa z cu un unghi ? transforma un punct P(x,y,z) n punctul P(x,y,z), ambele aflate n planul ? peroendicular pe axa z. Pentru deducerea relatiilor de transformare se exprima coordonatele punctelor P si P n acest plan n coordonate polare (fig. 2).
P y ? ? I O ? u x P ?

x ? ? cos u

y ? ? sin u

x' ? ? cos(u ? ? )

y' ? ? sin( u ? ? )

Fig. 2 Transformarea de rota tie n raport cu axa z.

Se dezvolta cosinusul si sinusul sumei de unghiuri si se obtin relatiile:


x' ? ? (cos u cos ? ? sin u sin ? ) ? x cos ? ? y sin ? y' ? ? (sin u cos ? ? sin ? cos u ) ? x sin ? ? y cos ?

Se defineste matricea R Z( ? ) de dimensiune 3 ? 3, iar transformarea de rotatie a unui punct n raport cu axa z cu un unghi ? se poate scrie sub forma matriceala astfel:
P = R ZP ,
'

?x '? ?y'? ? ? ? ? ?z' ? ?

?cos ? ?sin ? ? ? ? 0

? sin ? cos ? 0

0? ?x ? 0? ?y? ?? ? 1? ?? ?z ? ?

Pentru rotatiile elementare ale unui punct n raport cu axele x si y ale sistemului de referinta se urmareste un rationament asemanator si se deduc relatiile de transformare corespunzatoare. S-au obtinut relatiile pentru transformarile spatiale elementare (primitive), translatia, scalarea fata de originea sistemului de coordonate si rotatia n raport cu axele sistemului de coordonate. Tratarea ntr-un mod unitar a acestor transformari se poate face prin cresterea dimensionalitatii sistemului de coordonate cartezian, definindu-se un sistem de coordoonate cu 4 dimensiuni, numit sistem de coordonate omogene.

1.1.2 SISTEME DE COORDONATE OMOGENE


Se observa ca transformarile de scalare si de rotatie se reprezinta prin nmultiri de matrice, iar translatia se reprezinta prin nsumare de matrice. Reprezentarea unitara si combinarea transformarilor geometrice spatiale se poate face ntr-un sistem de coordonate cu patru dimensiuni, numit sistem de coordonate omogene. Un punct P(x,y,z) se reprezinta n sistemul de coordonate omogene ca P(X,Y,Z,w), unde X = x? w, Y = y? w, Z = z? w, pentru orice factor de scara w ? 0. n general, un punct P(x, y, z) n sistemul de coordonate cartezian se transforma n sistemul de coordonate omogene prin aleger ea w ? 1 , deci are coordonatele omogene P(x,y,z,1). Pentru transformarea inversa, se calculeaza coordonatele carteziene ale unui punct P(X,Y,Z,w), reprezentat n sistemul de coordonate omegene printr-o mpartire cu factorul de scara w astfel:
?x ? X/ w ? ?y ? Y/ w ?z ? Z / w ?

(3.1)

n sistemele de coordonate omogene, toate matricele de transformari sunt de dimensiune 4 ? 4 si toate operatiile de transformari geometrice se pot exprima prin produse de matrice. Translatia n coordonate omogene se defineste printr-o matrice:
?1 0 0 t x ? ? ? 0 1 0 ty? T( t x , t y , t z ) ? ? (3.2) ?0 0 1 t z ? ? ? ?0 0 0 1 ? Scalarea fata de origine se reprezinta n sistemul de coordonate omogene prin matricea: ?s x 0 0 0? ? ? 0 s y 0 0? ? S(s x , s y , s z ) ? (3.3) ? 0 0 s z 0? ? ? ? 0 0 0 1?

Daca factorii de scalare sunt egali ( s x ? s y ? s z ), scalarea se numeste uniforma, si pastreaza forma obiectului. Daca factorii de scalare difera, obiectul este deformat, iar scalarea se numeste neuniforma. Transformarile de rotatie n raport cu axele sistemului de referinta exprimate n coordonate omogene sunt urmatoarele: Rotatia n raport cu axa x (tangaj) cu un unghi ? :

0 ?1 ? 0 cos ? R X (? ) ? ? ?0 sin ? ? 0 ?0 ? cos ? ? 0 R Y (? ) ? ? ?? sin ? ? ? 0 0

0 ? sin ? cos ? 0 sin ?

0? ? 0? 0? ? 1? 0? ? 0? 0? ? 1?

(3.4)

Rotatia n raport cu axa y (giratie) cu un unghi ? :


1 0 0 cos ? 0 0

(3.5)

Rotatia n raport cu axa z (ruliu), cu un unghi ? :


?cos ? ? sin ? 0 0? ? ? sin ? cos ? 0 0? R Z (? ) ? ? (3.6) ? 0 0 1 0? ? ? 0 0 1? ? 0 Toate matricele de transformare de rotatie sunt matrice ortogonale si ortonormate. Transformarile geometrice elementare sunt transformari liniare, prin care liniile drepte si suprafetele plane sunt transformate n linii dreapte, respectiv suprafete plane. Din aceasta cauza, pentru transformarea unui obiect tridimensional este suficient sa se transforme toate vrfurile acestuia si sa se pastreze relatiile topologice ntre vrfurile transformate, aceleasi cu cele ntre vrfurile initiale. Transformarile mai complexe ale obiectelor n spatiu se pot defini prin compunerea mai multor transformari primitive.

1.1.3 COMPUNEREA TRANSFORMARILOR GEOMETRICE


Compunerea mai multor tranformari elementare pentru obtinerea unei transformari complexe se obtine prin executarea succesiva a produsului fiecariei matrice de transformare cu matricea de reprezentare a punctului initial sau rezultat dintr-o transformare precedenta. Conventia de reprezentare a punctelor n spatiu prin matrice coloana impune ordinea de nmultire numita postmultiplicare (sau multiplicare la dreapta) a matricelor de transformare: se nmulteste matricea de transformare curenta cu matricea transformarii urmatoare. Conventia de terminologie (postmultiplicare sau multiplicare la dreapta) semnifica faptul ca o noua transformare se concateneaza ca factor dreapta al produsului de matrice. Este important de retinut faptul ca ordinea de aplicare a transformarilor este de la dreapta la stnga din succesiunea de matrice ale unei compuneri. Mai precis, daca un punct se transforma prin aplicarea succesiva a transformarilor definite prin matricele M1, M2,., Mn, matricea compusa de transformare este:
M ? Mn ? M2M1

Se poate verifica ca, daca se adopta conventia de reprezentare a unui punct n spatiul tridimensional printr-o matrice linie, atunci transformarea unui punct se obtine prin nmultirea vectorului de pozitie al punctului cu matricea de transformare (premultiplicare sau multiplicare la stnga). n aceasta situatie, ordinea n care se aplica matricele compunente ale unei transformari compuse este de la stnga la dreapta:
P' ? PS , unde S ? S 1S 2 ? S n

Punctul P este transformat n ordinea S1, S 2,.S n. Acesta este un mod mai natural de a urmari secventele de transformari geometrice si de aceea, n unele lucrari este adoptata aceasta conventie. Nu exista alte diferente ntre cele doua conventii (nici de simplificare a calculelor, nici de eficienta). Se poate demonstra cu usurinta ca orice matrice de transformare n conventia de reprezentare prin matrice linie a unui punct n spatiul tridimensional este transpusa matricei corespunzatoare de

transformare definite n conventia de reprezentare prin matrice coloana a punctului. De exemplu, translatia unui punct P(x, z, y) cu valorile t x, ty , tz se exprima astfel:
? 1 0 0 0? ? ? 0 1 0 0? ? ?X' Y' Z ' w '?? ?X Y Z w ?? 0 0 1 0 ? ? ? ? ?t x t y t z 1 ? ? n aceasta lucrare se foloseste conventia de reprezentare prin matrice coloana a punctelor din spatiu, care este si conventia din biblioteca grafica OpenGL. Un exemplu de transformare compusa este transformarea de rotatie completa specificata prin trei rotatii fata de axele sistemului de coordonate. Cea mai obisnuita conventie pentru ordinea de specificare a rotatiilor este: ruliu cu unghiul ? (dupa axa z), tangaj cu unghiul ? (dupa axa x) si giratie cu unghiul ? (fata de axa y). n aceasta situatie matricea de rotatie totala R are expresia:
?r11 r12 r13 0? ? ? r 21 r22 r 23 0? R = R Y ( ? ) R X (? ) R Z ( ? ) ? ? (3.7) ?r 31 r32 r33 0? ? ? 0 0 1? ?0 O transformare complexa a unui obiect prin combinarea mai multor transformari elementare (scalari, rotatii, translatii) se poate exprima printr-o matrice de transformare M care are forma generala: ?r '11 ? r ' 21 M?? ?r ' 31 ? ?0 r '12 r ' 22 r ' 32 0 r '13 r ' 23 r ' 33 0 tx ? ? ty? tz? ? 1?

(3.8)

Submatricea stnga-sus R de dimensiune 3 ? 3 exprima transformarea de rotatie si scalare totala, iar submatricea coloana dreapta T exprima transformarea de translatie totala. Matricea R este o matrice ortogonala, dar poate sa nu fie si ortonormata.

1.1.4 TRANSFORMARI INVERSE


Fiind data o transformare a unui punct P ntr-un punct P definita printr-o matrice de transformare M, transformarea inversa, de la punctul P la punctul P se obtine prin nmultirea c u matricea inversa, M 1 : M M- 1 = I, unde I este matricea identitate. Dat fiind ca, n general, matricea de transformare M se obtine printr-un produs de matrice de transformari elementare, matricea inversa M1 se calculeaza prin produsul n ordine inversa a inverselor matricelor elementare componente:
M = M n ? M2M1
-1 1 -1 M -1 = M 1 M2 ? Mn

(3.9)
1 Mn

MM

?1

= Mn ?

-1 1 M2M1M1 M2 ?

?I

Relatia (3.9) se demonstreaza imediat, prin gruparea factorilor ncepnd cu M 1 M -1 1 =I. Toate matricele de transformari elementare sunt matrice inversabile si au urmatoarele expresii: ?1 0 0 ? t x ? ? ? 0 1 0 ? ty ? [T(t x , t y , t z )]?1 ? T(? t x ,? t y , ? t z ) ? ? (3.10) ?0 0 1 ? t z ? ? ? 1 ? ?0 0 0

?1 / s x ? 0 [ S (s x , s y , s z )]? 1 ? S (1 / s x ,1 / s y ,1 / s z ) ? ? ? 0 ? ? 0

0 1/ s y 0 0

0 0 1 / sz 0

0? ? 0? 0? ? 1?

(3.11)

0 ?1 ? 0 cos ? [R X (? )]? 1 ? R X (? ? ) ? ? ?0 ? sin ? ? 0 ?0 ?cos ? ? 0 ?1 [R Y (? )] ? R Y (? ? ) ? ? ?sin ? ? ? 0


[ R Z (? )] ?1 ? cos ? ? ? sin ? ? R Z (? ? ) ? ? ? 0 ? ? 0

0 sin ? cos ? 0 0 cos ? 0

0? ? 0? 0? ? 1? 0? ? 0? 0? ? 1?

(3.12)

0 ? sin ? 1 0 0

(3.13)

sin ? cos ? 0 0

0 0? ? 0 0? 1 0? ? 0 1?

(3.14)

R ? 1 = [ R Y (? ) R X ( ? ) R Z ( ? )] ? 1 ? R Z ( ? ? ) R X ( ? ? ) R Y ( ? ? )

(3.15)

1.1.5 TRANSFORMAREA SISTEM ELOR DE REFERINTA


Interpretarea relatiilor de transformari geometrice prezentate pna acum a fost aceea de manevrare si modificare a obiectelor ntr-un sistem de referinta dat: obiectele sunt reprezentate ntr-un anumit sistem de referinta prin coordonatele unei multimi de puncte ale acestora (vrfuri) si ele pot fi deplasate, reorientate sau redimensionate prin aplicarea transformarilor geometrice corespunzatoare. O alta interpretare care se poate da operatiilor de transformari geometrice este aceea de schimbare a sistemului de referinta. Se considera sistemul de referinta Oxyz si un nou sistem de referinta Oxyz, a carui origine O este determinata n sistemul Oxyz prin coordonatele x 0,y0,z0 ale centrului O. Sistemul de referinta Oxyz este definit de versorii (vectori unitate) i, j, k, iar sistemul de referinta Oxyz de versorii i, j, k. Axa Ox are cosinusii directori c11, c12, c13 fata de sistemul de referinta Oxyz; axa Oy are cosinusii directori c21, c22, c23 fata de sistemul de referinta Oxyz; axa Oz are cosinusii directori c31, c32, c33 fata de sistemul de re ferinta Oxyz. Matricea de transformare care descrie pozitionarea sistemului Oxyz relativ la sistemul de referinta Oxyz este:
?c11 c 21 c 31 x 0 ? ? ? c12 r 22 c 32 y 0 ? M?? (3.16) ?c13 c 23 c 33 z 0 ? ? ? 0 0 1? ?0 Fie un punct P definit prin coordonatele sale x,y,z n sistemul de referinta Oxyz. Se demonstreza [Drag57], ca n sistemul de referinta Oxyz acest punct (notat P) are coordonatele

x,y,z, care se obtin prin nmultirea matricei M ? 1 (inversa matricei M) cu matricea punctului P:
P' = M ? 1 P

(3.17)

Transformarea inversa, a unui punct P(x,y,z) din sistemul de referinta Oxyz n punctul P(x,y,z) din sistemul de referinta Oxyz se obtine prin nmultire cu matricea de transformare M: (3.18) P = MP'

n concluzie, aplicarea unei transformari definite printr-o matrice M asupra unei multimi de puncte definite ntr-un sistem de referinta Oxyz poate fi interpretata n doua moduri: (a) Fiecare punct este modificat si capata o noua pozitionare n sistemul de referinta Oxyz, conform cu matricea de transformare M. (b) Fiecare punct este transformat din sistemul de referinta initial Oxyz ntr-un nou sistem de referinta, Oxyz, a carui pozitie si orientar e relativ la sistemul de referinta Oxyz este descrisa de matricea M1. Pozitia si orientarea sistemului Oxyz relativ la sistemul de referinta Oxyz este descrisa de matricea M. n dezvoltarea sistemelor de vizualizare se folosesc cteva sisteme de ref erinta bine definite, care permit specificarea cea mai simpla si eficienta a operatiilor de redare a obiectelor (scenelor). Unul dintre acestea, sistemul de referinta universal, a fost deja introdus. Alte sisteme de referinta folosite n grafica tridimensionala vor fi definite pe parcursul lucrarii. Sistemele de referinta intermediare, care apar n descrierea unor transformari complexe, sunt interpretari ale operatiilor de transformari geometrice care permit urmarirea unui rationament de calcul.

1.2 TRANSFORMAREA DE MODELARE


O scena virtuala este compusa dintr-un numar oarecare de obiecte tridimensionale amplasate n diferite pozitii n scena. Tehnica de modelare a scenelor de dimensiuni mari (ca numar de obiecte sau ca volum ocupat de scena) se bazeaza pe amplasarea modelelor obiectelor tridimensionale n sistemul de referinta universal al scenei virtuale. Fiecare obiect este modelat ntr-un sistem de referinta local, prin alegerea celei mai convenabile origini si orientari a axelor de coordonate ale acestuia. De exemplu, un cub se modeleaza cel mai convenabil ntr-un sistem de referinta ales cu centrul n centrul cubului si cu axele orientate paralel cu laturile cubului. Daca se presupune ca latura cubului este egala cu 2 unitati, atunci coordonatele vrfurilor cubului sunt (1,1,1), (1,1,1), (1,1, 1), (1,1, 1), (1,1,1), (1, 1,1), (1,1,1), (1,1,1). Modelul unui obiect, definit n sistemul de referinta local, poate fi instantiat (introdus) ntr-o scena virtuala printr-o transformare de modelare (sau transformare de instantiere). Transformarea de modelare transforma toate punctele obiectului (model tridimensional) din sistemul de referinta local ntr-un alt sistem de referinta, care poate fi sistemul de referinta universal sau un alt sistem intermediar. Pentru nceput se considera cea mai simpla transformare de modelare, dintr-un sistem de referinta local n sistemul de referinta universal. n mod obisnuit, prima transformare care se aplica modelului este transformarea de scalare cu o matrice de scala re S(s x,s y ,s z), executata n sistemul de referinta local (fata de originea acestuia), prin care obiectul este adus la dimensiunile dorite ale instantei respective. Pozitia unei instante a obiectului n scena se defineste printr-o matrice de transformare MI continnd submatricea de rotatie R, care defineste orientarea sistemului de referinta local Oxyz fata de sistemul de referinta universal Oxyz (al scenei virtuale) si submatricea de translatie T, care defineste pozitia originii O(x0,y0,z0) a sistemului de referinta local n sistemul universal. Rezulta matricea de transformare de modelare: M I ? T(x 0 , y 0 , z 0 )R S(s x , s y, s z ) (3.19) Un punct P al obiectului n sistemul de referinta model este transformat n punctul P I n sistemul de referinta universal prin instantierea: PI = M I P .

1.3 TRANSFORMAREA DE OBSERVARE


Transformarea de observare este analoga cu pozitionarea unei camere fotografice sau de nregistrare, prin care se observa o anumita zona din scena virtuala. n sistemul de referinta universal sunt reprezentate toate obiectele (modelele) scenei virtuale, iar n fiecare cadru al imaginii ( frame), este generata imaginea acelor obiecte din scena care sunt vizibile din punctul de observare curent (viewpoint).

Transformarea de observare este, asadar, o schimbare a sistemului de coordonate de la sistemul de referinta universal la sistemul de referinta de observare (view coordinate). n majoritatea aplicatiilor de realitate virtuala (simulatoare, aplicatii n arhitectura, etc) scena virtuala reprezentata n sistemul de referinta universal este mentinuta ntr-o pozitie constanta (cel mult existnd anumite obiecte mobile n scena), iar observatorul este cel care si modifica pozitia si orientarea, si n functie de acestea se reda imaginea corespunzatoare pe ecran. Directia de observare a scenei este, n majoritatea sistemelor de vizualizare, directia axei z a sistemului de referinta de observare. Localizarea si orientarea sistemului de referinta de observare OVx VyV zV n raport cu sistemul de referinta universal Oxyz poate fi descrisa printr-o matrice de transformare M de forma generala:
?1 0 0 x v ? ?c 11 c 21 c 31 0? ?c11 c 21 c 31 x V ? ? ?? ? ? ? 0 1 0 y V ? ?c12 c 22 c 32 0? ?c12 c 22 c 32 y V ? ? M ? TV R V ? ? (3.20) ?0 0 1 z V ? ?c13 c 23 c 33 0? ?c13 c 23 c 33 z V ? ? ?? ? ? ? 0 0 1? ? 0 0 0 1 ? ?0 0 0 1 ? ? 0 Matricea componenta T V este matricea de translatie a sistemului de referinta de observare n raport cu sistemul de referinta universal: x V , y V , z V sunt coordonatele punctului de observare OV n sistemul Oxzy. Matricea de rotatie RV reprezinta orientarea sistemului de referinta de observare fata de sistemul de referinta universal: coeficientii c11, c12, c13 sunt cosinusii directori ai axei O VxV fata de axele Ox, Oy, respectiv Oz; coeficientii c21, c22, c23 sunt cosinusii directori ai axei OVyV fata de axele Ox, Oy, respectiv Oz; coeficientii c31, c32, c33 sunt cosinusii directori ai axei OVzV fata de axele Ox, Oy, respectiv Oz. Fiind data matricea de pozitionare si orientare a sistemului de referinta de observare relativ la sistemul de referinta universal M, un punct oarecare P(x,z,y) din sistemul Oxyz se transforma n punctul PV(x V,yV,z V) n sistemul de referinta observator prin nmultire cu matricea inversa, deci:
1 ?1 PV ? M ? 1 P ? R ? V TV P ? M V P

(3.21)

unde matricea de transformare de observare MV este inversa matricei de localizare a sistemului de referinta de observare relativ la sistemul de referinta universal, adic a M V ? M ? 1 . Matricea de rotatie mai poate fi precizata si printr-o succesiune de rotatii n raport cu axele sistemului de referinta universal. Cea mai obisnuita conventie pentru ordinea de specificare a rotatiilor este: ruliu cu unghiul ? (dupa axa z), tangaj cu unghiul ? (dupa axa x) si giratie cu unghiul ? (fata de axa y). n aceasta situatie:
R V ? R Y (? )R X (? )R Z (? )

(3.22)

n aceste relatii de transformare de observare s-a presupus ca sistemul de referinta de observare este tot un sistem drept, la fel ca si sistemul de referinta universal. Exista nsa si sisteme de vizualizare n care se defineste sistemul de referinta de observare ca un sistem orientat dupa regula minii stngi. Pentru schimbarea sistemului de referinta de observare drept n sistem de referinta stng, se adauga o transformare de oglindire (simetrie), de exemplu cu matricea S XY, iar matricea de transformare de observare devine M V, unde:
M' V = S XY M V

Transformarile de matricele: ?1 0 0 ? 0 1 0 S XY ? ? ?0 0 ? 1 ? ?0 0 0

simetrie relative la planele sistemului de referinta sunt definte prin


0? ?? 1 ? ? 0? 0 , S YZ ? ? ?0 0? ? ? 1? ?0 0 0 0? ?1 0 ? ? 1 0 0? 0 ?1 , S ZX ? ? ?0 0 0 1 0? ? ? 0 0 1? ?0 0 0 0? ? 0 0? 1 0? ? 0 1?

(3.23)

1.4 TRANSFORMAREA DE PROIECTIE


Proiectia unui obiect tridimensional pe un plan (numit plan de proiectie sau plan de vizualizare view plane) este formata din multimea punctelor de intersectie ntre acest plan si dreptele numite proiectori, care pornesc dintr-un punct fix numit centru de proiectie si trec prin fiecare punct al obiectului. n functie de distanta centrului de proiectie fata de planul de proiectie, proiectiile plane se clasifica n proiectii perspectiva si proiectii paralele. n proiectiile perspectiva centrul de proiectie se afla la distanta finita fata de planul de vizualizare, iar n proiectiile paralele centrul de proiectie este la infinit. n cazul proiectiilor paralele, proiectorii sunt drepte paralele si au o directie comuna, numita directie de proiectie. n grafica tridimensionala se foloseste cel mai frecvent proiectia perspectiva, deoarece aceasta proiectie reda cel mai bine efectul de descrestere a dimensiunilor obiectelor odata cu cresterea distantei acestora fata de observator. Exista mai multe modalitati de definire a unei proiectii perspectiva, de la o definire minimala, prin care se poate realiza proiectia punctelor din spatiu pe un plan, pna la definirea adoptata n sistemele de vizualizare complexe, n care se specifica volumul de vizualizare, centrul de proiectie si alti parametri. Mai nti va fi prezentat un sistem de vizualizare cu proiectie perspectiva simplu, care este si cel mai usor de definit. Proiectia perspectiva se poate defini mai intuitiv pornind de la sistemul de observare considerat ca un sistem de referinta stng. Centrul de proiectie se fixeaza n centrul sistemului de referinta de observare O V, directia de observare (de privire) este n sensul pozitiv al axei OVzV, iar planul de vizualizare ? este un plan perpendicular pe axa OVz V, la distanta d fata de centru (fig. 3(a) ).
Directia de observar e yV P yV OV d xV zV ? (a) Sistem de referinta de observare stng B yP A zV zV xV OV d zV ? P yV P B yP A zV Directia de observare P

yV

(b) Sistem de referinta de observare drept

Fig. 3 Proiectia perspectiva definita prin centrul de proiectie OV si planul de proiectie ? perpendicular pe axa O Vz V.

Punctul P(xV,yV,zV) n sistemul de referinta de observare se proiecteaza n punctul P(xP,yP,zP), aflat la intersectia dreptei OVP cu planul de vizualizare. Din triunghiurile asemenea OVPA si OVPB, rezulta: d yV yP ? zV n mod asemanator se poate deduce valoarea lui x P: d xV (3.24) xP ? zV Aceste relatii se pot exprima matriceal prin definirea matricei de proiectie perspectiva MP:

10

?1 ? 0 MP ? ? ?0 ? ?0

0? ? 1 0 0? 0 1 0? ? 0 1 / d 0? 0 0

(3.25)

Transformarea de proiectie se poate scrie atunci:


?X P ? ? ? YP P' = M P P , ? ? ? ? ZP ? ? ? ?w P ? ?1 ?0 ? ?0 ? ?0 0??X V ? ? ? 0?? YV ? ? 0 1 0?? Z V ? ?? ? 0 1 / d 0??w V ? 0 1 0 0

Rezulta:
?X P ? XV ? ? YP ? YV si ? ?Z P ? Z V ?w ? Z / d ? P V
?x P ? X P / w P ? d X V / Z V ? d xV z V ? ? y P ? YP / w P ? d YV / Z V ? d y V z V ?z ? Z / w ? d ? P P P

(3.26)

Se observa ca expresiile lui xP, yP si zP obtinute prin calcul matriceal sunt identice cu cele din relatiile (3.24), rezultate din constructia geometrica prezentata n fig 3(a). Proiectia perspectiva necesit a deci o mpartire a coordonatelor x si y cu distanta z, si, ntr-adevar, n proiectia perspectiva imaginea unui obiect este cu att mai mica cu ct se afla la distanta mai mare de punctul de observare. n acest sistem de vizualizare simplu s-a definit sistemul de referinta de observare ca un sistem stng. Se poate defini acest sistem ca un sistem de referinta drept, cu directia de observare ndreptata spre z V. Planul de vizualizare este pozitionat perpendicular pe axa z, la distanta egala cu d fata de origine (fig. 3(b)), d avnd valoare negativa. Urmnd un rationament asemanator cu cel de mai nainte, rezulta matricea de proiectie perspectiva cu aceeasi expresie (3.26) n care d are o valoare negativa. Se remarca echivalenta rezultatelor obtinute, iar conventia de sistem de referinta de observare stng este utila doar pentru a se urmari mai usor rationamentul de calcul.

1.4.1 TRANSFORMAREA DE NORMALIZARE


Sistemul de proiectie simplu definit anterior, n care toate obiectele din scena sunt proiectate pe planul de vizualizare, are mai multe inconveniente si nu poate fi folosit dect n aplicatii foarte simple. Pentru redarea eficienta a scenelor virtuale complexe se defineste (n sistemul de referinta de observare) un volum de vizualizare (view volume), cunoscut sub numele de piramida de vizualizare sau trunchiul de piramida de vizualiz are (frustum ) (fig. 4). n forma cea mai simpla, trunchiul de piramida de vizualizare este marginit de patru plane laterale care trec prin punctul de observare OV si de doua plane perpendiculare pe axa OVzV, planul apropiat ( near) pe care se executa proiectia, si planul departat (far). n fig. 4 este prezentat volumul de vizualizare ntr-un sistem de referinta de observare stng si directia de observare catre z V pozitiv. Intersectia dintre cele patru plane laterale si planul de vizualizare (care, n aceasta definitie, este si planul apropiat de vizibilitate) determina o suprafata dreptunghiulara ABCD n planul de vizualizare n care vor fi proiectate toate obiectele vizibile ale scenei. Aceasta suprafata este fereastra de vizualizare (view plane window). Ecuatiile celor sase plane ale trunchiului de piramida regulata sunt: ?x V ? ? g z V d ? ? yV ? ? h z V d (3.28) ? ?z V ? d ? ?z V ? f

11

unde:

2g dimensiunea laturii orizontale a ferestrei de vizualizare (latura AB) 2h dimensiunea laturii verticale a ferestrei de vizualizare (latura BC) d distanta planului de vizualizare si a planului apropiat f distanta planului departat.
Directia de observare yV yV = h zV /d
B A

OV
C

zV

xV

zV = d

xV = g zV /d zV = f Fig. 4 Definirea trunchiului de piramida de vizualizare (frustum) n sistemul de referinta de observare stng.

Semnificatia volumului de vizualizare este evidenta: dintre toate obiectele din scena virtuala sunt vizibile si redate n fereastra de vizualizare numai acele obiecte sau parti din obiecte care sunt cuprinse n acest volum. Trunchiul de piramida de vizualizare defineste n acest fel si volumul de decupare, operatie care se executa ntr-unul din sistemele de referinta care se definesc n cadrul transformarii de proiectie, si anume sistemul de referinta normalizat. Acest sistem de referinta se mai numeste si sistem de referinta canonic. Sistemul de referinta normalizat este un sistem de coordon ate tridimensional n care trunchiul de piramida de vizualizare se transforma ntr-un volum canonic, care, n general, este un paralelipiped dreptunghic. Pentru sistemul de proiectie definit n acest paragraf, volumul canonic este un paralelipiped dreptunghic cu latura bazei egala cu 2 si naltimea 1 (dupa axa zN). Introducerea acestui nou sistem de referinta permite abordarea transformarii de proiectie perspectiva n doua etape: o transformare din sistemul de referinta de observare n sistemul de referint a normalizat (numita transformare de normalizare), urmata de calculul proiectiei prin mpartirea cu w a coordonatelor omogene. ntre cele doua etape ale transformarii de proiectie perspectiva se executa o operatie importanta n grafica tridimensionala, dec uparea obiectelor relativ la volumul de vizualizare normalizat (volumul canonic). Pentru transformarea de normalizare (transformarea de la sistemul de referinta de observare la sistemul de referinta normalizat), se impun urmatoarele cerinte: (1) Se normalize aza coordonata zN, care reprezinta adncimea, astfel nct sa se obtina precizie maxima n operatiile de comparatie a adncimii punctelor. (2) Liniile din sistemul de referinta observator trebuie sa se transforme n linii n sistemul de referinta normalizat. (3) Suprafetele plane din sistemul de referinta observator trebuie sa se transforme n suprafete plane n sistemul de referinta normalizat. S-a demonstrat ca aceste cerinte sunt satisfacute de transformarea:
? X N ? dx V g ? ? YN ? d y V h ? ? Z N ? z V f /(f ? d) ? df/(f ? d) ? ?w N ? z V

(3.29)

12

Din aceste expresii se deduce matricea de transformare de normalizare MN care efectueaza transformarea de la sistemul de referinta observator la sistemul de referinta normalizat:
0 0 0 ?d / g ? ? ? 0 d / h 0 0 ?, ?? ? 0 0 f /(f ? d) ? df/(f ? d)? ? ? 0 1 0 ? 0 ?

MN

?X N ? ?x V ? ? ? ? ? ?YN ? ? M ?y V ? N ?Z N ? ?z V ? ? ? ? ? ?w N ? ?1 ?

(3.30)

n sistemul de referinta normalizat se executa operatia de decupare a obiectelor n coordonate normalizate omogene. n urma acestei operatii, din totalitatea obiectelor scenei virtuale sunt retinute numai acele obiecte sau parti (rezultate prin decupare) aflate n interiorul volumului de vizualizare canonic, ceea ce nseamna ca, nainte de transformarea de normalizare, acestea se aflau n interiorul trunchiului de piramida de vizualizare. Din coordonatele omogene XN, YN, ZN , w N se pot deduce coordonatele xN, yN si z N ale punctului n sistemul de referinta normalizat tridimensional:
d xV d yV f ? d ? ?1 ? ? ; y N ? YN w N ? ; z N ? ZN w N ? ? g zV h zV f ? d ? zV ? ? S-au obtinut, evident, expresii identice cu cele din relatiile (4.10), de la care s-a pornit pentru definirea transformarii de proiectie perspectiva. Coordonatele xN si yN n sistemul de referinta normalizat reprezinta coordonatele proiectiei ortografice n planul zN = 0 (care este planul de vizualizare) a punctului corespunzator. Unghiul dintre planele laterale ale piramidei de vizualizare (care trec prin axa OVyV si au ecuatiile x V = ? g zV/d ) se numeste unghi de vizualizare pe orizontala (horizontal field of view fovx). Unghiul dintre planele piramidei de vizualizare care trec prin axa O VxV se numeste unghi de vizualizare pe verticala (vertical field of view fovy). Valorile acestora se deduc din parametrii de proiectie perspectiva: g h (3.31) fovx ? 2 arctan , fovy ? 2 arctan d d Valorile unghiurilor de vizualizare variaza pentru diferite sisteme grafice n functie de dispozitivele de afisare folosite. O alta conventie de definire a unui sistem de vizualizare este aceea de a considera sistemul de referinta de observare ca un sistem drept, iar directia de observare si volumul de vizualizare ndreptate catre zV negativ. Urmarind un rationament asemanator celui anterior, se obtine aceeasi expresie a matricei de normalizare (relatia 3.31), n care valorile d, si f au valori negative, iar sistemul de referinta normalizat rezultat este un sistem de referinta stng. n acest sistem de proiectie perspectiva s-a presupus ca planul de vizualizare si planul de vizibilitate apropiata coincid. Deducerea matricei de normalizare pentru cazul general, n care cele doua plane sunt diferite, este lasata ca un exercitiu pentru cititori. De asemenea, tot ca un exercitiu, se poate deduce matricea de normalizare n situatia n care centrul ferestrei de vizualizare nu se afla pe axa zV. xN ? X N w N ?

1.4.2 TRANSFORMAREA N SISTEMUL DE REFERINTA E CRAN 3D


Transformarea n sistemul de referinta ecran 3D efectueaza o corespondenta ntre fereastra de vizualizare si zona de afisare alocata pe display numita poarta de afisare (viewport). Fereastra de vizualizare este definita ntr-un sistem de referinta bidimensional n planul z N = 0 al sistemului de referinta normalizat. Poarta de afisare este definita ntr-un sistem de referinta bidimensional n planul zS = 0 al sistemului de referinta ecran 3D si este, n general, o zona rectangulara de dimensiuni egale cu numarul de pixeli corespunzatori pe orizontala si pe verticala a zonei afisate (fig. 5). Se poate calcula matricea de transformare din sistemul de referinta normalizat n sistemul de referinta ecran 3D prin compunerea a trei transformari succesive. Mai nti se executa o translatie, astfel nct centrul CF al ferestrei sa ajunga n origine, deci cu matricea de translatie T(xCF , y CF ,0). Fereastra centrata n origine se scaleaza cu factorii de scara sx, s y , astfel nct fereastra sa ajunga la

13

dimensiunea portii, iar coordonata z se lasa nemodificata. Matricea de scalare este deci S (s x, sy, sz). Ultima transformare necesara este o translatie, prin care centrul portii este adus n punctul CP, deci cu matricea de translatie T(xCP, yCP, 0).
yN y max y CF y min yN P CF yS y Pmax yS y CP yPmin P CP

xmin xN xCF

xmax

xN

xPmin

xS

xCP

xPmax

xS

Fig. 5 Transformarea de la fereastra de vizualizare la poarta de afisare.

Rezulta matricea de transformare din sistemul de ref erinta normalizat n sistemul de referinta ecran 3D:
?1 ? 0 ?? ?0 ? ?0 ?s x ? 0 ?? ?0 ? ?0 0 0 x CP ??s x ?? 1 0 y CP ?? 0 0 1 0 ?? 0 ?? 0 0 1 ?? 0 0 sy 0 0 0 x CP 0 1 0 y CP 0 0 ? x CF ? ? sy 1 0 ? y CF ? 0 0 1 0 ? ? 0 0 0 1 ? ? s x x CF ? ?X S ? ?X N ? ? ?Y ? ?Y ? ? s y y CF ? ? S ? N? ; ? M NS ? ? ? ZS ? ?Z N ? 0 ? ? ? ? ? 1 ? ?w S ? ?w N ? 0 0 0??1 ?? 0 0??0 1 0??0 ?? 0 1??0

M NS

(3.32)

M NS

Din aceste relatii rezulta ZS = ZN si wS = w N. n sistemul de referinta ecran 3D se trece de la coordonatele omogene XS, YS, ZS, w S, la coordonatele tridimensionale xS, y S, zS prin mpartirea cu w S. Transformarea din sistemul de referinta normalizat n sistemul ecran 3D lasa coordonata z nemodificata.

1.5 TRANSFORMAREA DE RASTRU


Transformarea de rastru ( rasterization) este o conversie de la reprezentarea prin coordonatele vrfurilor a unui segment sau a unui poligon (primitiva geometrica), la reprezentarea prin multimea corespunzatoare de pixeli care se afiseaza pe display. Transformarea de rastru se mai numeste conversie de baleiere (scan conversion ), sau desenarea segmentelor, respectiv a poligoanelor ( line drawing, polygon drawing ) sau generare linie, respectiv poligon (line generation , polygon generation). Transformarea de rastru implica trecerea de la spatiul bidimensional continuu (poarta de afisare definita n planul x S = 0 al sistemului de referinta ecran 3D) la spatiul discret al imaginii. Spatiul imagine este un tablou bidimensional de locatii discrete numite pixeli, fiecare pixel avnd o adresa care corespunde pozitiei n imagine a acesteia. Dimensiunea imaginii este specificata prin numarul de pixeli pe orizontala (M), respectiv pe verticala (N), care pot fi afisati n zona de ecran atribuita portii de afisare. Dimensiunea maxima a imaginii depinde de rezolutia display-ului folosit. Un pixel din spatiul imagine se reprezinta prin culoarea lui, care se memoreaza ntr-un buffer de imagine. Adresa pixelului n spatiul imagine determina adresa n bufferul de imagine n care se memoreaza culoarea acestuia. Transformarea de rastru a segmentelor sau poligoanelor calculeaza adresa fiecarui pixel din multimea de pixeli prin care se aproximeaza primitiva geometrica data prin coordonatele vrfurilor si nscrie la adresa corespunzatoare din bufferul de imagine intensitatea de culoare a pixelului respectiv.
14

Culoarea pixelului poate fi o culoare constanta, rezultata din atributul de culoare al primitivei geometrice sau din conditii de umbrire constanta (poligonala), si atunci aceasta culoare se nscrie la toate adresele pixelilor care apartin pr imitivei geometrice n bufferul de imagine. n cazul umbririi Gouraud, culoarea fiecarui pixel se calculeaza prin interpolare, concomitent cu calculul adresei pixelilor n transformarea de rastru. Se pot dezvolta diferite variante de algoritmi de generare a liniilor sau poligoanelor, dar cel mai frecvent se folosesc algoritmii prevazuti n bibliotecile grafice, care sunt optimizati pentru tipul de sistem grafic (accelerator) cu care se lucreaza. n biblioteca OpenGL, transformarea de rastru este executata pentru fiecare primitiva geometrica data prin lista de vrfuri n functie de tipul ei (dat prin argumentul functiei glBegin() .

1.6 SISTEMUL DE VIZUALIZARE OPENGL


Sistemul de vizualizare OpenGL defineste sistemele de referinta, transformarile geometrice si relatiile (matriceale) de transformare pentru redarea primitivelor geometrice.

1.6.1

SISTEMELE DE REFERINTA OPENGL

Sistemul de referinta universal definit n OpenGL este un sistem drept, iar matricea care reprezinta un punct (n plan, n spatiul tridimensional s au n coordonate omogene) este matrice coloana. Pentru reprezentarea unei matrice 4x4 folosite pentru transformari geometrice n coordonate omogene, n OpenGL este utilizata conventia coloana majora. Aceste conventii sunt aceleasi cu conventiile adoptate n lucrarea de fata. Sistemul de referinta de observare este un sistem de referinta drept, care se defineste ca localizare si orientare relativ la sistemul de referinta universal. Implicit (daca nu se executa alte transformari), sistemul de observare este identic (suprapus) cu sistemul de referinta universal. n acest sistem de referinta de observare se poate defini o transformare de proiectie paralela ortografica sau de proiectie perspectiva. Functiile oferite de OpenGL permit definirea proiectiei perspective pe un plan perpendicular pe axa z a sistemului de referinta de observare, cu directia de observare spre z (fig. 6 ). Trunchiul de piramida de vizualizare este orientat spre zV si poate fi definit prin valorile: ? znear : distanta (data ca valoare pozitiva) a planului de vizualizare si a planului de vizibilitate apropiat fata de centrul sistemului de referinta de observare (O V) ? zfar: distanta (data ca valoare pozitiva) a planului de vizibilitate departat fata de centrul sistemului de referinta de observare ? left, right: specifica coordonatele planelor verticale ale volumului de vizualizare ? top, bottom : specifica coordonatele planelor orizontale ale volumului de vizualizare. Coltul din stnga-jos (D) al ferestrei de vizualizare are coordonatele ( left, bottom, znear ) n sistemul de referinta de observare, iar coltul din dreapta-sus (B) are coordonatele (right, top , znear) n acelasi sistem. Functia OpenGL care defineste o astfel de proiectie perspectiva cu parametrii de mai sus este functia glFrustum() care are prototipul:
void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble znear, GLdouble zfar);

Se poate folosi si o alta functie, gluPerspective(), care are prototipul:


void gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar);

unde fovy este unghiul pe verticala (n grade) al piramidei de vizibilitate, iar aspect este raportul dintre dimensiunea orizontala si dimensiunea verticala a ferestrei de vizualizare.

15

Directia de observare yV
B A

zV

OV z V
C

xV

zV = znear D

zV = zfar Fig. 6 Definirea proiectiei perspectiva si a volumului de vizualizare n OpenGL.

1 .6.2 TRANSFORMARI GEOMETRICE OPENGL


Asa dupa cum s -a mai aratat, nu este eficient sa se calculeze produsul dintre matricea de reprezentare a fiecarui punct si matricele de transformari succesive, ci se calculeaza o matrice de transformare compusa, care se poate aplica unuia sau mai multor obiecte. Pentru calculul matricelor de transformare compuse se foloseste o matrice de transformare curenta si operatii de acumulare n matricea curenta prin postmultiplicare (nmultire la dreapta): se nmulteste matricea curenta cu noua matrice (n aceasta ordine) si rezultatul nlocuieste continutul matricei curente. Pentru secventa de transformari n ordinea M1, M2Mn, aplicate obiectelor, se initializeaza matricea curenta C cu matricea identitate, dupa care se calculeaza matricea compusa prin postmultiplicare n ordine inversa celei n care se aplica 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 ......M2 C = CM 1 = M n M n - 1 ......M2 M 1 C = M = M n M n - 1 ......M2 M 1 P' = MP = M n M n- 1 ......M2 M 1 P

n aceasta transformare, se aplica mai nti matricea M1 punctului P; punctului transformat rezultat i se aplica transformarea M2, s.a.m.d. Se poate retine deci ca matricea compusa M se scrie ca produs n ordinea inversa aplicarii transformarilor componente si tot n ordine inversa se acumuleaza n matricea curenta. Acest mod de calcul al matricelor compuse are suport n OpenGL prin mai multe variabile interne (matrice curente) si functii prin care acestea pot fi calculate. Pentru nceput, se considera o matrice curenta oarecare C stabilita n OpenGL printr-o comanda corespunzatoare (va fi prezentata ulterior). Matricea curenta se poate initializa cu matricea identitate prin functia glLoadIdentity() sau cu o matrice oarecare, data prin pointer la un vector de 16 valori consecutive, printr-una din functiile glLoadMatrix#() :
glLoadMatrixd(const GLdouble* m); glLoadMatrixf(const GLfloat* m);

Valorile din vectorul GLdouble* m (respectiv GLfloat* m) sunt atribuite n ordinea coloana majora matricei curente.

16

Continutul matricei curente poate fi modificat prin multiplicare (la dreapta) cu o alta matrice, data printr-un vector de 16 valori de tip double sau float utiliznd functia glMultMatrix#():
glMultMatrixf(const GLfloat* m);

Matricea curenta C este nlocuita cu produsul C M, unde M este matricea corespunzatoare vectorului dat prin pointerul m . Crearea unei matric e pentru o transformare elementara (translatie, scalare, etc) si nmultirea ei cu matricea curenta se poate face prin apelul unei singure functii OpenGL. Transformarea de translatie cu valorile x, y, z se implementeaza prin apelul uneia din functiile glTranslate#() care creeaza o matrice de translatie T(x, y, z), nmulteste la dreapta matricea curenta C , iar rezultatul nlocuieste continutul matricei curente C, deci: C = C T(x, y, z):
glTranslatef(GLfloat x, GLfloat y, GLfloat z);

Transformarea de scalare este efectuata de una din functiile glScale#() care creeaza o matrice de scalare S (x, y, z) si o nmulteste cu matricea curenta, rezultatul fiind depus n matricea curenta :
glScalef(GLfloat x, GLfloat y, GLfloat z);

Transformarea de rotatie se defineste printr-o directie de rotatie data prin vectorul de pozitie x, y, z si un unghi angle (specificat n grade). Prototipurile functiilor de rotatie sunt:
glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z); glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);

Rotatiile n raport cu axele de coordonate sunt cazuri particulare ale functiilor glRotate#(). De exemplu, rotatia cu unghiul angle n raport cu axa x se obtine la apelul functiei glRotated(angle,1,0,0).Transformarile compuse se efectueaza p rin acumularea produsului matricelor componente n matricea curenta, care este matricea din vrful stivei curente. Stivele matricelor de transformare . Dupa cum s-a mai aratat, transformarea unui obiect din sistemul de referinta local (de modelare) n sistemul de referinta normalizat este compusa din succesiunea transformarilor de modelare (instantiere) MI, de observare M V si de normalizare MN : M=MN MV MI Transformarea de instantiere MI este, n general, specifica fiecarui obiect, deci se calculeaza pentru fiecare obiect n parte. Pentru cele mai multe din aplicatiile grafice, n care scena este observata dintr-un singur punct de observare, matricea de observare MV este unica pentru toate obiectele ntr-un cadru dat, dar se modifica la cadrul urmator (imaginea urmatoare), daca observatorul si-a schimbat pozitia de observare, situatie cea mai probabila n grafica interactiva. Matricea de normalizare MN este definita de parametrii de proiectie, care, asa cum s-a prezentat n sectiunea precedenta, corespund constructiei sistemului grafic (tipul si numarul de proiectoare, unghiul de vizibilitate), deci aceasta matrice este o caracteristica constructiva a sistemului graf ic si ramne constanta pe toata perioada desfasurarii programului, pentru toate obiectele si pentru toate imaginile generate (cadrele de imagine). n concluzie, sunt necesare urmatoarele matrice de transformare n cursul generarii imaginilor succesive, la momentele (cadrele) i, i+1, i+2, Cadrul i: M=MN MVi MI1 , pentru obiectul 1 M=MN M Vi MI2 , pentru obiectul 2
..

M=MN MVi MIk ,

pentru obiectul k

Cadrul i+1: M=MN MVi+1 MI1 , pentru obiectul 1 M=MN M Vi+1 MI2, pentru obiectul 2
..

M=MN MVi+1 MIk, pentru obiectul k

Se pune problema care este cea mai eficienta organizare a acestor operatii de transformari succesive. Daca s-ar utiliza o singura matrice curenta, secventa operatiilor de compunere ar trebui sa

17

fie efectuata pentru fiecare obiect, n fiecare cadru de imagine. Este evident ca utilizarea unei singure matrice curente de transformare este ineficienta si nejustificata, dat fiind ca o matrice este o resursa extrem de putin costisitoare. Solutia adoptata n OpenGL este de a se folosi mai multe stive de matrice de transformare, n care sa fie retinute si reutilizate matricele intermediare de transformare. Transformarile de modelare si de observare sunt efectuate ntr-o stiva de matrice, numita stiva matricelor de modelare-vizualizare (modelview matrix stack). Transformarea de normalizare este prelucrata ntr-o stiva de matrice separata, numita stiva matricelor de proiectie (projection matrix stack ). Mai exista nca o stiva de matrice pentru operatiile de texturare, numita stiva matricelor de texturare (texture matrix stack). Separarea matricelor de modelare-vizualizare si de proiectie permite executia n paralel a operatiilor din pipeline-ul grafic al acceleratoarelor hardware care au prevazute resurse pentru astfel de prelucrari. Fiecare stiva de matrice se comporta asemanator cu o stiva obisnuita, asupra careia se opereaza prin functii de introducere (push ) si extragere (pop). Aceste functii difera foarte putin fata de functiile push si pop folosite n general n programare. n orice moment, una din cele trei stive de matrice este declarata ca stiva curenta si toate operatiile cu matricele de transformare sunt adresate stivei curente. Setarea unei stive curente se face prin apelul functiei void glMatrixMode(GLenum mode), unde argumentul mode poate lua una din constantele simbolice GL_MODELVIEW, GL_PROJECTION sau GL_TEXTURE pentru setarea ca stiva curenta a stivei de modelare-vizualizare, a stivei de proiectie sau a stivei de texturare Matricea din vrful stivei curente este matricea curenta C, cu care se efectueaza operatiile cu matrice (glLoadIdentity() , glTranslate#(), glLoadMatrix#() , etc). Functia glPushMatrix() adauga o noua matrice n stiva curenta, egala cu matricea din vrful acesteia, care devine noul vrf al stivei. ncarcarea unei noi valori n noua matrice curenta se face prin operatii ulterioare de ncarcare sau acumulare prin postmultiplicare. Functia glPopMatrix() elimina matricea din vrful stivei curente, iar matricea precedenta acesteia devine noua matrice curenta. Aceasta functie nu salveaza matricea eliminata (deci ea nu este extrasa, ca n operatiile pop obisnuite), iar daca aceasta matrice ar mai fi necesara, ea trebuie copiata n alta zona de memorie, nainte de apelul functiei glPopMatrix().

Teme - Exercitii
1 Transformarea de proiectie. Pentru definirea transformarii de proiectie se seteaza mai nti stiva matricelor de proiectie ca stiva curenta (cu functia glMatrixMode(GL_PROJECTION)), dupa care se ncarca matricea identitate ( glLoadIdentity()) si se compune cu matricea de proiectie specificata prin functia gluPerspective(). n mod obisnuit specificarea transformarii de proiectie se face la lansarea programului si ori de cte ori se modifica dimensiunea portii de afisare; n proiectul MFC (Lab3d) transformarea de proiectie se defineste n functia OnSize(). Dupa definirea transformarii de proiectie, toate (sau majoritatea) operatiilor de transformari geometrice se adreseaza stivei matricelor de modelare-vizualizare, de aceea se seteaza ca stiva curenta stiva matricelor de modelare-vizualizare prin comanda glMatrixMode(GL_MODELVIEW) . Introduceti o comanda pentru modificarea parametrilor fovy, zNear si zFar ai proiectiei de perspectiva. Observati cum se modifica imaginea aceluiasi obiect prin modificarea proiectiei perspectiva. Remarcati, de asemenea decuparea obiectelor relativ la volumul de vizibilitate: atunci cnd un obiect este inclus partial n piramida de vizibilitate, are lor decuparea fiecarei suprafete si afisarea numai a partii vizibile a acestora. Aceasta operatie este executata automat de biblioteca OpenGL si nu poate fi inhibata sau modificata. 2 Transformarea de observare si transformarile de modelare. n programele realizate urmariti n mod diferentiat transformarea de observare si transformarile de modelare aplicate obiectelor din scena. n biblioteca OpenGL coordonatele obiectelor (transmise prin func tii glVertex()) sunt date fata de sistemul de referinta universal, iar punctul de observare implicit este n centrul sistemului

18

de referinta universal si directia de observare catrea axa ? Oz. Pentru a fi vizibile obiectele scenei, fie se modifica pozitia punctului de observare, fie se modifica pozitia obiectelor, fie ambele. Pozitia sistemului de referinta de observare se defineste prin coordonatele punctului de observare OV (Xv, Yv, Zv) si unghiurile de rotatie dupa axele y, x, z (angleYv, angleXv, angleZv), deci cu o matrice de transformare de observare: MV = R Z(? angleZv) R X(? angleXv) R Y(? angleYv) T(? Xv, ? Yv, ? Zv) Functiile OpenGL care realizeaza aceasta transformare de observare sunt:
// Transformarea de observare glRotatef(-angleZv, 0.0,0.0,1.0); glRotatef(-angleXv, 1.0,0.0,0.0); glRotatef(-angleYv, 0.0,1.0,0.0); glTranslatef(-Xv, -Yv, -Zv);

Pozitia obiectelor scenei n sistemul de referinta universal se defineste printr-un sistem de referinta local cu coordonatele centrului (Xs, Ys, Zs) si unghiurile de rotatie dupa axele y, x, z (angleYs, angleXs, angleZs). Matricea de transformare de modelare va fi deci: MS = T(Xs, Ys, Zs)R Y(angleYs) R X(angleXs) R Z(angleYs) Functiile OpenGL care realizeaza aceasta transformare de observare sunt: // Transformarea de pozitionare a obiectelor scenei glTranslatef(Xs,Ys,Zs); glRotatef(angleYs, 0.0,1.0,0.0); glRotatef(angleXs, 1.0,0.0,0.0); glRotatef(angleZs, 0.0,0.0,1.0); Daca se initializaza variabila Zv = 5, iar toate celelalte variabile de pozitie si unghiuri cu 0, atunci obiectele scenei sunt pozitionate n sistemul de referinta universal, iar punctul de observare se afla pe axa Oz, la distanta egala cu 5 si observatorul priveste catre z negativ (catre origine, fig. 3.7). n functia DrawScene() (sau Display()) observati si alte operatii necesare compunerii matricelor de transformare n OpenGL: perechea de functii glPushMatrix() si glPopMatrix()asigura salvarea/ restaurarea matricei curente. Pentru a urmari pozitionarea observatorului si a scenei modificati valorile po zitiilor si ale unghiurilor definite mai sus (folosind, de exemplu, evenimente de mouse, de tastatura sau controale spin - (CSpinButtonCtrl) introduse ntr-o bara de dialog) si, la fiecare noua valoare generati imaginea corespunzatoare. 3 Miscarea observatoru lui. Pentru a studia influienta pozitiei punctului si a directiei de observare asupra imaginii generate folositi un obiect asimetric (cum este ceainicul - Teapot), care sa permita sesizarea miscarilor obiectului. Mentineti sistemul de referinta al obiectelor scenei identic cu sistemul de referinta universal (toate valorile Xs , Ys , Zs , angleXs, angleYs, angleZs egale cu 0) si modificati pozitia de observare si orientarea sistemului de referinta de observare prin modificarea pe rnd a valorilor variabilelor Xv, Yv , Zv , angleXv, angleYv, angleZv. Veti observa ca obiectul "se misca" n sens invers miscarii observatorului. Daca, de exemplu, observatorul se deplaseaza spre x pozitiv (prin cresterea valorii variabilei vx), imaginea obiectului se deplaseaza spre stnga ecranului. Se va observa, de asemenea, ca, la rotatia sistemului de referinta de observare fata de axele x si y cu un unghi mai mare dect unghiul de vizibilitate (initializat la 45 grade prin functia gluPerspective()), obiectul dispare din imagine. 4 Deplasarea obiectelor scenei. Studiati modul de comportare al transformarii de pozitionare (modelare) a obiectelor scenei virtuale. Mentineti nemodificata pozitia observatorului (variabilele Xv, Yv, Zv , angleXv , angleYv, angleZv ) si modificati pozitia si orientarea obiectelor scenei prin modificarea pe rnd a valorilor variabilelor Xs, Ys , Zs , angleXs, angleYs, angleZs. 5 Modelarea scenelor complexe. Pentru crearea unei scene compuse din mai multe obiecte se folosesc transformari de modelare (instantiere) pentru fiecare obiect, care se compun n matricea

19

MODELVIEW , cu salvarea, respectiv restaurarea, matricei din vrful stivei. Forma generala a secventei de apeluri OpenGL (din functia DrawScene() n proiectul Lab3d sau functia Display() n proiectul GLUT) pentru modelarea si redarea scenelor complexe este urmatoarea :
glPushMatrix(); Transformarea de observare Transformarea de pozitionare a tuturor obiectelor scenei glPushMatrix(); Transformarea de modelare a primului obiect Redarea primului obiect glPopMatrix(); glPushMatrix(); Transformarea de modelare al celui de-al doilea obiect Redarea celui de-al doilea obiect glPopMatrix(); . glPopMatrix();

Ca exercitiu, creati o scena virtuala compusa dintr-un con al carui vrf sa intre n spatiul liber din centrul unui tor (fara sa atinga torul), sau alte combinatii de diferite instantiate n diferite pozitii n scana virtuala. 6 Transformari compuse. Introduceti o comanda (sau modificati functia de afisare) pentru realizarea unei transformari compuse a obiectului. De exemplu, realizati rotatia obiectului cu un unghi variabil fata de o dreapta paralela cu axa Oz, care trece prin punctul F(1,1,0).

2. MODELE DE REFLEXIE SI ILUMINARE

Redarea obiectelor tridimensionale prin suprafete colorate uniform creeaza imagini nerealiste si dificil de interpretat. De exemplu, o sfera neluminata arata la fel ca un disc bidimensional. Acest aspect nerealist se datoreaza faptului ca perceptia celei de-a treia dimensiuni este mult influientata de iluminarea obiectelor. n lumea reala, atunci cnd lumina provenita de la diferite surse de lumina cade asupra obiectelor opace, o parte este absorbita de obiect, iar o parte este reflectata. Ochiul percepe lumina reflectata de obiect, pentru a interpreta forma, culoarea si alte detalii ale obiectului. Pentru calculul iluminarii n grafica pe calculator trebuie sa fie definite sursele de lumina si interactiunea dintre lumina si suprafete. Un model de iluminare defineste natura luminii emise de o sursa de lumina, adica distributia intensitatii luminii emise. Un model de reflexie descrie interactiunea dintre lumina si o suprafata, n functie de proprietatile suprafetei si natura sursei de lumina. Modelele de iluminare si de reflexie n grafica pe calculator perm it redarea acceptabila din punct de vedere al perceptiei umane a obiectelor tridimensionale proiectate n spatiul ecran bidimensional. Implementarea unui model de reflexie n procedeul de calculare a intensitatii culorii fiecarui pixel este cunoscuta sub numele de tehnica de umbrire. n grafica pe calculator se considera n mod simplificat ca intensitatea reflectata de o suprafata este compusa din trei componente: componenta de reflexie directionata (speculara), componenta de reflexie difuza directionata si componenta de reflexie difuza ideala. Primele doua componente se datoreaza reflexiei de prim ordin, iar componenta de reflexie difuza ideala se datoreaza reflexiilor multiple si a reflexiilor subsuprafetelor (fig. 7).

20

L Orientarea medie a suprafetei

Reflexie de prim ordin

Reflexie multipl a

Reflexii ale subsuprafetelor

Fig. 7 Reflexii de prim ordin, reflexii multiple si reflexii ale subsuprafetelor

Valorile componentelor intensitatilor reflectate depind de rugozitatea suprafetei si de lungimea de unda a luminii. Daca suprafata ar fi oglinda perfecta, atunci singura componenta de lumina reflectata ar fi componenta directionata (speculara). Intensitatea acestei componente depinde de rugozitatea suprafetei: cu ct suprafata este mai neteda, cu att componenta speculara este mai mare. Componenta de difuzie directionata depinde de asemenea de reflexiile de prim ordin. Directiile de reflexie sunt mprastiate n semisfer a centrata n punctul de incidenta, dar exista o directie preferintiala, care este directia reflexiei speculare pentru suprafetele cu rugozitate redusa. Componenta de difuzie ideala reflecta lumina n toate directiile n interiorul unei semisfere centrate n punctul de incidenta, datorita mprastierii provocate de subsuprafetele componente. Prin descompunerea functiei de reflexie bidirectionala n trei componente se poate dezvolta un model analitic bazat pe aspecte fizice, optice si geometrice, care sa permita simularea iluminarii si a reflexiei n grafica pe calculator. Modelul de reflexie Phong este cel mai cunoscut model n grafica pe calculator, care adopta o reprezentare empirica si fenomenologica, prin formule de calcul simple de imitare a comportarii teoretice a reflexiei luminii, descrise anterior.

2.1 MODELUL DE REFLEXIE PHONG


Modelul de reflexie Phong imita eficient modul real de reflexie, pna la un grad care produce o perceptie destul de buna a obiectelor iluminate si, de aceea, are o larga utilizare n grafica pe calculator. Modelul de reflexie Phong considera lumina reflectata de o suprafata ca fiind o combinatie liniara a trei componente: reflexia difuza, speculara si ambientala. Componenta de reflexie difuza corespunde componentei de reflexie difuza ideale descrise n subcapitolul precedent si este evaluata prin relatia:
I d = I i k d (L N) = I i k d cos ?

(4.1)

unde Ii este intensitatea luminii incidente, L este vectorul unitate ndreptat catre sursa de lumina si N este vectorul unitate normal la suprafata n punctul de incidenta (fig. 8(a)). Pentru o suprafata plana, unghiul ? este constant, deci componenta de reflexie difuza este constanta. k d este un coeficient de reflexie (reflectanta) empiric, care depinde de lungimea de unda a luminii si de natura suprafetei. Dat fiind ca n reflexia difuza lumina este reflectata n toate directiile, aceasta componenta nu depinde de pozitia de observare. Daca exista mai multe surse de lumina, atunci:
I d ? k d ? I i , n ( L n ? N)
n

(4.2)

unde Ln este vectorul unitate n directia celei de-a n-a sursa de lumina.

21

Componenta speculara a reflexiei n modelul Phong depinde de unghiul ? ntre directia de observare V si directia de oglindire R (fig. 8(b)). Daca se considera R si V vectorii unitate ai acestor directii, atunci:
I s = Ii k s cos ? = Ii k s (R V)
n n

(4.3)

unde n este un indice care simuleaza rugozitatea suprafetei.

L ? N

L ? N ? ? R V

(a)

(b) Fig. 8 (a) Reflexia difuza Phong. (b) Reflexia speculara Phong.

Pentru o suprafata oglinda perfecta, n tinde catre infinit si lumina este reflectata numai n directia de oglindire R, pentru care cos n ? =1. Pentru valori finite ale indicelui n, se genereaza un lob de reflexie, a carui grosime este o functie de rugozitatea suprafetei. Cu ct suprafata este mai lucioasa, cu att indicele n este mai mare pentru simularea reflexiei speculara cu lob ngust. Efectul reflexiei speculare n modelul Phong este acela de a produce o iluminare mai accentuata (highlight ), care este reflexia sursei de lumina pe o arie a suprafetei, depinznd de valoarea lui n. Culoarea luminii reflectate specular poate fi diferita de culoarea luminii reflectate difuz. n modelele cele mai simple de reflexie speculara, se presupune ca aceasta componenta are culoarea sursei de lumina. De exemplu, o suprafata de culoare verde iluminata de o sursa de lumina alba produce o componenta de reflexie de difuzie de culoare verde, dar pata luminoasa de reflexie speculara are culoarea alba. Componenta de lumina ambientala se adauga n modelul Phong pentru a simula iluminarea globala a scenei. Aceasta componenta permite iluminarea suprafetelor care nu sunt vizibile din sursa de lumina, dar sunt vizibile din punctul de observare. Fara componenta ambientala, suprafetele care nu sunt ndreptate catre o sursa de lumina ar fi redate complet negre, ceea ce ar crea un efect nerealist. Componenta ambientala aproximeaza iluminarea indirecta a suprafetelor, de exemplu datorita reflexiilor multiple fata de peretii unei incinte. Aceste reflexii sunt foarte de complicat de simulat, astfel nct modelul Phong le ignora si adauga o componenta de lumina ambientala constanta data de relatia:
Ig = Iaka

(4.4)

Prin nsumarea componentelor de lumina difuza, speculara si ambientala, se obtine iluminarea totala a unei suprafete:
I = I a k a + I i k d (L N ) + k s (R V )

)
)

(4.5)

n modelul RGB de reprezentare a culorilor, relatia (4.5) se descompune n trei relatii, pentru fiecare componenta rosu, verde, albastru:
I r = Ia k ar + Ii k dr (L N ) + k sr (R V )n

I g = I a k ag + Ii k dg (L N) + k sg (R V) n I b = I a k ab + Ii k db (L N ) + k sb (R V) n

)
)

(4.6)

22

2.2 MODELE DE UMBRIRE


Aplicarea directa a relatiei (4.6) pentru calculul culorii fiecarui pixel necesita un timp de executie extrem de ridicat, care nu este acceptabil n grafica interactiva. De aceea, n sinteza de imagine se folosesc anumite metode simplificate de calcul al culorii fiecarui pixel, numite tehnici (modele) de umbrire. Tehnicile de umbrire depind de modul de reprezentare a obiectelor. Pentru obiectele modelate prin retea de poligoane, se folosesc mai multe modele de umbrire: umbrirea constanta (poligonala, flat ), umbrirea Gouraud si umbrirea Phong. Umbrirea constanta admite calculul unei singure intensitati a culorii pentru fiecare suprafata poligonala; acest mod de calcul este posibil daca se admite ipoteza simplificatoare ca att sursele de lumina, ct si observatorul sunt la infinit. Umbrirea constanta produce discontinuitati de culoare la frontiera dintre suprafete. Calculul umbririi constante nseamna aplicarea formulelor Phong (4.6) pentru fiecare supraf ata vizibila, o singura data pentru fiecare pozitie a observatorului. Umbrirea Gouraud. Pentru eliminarea discontinuitatilor de colorare care apar n umbrirea constanta, Gouraud a introdus o metoda de umbrire care-i poarta numele si care calculeaza intens itatea de culoare a pixelilor suprafetelor prin metode de interpolare, pornind de la intensitatile n vrfurile poligonului. Metoda incrementala de calcul al intensitatii de culoare a pixelilor este asemanatoare metodei de calcul al adncimii pixelilor folosita n algoritmul Z-buffer. n general, se aplica combinat transformarea de rastru, eliminarea suprafetelor ascunse si umbrirea Gouraud, ntr-un algoritm de baleiere pe linii generalizat. Umbrirea Gouraud este o tehnica de interpolare biliniara a intensitatii culorii, foarte simpla si economica, care atenueaza discontinuitatile de la frontiera poligoanelor prin care este reprezentat un obiect tridimensional, fara sa elimine complet aspectul poligonal al obiectelor. Intensitatea de culoare se calculeaza n vrfurile poligoanelor prin aplicarea relatiilor (4.6) de calcul al reflexiei n modelul Phong. Normala ntr-un vrf al unui poligon se calculeaza ca medie a normalelor tuturor poligoanelor care sunt adiacente vrfului:

Nv ?

i? 1

Ni m

(4.7)

Normalele n vrfurile poligoanelor sunt definite n sistemul de referinta model si ele sunt transformate n sistemul de referinta de observare prin aplicarea acelorasi transformari care se aplica vrfurilor: transformarea de instantiere si transformarea de observare. n sistemul de referinta de observare se calculeaza intensitatile n vrfurile poligoanelor si aceste valori sunt folosite pentru interpolare biliniara n algoritmul de conversie de baleiere pe linii a poligoanelor. Acest mod de calcul permite ca normalele n vrfuri sa fie calculate o singura data, la modelare, si memorate ca parte a modelului obiectului n baza de date grafice. Atunci cnd se decupeaza fetele obiectelor, pot sa apara vrfuri noi, care nu existau n modelul obiectului initial. Pentru aceste vrfuri se calculeaza normalele n noile vrfuri prin interpolare ntre normalele laturilor intersectate de planul de decupare. Interpolarea biliniara a intensitatilor de culoare a pixelilor unui poligon se executa n cadrul algoritmului de baleiere pe linii pornind de la intensitatile de culoare ale vrfurilor poligonului, calculate prin relatiile modelului de reflexie Phong. Desi acceptabila n multe aplicatii, att ca eficienta ct si ca realism de reprezentare, umbrirea Gouraud poate provoca unele anomalii provenind n primul rnd din calculul normalei ntr-un vrf prin medierea normalelor fetelor adiacente. O parte din deficientele tehnicii de umbrire Gouraud sunt eliminate n modelul de umbrire Phong. Modelul de umbrire Phong este, ca si modelul Gouraud, un model de calcul al intensitatii culorii prin interpolare biliniara, dar n acest model se interpoleaza normalele si se calculeaza exact intensitatea culorii. Umbrirea Phong este mai costisitoar e din punct de vedere al operatiilor efectuate deoarece, pentru fiecare pixel, se aplica relatia de calcul (4.6), care contine produse scalare de vectori si

23

nmultiri. Dar, din punct de vedere al calitatii imaginii generate, umbrirea Phong este mai buna, dat fiindca se calculeaza normale foarte apropiate de normala reala n fiecare punct al suprafetei. n tehnica de umbrire Phong se poate simula mult mai corect reflexia speculara ( highlight). n subcapitolul urmator sunt prezentate modalitatile de programare a iluminarii n aplicatii grafice folosind biblioteca OpenGL.

2.3 FUNCTIILE OPENGL DE CALCUL AL ILUMINARII


Biblioteca OpenGL implementeaza modelul de reflexie Phong si modelele de umbrire poligonala si umbrire Gouraud. n mod implicit, sistemul de iluminare este inactivat si pentru desenarea primitivelor geometrice se foloseste culoarea curenta, specificata prin functia glColor#(). Pentru validarea iluminarii obiectelor, se activeaza sistemul de iluminare OpenGL prin apelul functiei glEnable ( GL_LIGHTING). Pentru calculul iluminarii obiectelor trebuie sa fie definite: ? sursele de lumina; ? materialul suprafetelor; ? modelul de umbrire a suprafetelor.

2.3.1

DEFINIREA SURSELOR DE LUMINA

n OpenGL se pot defini mai multe surse de lumina punctiforme. Numarul de lumini admise variaza n functie de implementare, dar cel putin opt lumini sunt disponibile n orice biblioteca OpenGL. Fiecare sursa de lumina poate fi validata prin apelul functiei glEnable(GL_LIGHTi), unde i este indexul sursei de lumina. O sursa de lumina se caracterizeaza prin intensitate si pozitie n scena. Intensitatea unei surse de lumina se specifica pentru fiecare componenta de iluminare (ambientala, de difuzie si speculara) printr-un vector n spatiul culorilor n modelul RGBA. Pozitia unei surse se specifica printr-un vector n coordonate omogene corespunzatoare sistemului de referinta universal. Functia de definire a unui parametru al unei surse de lumina este functia glLight#() care are mai multe variante n functie de tipul argumentelor. De exemplu:
void glLightfv(GLenum light, GLenum pname, const GLfloat *params); void glLightiv(GLenum light, GLenum pname, const GLint *params);

Argumentul light reprezinta indexul sursei de lumina si poate lua un nume simbolic de forma GL_LIGHT0, GL_LIGHT1, . GL_LIGHTi, unde 0 ? i < GL_MAX_LIGHTS. Numarul maxim de lumini depinde de implementarea bibliotecii. Argumentul pname specifica un parametru al sursei de lumina. Sunt acceptate mai multe valori, dintre care unele se refera la intensitate de culoare iar altele la pozitia sursei. Valorile GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR ale argumentului pname permit definirea componentelor intensitatii culorii sursei de lumina. n aceasta situatie, argumentul params reprezinta un pointer la un vector de patru valori (de tip ntreg sau virgula flotanta), care specifica intensitatile RGBA ale componentei de iluminare ambientala, difuza si, respectiv, speculara. Valorile implicite ale intensitatilor sunt (0.0, 0.0, 0.0, 1.0) pentru componenta ambientala si pentru componentele difuza si speculara a oricarei lumini cu exceptia luminii cu index 0, care au intensitatea difuza si speculara implicita (1.0, 1.0, 1.0, 1.0). n acest model de definire a sursei de lumina, componenta ambientala (GL_AMBIENT) se refera la intensitatea RGBA pe care o sursa de lumina o adauga iluminarii globale a scenei. Componenta de iluminare difuza ( GL_DIFFUSE) este cel mai apropiat mod de reprezentare a ceea ce se considera culoarea sursei de lumina. Componenta de iluminare speculara (GL_SPECULAR) afecteaza culoarea zonei stralucitoare (hightlight) a obiectelor luminate de sursa respectiva. Valoarea transparentei surselor de lumina ( alpha) este ignorata daca nu se valideaza calculul transparentei (color blending ). Valoare GL_POSITION a argumentului pname permite definirea pozitiei sursei de lumina. n aceasta situatie, argumentul params este un pointer la un vector de patru numere (ntregi sau

24

virgula flotanta) care reprezinta pozitia n coordonate omogene n sistemul de referinta universal a sursei de lumina. Acesta pozitie este transformata prin aplicarea valorii matricei de modelarevizualizare din momentul apelului functiei glLight#(), astfel nct sursa de lumina va avea coordonatele transformate n sistemul de referinta de observare, unde se calculeaza intensitatea n vrfurile primitivelor geometrice. Daca componenta w a pozitiei este diferita de 0 (w ? 0), atunci sursa este o sursa pozitionala si se foloseste localizarea acesteia pentru calculul directiei de iluminare a suprafetelor. Daca componenta w a pozitiei este 0, atunci lumina este tratata ca o lumina directionala plasata la infinit, n directia definita de componentele x, y, z si se utilizeaza aceasta directie pentru calculul componentelor de reflexie difuza si speculara. Pozitia implicita a unei surse este (0, 0, 1, 0), deci sursa este plasata la infinit pe axa z si ea lumineaza obiectele n directia z.

2.3.2 DEFINIREA PROPRIETATILOR MATERIALELOR


Pentru calculul intensitatii culorii unei suprafete, trebuie definiti coeficientii de reflexie pentru componentele de reflexie ambientala, difuza si speculara. Aceste proprietati sunt considerate proprietati de material al suprafetei si se specifica prin apelul uneia sau mai multora din cele patru variante ale functiei glMaterial#() :
void glMaterialf(GLenum face,GLenum pname,GLfloat param); void glMaterialfv(GLenum face,GLenum pname,GLfloat *param);

n aceste functii, argumentul face este numele fetei si depinde de orientarea acesteia; poate lua ca valori constantele simbolice GL_FRONT , GL_BACK, GL_FRONT_AND_BACK . Argumentul pname specifica proprietatea materialului, care se defineste prin apelul functiei glMaterial#(). Acest argument poate lua valorile GL_AMBIENT , GL_DIFFUSE , GL_AMBIENT_AND_DIFFUSE , GL_SPECULAR, GL_SHININESS . Functia glMaterialf() se foloseste numai pentru setarea stralucirii (GL_SHININESS) la valoarea data prin argumentul param. Functia glMaterialfv() se foloseste pentru specificarea celorlalte proprietati. n general, param este un pointer la un vector de patru valori de tip ntreg sau cu virgula flotanta, care sunt componentele rosu, verde, albastru si alpha (transparenta) ale componentei de reflexie specificate prin parametrul pname(ambientala, difuza, speculara, emisie). Reflexia difuza joaca cel mai important rol n culoarea pe care o prezinta o suprafata. Ea reprezinta culoarea pe care o are suprafata luminata direct si depinde de componenta de difuzie a luminii incidente, provenita de la una sau mai multe surse de lumina, de coeficientul de reflexie de difuzie (reflectanta de difuzie) a materialului si de unghiul dintre directia luminii si normala la suprafata. Pozitia de observare nu influenteaza componenta de difuzie a luminii reflectate. Reflexia ambientala afecteaza culoarea de ansamblu pe care o prezinta o suprafata si ea devine sesizabila atunci cnd suprafata nu este luminata direct. Ca si reflexia difuza, aceasta componenta nu depinde de pozitia de observare. Cele doua componente se specifica de cele mai multe ori cu aceeasi culoare (asa cum sunt suprafetele reale) folosind parametrul GL_AMBIENT_AND_DIFFUSE n apelul functiei glMaterial#(). Reflexia speculara produce iluminarea mai puternica (highlight ) a unei zone a obiectului, n functie de pozitia de observare. OpenGL permite specificarea culorii produse de reflexia speculara (prin parametrul GL_SPECULAR) si a dimensiunii si stralucirii zonei prin parametrul GL_SHININESS. Functia glMaterial#() seteaza proprietatile materialului curent, care se aplica tuturor vrfurilor introduse dupa aceasta prin functiile glVertex#() sau prin diferite functii de modelare din biblioteca GLUT (de exemplu, glutSolidSphere()). Proprietatile materialului curent se mentin pna la urmatorul apel al functiei glMaterial#() . Calculele de iluminare se pot executa diferit pentru fetele orientate direct ( GL_FRONT ) si cele orientate invers ( GL_BACK ). sau pentru ambele (GL_FRONT_AND_BACK).

25

Teme - Exercitii
7 Definirea sistemului de iluminare. n mod implicit, biblioteca OpenGL reda fiecare suprafata (primitiva geometrica) folosind culoarea curenta. Pentru generarea unei imagini cu iluminare, trebuie: (a) sa se valideze sistemul de iluminare ; (b) sa se valideze si sa se seteze cel putin o sursa de lumina; (c) sa se seteze un material curent. Daca s-a validat sistemul de iluminare, OpenGL foloseste pentru redarea fiecarei suprafete culoarea rezultata din interactiunea surselor de lumina existente cu materialul curent. Schimbnd materialul curent, se poate reda fiecare suprafata cu aspectul (culoarea) dorita. Pentru nceput se poate studia sistemul de iluminare folosind o singura sursa de lumina si un singur material (materialul curent). Pentru aceasta se definesc si se initializeaza parametrii sursei de lumina cu indice 0 ( GL_LIGHT0) si parametrii materialului curent. ntr-un proiect GLUT, parametrii sursei si ai materialului se pot defini ca variabile globale astfel:
GLfloat light_ambient[] = {1.0f, 1.0f, 1.0f, 1.0f}; GLfloat light_diffuse[] = {1.0f, 1.0f, 1.0f, 1.0f}; GLfloat light_specular[] = {1.0f, 1.0f, 1.0f, 1.0f}; GLfloat GLfloat GLfloat GLfloat mat_ambient[] = {0.1f, 0.1f, 0.1f, 1.0f}; mat_diffuse[] = {1.0f, 0.0f, 0.0f, 0.0f}; mat_specular[] = {1.0f, 1.0f, 1.0f, 1.0f}; mat_shininess = 50.0f; //alb //alb //alb // gri inchis // rosu // alb

n proiectul Lab3d, parametrii sursei de lumina si ai materialului curent se declara (de exemplu) variabile membre ale clasei CLab3dView:
GLfloat GLfloat GLfloat GLfloat light_ambient[4], light_diffuse[4]; light_specular[4],light_position[4]; mat_ambient[4], mat_diffuse[4]; mat_specular[4],mat_shininess;

Aceste variabile se initializeaza la construc tia clasei cu aceleasi valori ca mai sus :
light_ambient[0] = 1.0f; .. mat_shininess = 50.0f;

Validarea sistemul de iluminare si a sursei de lumina 0 se face n rutina Init() prin apelul functiilor:
glEnable(GL_LIGHTING); glEnable(GL_LIGHT0);

Setarea parametrilor de culoare ai sursei de lumina si ai materialului curent se face n rutina Init() prin apelul a functiilor:
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular); glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient); glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular); glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);

Daca fiecare suprafata are un material propriu, atunci materialul acesteia se memoreaza n modelul obiectului, iar la redare, functiile glMaterialfv() si glMaterialf() cu argumente valorile componentelor respective se apeleaza pentru fiecare suprafata, naintea functiei glBegin(). Setarea pozitiei sursei de lumina se face n functia de redare a scenei. Se considera pentru nceput o sursa de lumina directionala, plasata pe axa Oz a sistemului de referinta universal. Pozitia unei astfel de surse este: (0,0,1,0); coordonata w = 0 arata ca sursa se afla la infinit n directia z pozitiv; ea va ilumina obiectele dinspre z pozitiv n directia spre z negativ.

26

OpenGL trateaza pozitia unei surse de lumina l a fel cum este tratata pozitia primitivelor geometrice, adica pozitia unei surse este transformata cu aceleasi matrice de transformare ca si primitivele geometrice. Atunci cnd este apelata functia glLight#(GL_LIGHTi, GL_POSITION vect) , pozitia sau directi a este transformata cu matricea de modelare-vizualizare curenta si este memorata n coordonate n sistemul de referinta de observare. Matricea de proiectie nu modifica pozitia surselor de lunima. Dat fiind ca sursa de lumina este definita n sistemul de referinta universal, pozitia ei trebuie sa fie supusa transformarii de observare, la fel ca toate obiectele scenei, astfel nct, dupa transformarea de observare, att obiectele scenei ct si sursa de lumina sa fie pozitionate n sistemul de referina de observare unde se efectueaza calculele de iluminare. Asadar, introducerea functiei de pozitionare a unei surse de lumina trebuie sa se faca dupa transformarea de observare, naintea transformarilor de modelare ale obiectelor scenei. Introducerea pozitiei sursei de lumina n functia de redare DrawScene() din proiectul Lab3d va arata astfel:
void CLab3dView::DrawScene(){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); // Transformarea de observare glRotatef(-angleZv, 0.0,0.0,1.0); glRotatef(-angleXv, 1.0,0.0,0.0); glRotatef(-angleYv, 0.0,1.0,0.0); glTranslatef(-Xv, -Yv, -Zv); // Sursa de lumina fixa (in sistemul de referinta universal) glLightfv(GL_LIGHT0, GL_POSITION, light_position); // Transformarea de modelare (pozitionare) a obiectelor scenei glTranslatef(Xs,Ys,Zs); glRotatef(angleYs, 0.0,1.0,0.0); glRotatef(angleXs, 1.0,0.0,0.0); glRotatef(angleZs, 0.0,0.0,1.0); glColor3f(currentR, currentG, currentB); // culoarea curenta switch (m_scene){ case TEAPOT: glutTeapot(1.0); break; } glPopMatrix(); glFinish(); SwapBuffers(wglGetCurrentDC()); }

ntr-un proiect GLUT , se introduce n mod asemanator functia glLightfv(GL_LIGHT0, GL_POSITION, light_position), n functia de redare Display(), dupa transformarea de observare. La executia programului se va observa iluminarea obiectelor si diferenta fata de aceleasi obiecte redate fara iluminare. 8 Studierea modelelor de umbrire. Modelul de umbrire se defineste prin apelul functiei glShadeModel(GLenum mode) , unde argumentul mode poate lua una din valorile GL_FLAT, pentru modelul de umbrire poligonala, sau GL_SMOOTH, pentru modelul de umbrire Gouraud. Valoarea implicita este GL_SMOOTH . Daca nu este validat sistemul de iluminare, atunci culoarea care se atribuie vrfurilor primitivelor geometrice este culoarea curenta, setata prin apelul unei functii glColor#(). Daca s-a definit modelul de umbrire poligonala (GL_FLAT ), primitivele geometrice se genereaza de culoare constanta. Daca s-a definit modelul de umbrire Gouraud (GL_SMOOTH ), atunci

27

culorile definite n vrfuri se folosesc pentru calculul intensitatii culorii pixelilor primitivei prin interpolarea biliniara. Daca s-a validat sistemul de iluminare, atunci n modelul de umbrire poligonala, fiecare suprafata are o culoare constanta care depinde de culoarea sursei (surselor) de lumina si a materialului. Daca s-a definit modelul de umbrire Gouraud, atunci intensitatea de culoare a fiecarui pixel al fiecarei suprafete este calculata prin interpolare bilineara n functie de intensitatile de culoare din vrfurile suprafetei. Acestea, la rndul lor, se obtin din interactiunea sursei de lumina cu materialul suprafetei si din pozitia suprafetei fata de sursa de lumina. Observati diferenta imaginii generate cu modelul de umbrire constanta si cu modelul de umbrire Gouraud. n proiectul Lab3d introduceti o comanda de meniu care sa modifice modelul de umbrire. 9 Studierea proprietatilor surselor de lumina si ale materialelor. Culoarea obiectului redat depinde de combinatia de culori, pe toate cele trei componente (ambientala, difuza si speculara) a sursei de lumina si ai materialului. Modificnd valorile parametrilor de culoare ai sursei de lumina si ai materialului veti observa combinatiile obtinute si influienta fiecareia dintre componente. Experimentati reflexia speculara prin modificarea culorii speculare a sursei de lumina si a materialului si prin modificarea stralucirii materialului ( GL_SHININESS). n proiectul Lab3D introduceti comenzi de meniu pentru modificarea componentelor de culoare ale sursei de lumina si ai materialului. La comanda respectiva se va lansa un dialog de tipul CColorDialog, prin care se poate selecta culoarea dorita a fiecarei componente. Prin alegerea parametrilor de culoare si stralucire ai materialului se pot obtine efecte care imita materialele reale: metale, materiale plastice, cauciuc, pietre pre tioase, etc. 10 Controlul pozitiei surselor de lumina. Sursa de lumina, asa cum a fost definita la punctul 4.1, este o sursa directionala n directia axei Oz (n sistemul de referinta universal). Pentru a schimba directia acestei surse se pot folosi doua metode: (a) Se modifica valorile coordonatelor din vectorul light_position transmis ca argument functiei glLightfv() ; daca se pasteaza w = 0, atunci valorile x, y si z definesc directia sursei de lumina (n sistemul de referinta universal). (b) Se pastreaza valorile implicite (0,0,1.0) din vectorul de pozitie light_position transmis ca argument functiei glLightfv() si se aplica transformarea dorita a directiei prin intermediul matricei MODELVIEW; binenteles, se salveaza stiva curenta si se reface dupa transformare. Ca exemplu, setati orientarea sursei de lumina ntr-o directie paralela cu planul xOz, care face un unghi de 45 grade cu axa Ox (si cu axa Oz) prin urmatoarele metode (si verificati echivalenta lor):
// Prima metoda: modificarea vectorului care da directia sursei de lumina light_position[0] = 1.41f; light_position[1] = 0.0f; light_position[2] = 1.41f; light_position[3] = 0.0f; glLightfv(GL_LIGHT0, GL_POSITION, light_position); // A doua metoda: introducerea transformarilor n matricea de transformare glPushMatrix(); light_position[0] = 0.0f; light_position[1] = 0.0f; light_position[2] = 1.0f; light_position[3] = 0.0f; glRotatef(45, 0.0, 1.0, 0.0); glLightfv(GL_LIGHT0, GL_POSITION, light_position); glPopMatrix();

Cea de-a doua metoda de setare a orientarii surselor de lumina poate fi folosita pentru a obtine diferite comportari ale surselor de lumina. De exemplu, daca se seteaza pozitiei sursei (prin apelul functiei glLightfv()) nainte de transformarea de observare, atunci se obtine o sursa de lumina

28

care se deplaseaza o data cu observatorul; daca se seteaza pozitia sursei dupa transformarea de modelare a obiectelor scenei, atunci sursa se deplaseza o data cu obiectele scenei. Se pot imagina diferite combinatii de transformari ale pozitiei surselor de lumina pentru a obtine anumite efecte de iluminare n scenele virtuale. Introduceti comenzi de meniu (sau n bara de dialog) care sa permita controlul pozitiei sursei de lumina: modificarea direc tiei sursei de lumina, deplasarea sursei o data cu observatorul, deplasarea sursei o data cu obiectele din scena, etc. 11 Normalele la suprafete si vrfuri. Pentru calculul reflexiei difuze si speculare este necesar sa fie definite normalele la suprafete sau n vrfuri. Se reaminteste formula de calcul a normalei la o suprafata data prin vrfurile v1(x 1, y1, z1), v2, (x 2, y2, z2), v3 (x 3, y3, z3): N = ((y2 y1) (z3 z 2) (y3 y2) (z2 z1)) i + ((x3 x2) (z2 z 1) (x2 x 1) (z3 z2)) j + ((x2 x1) (y3 y2) (x3 x2) (y 2 y1)) k Normala ntr-un vrf este media (pe fiecare dintre cele 3 componente x, y, z) a normalelor suprafetelor incidente n vrful respectiv. n OpenGL normala care se foloseste pentru calculul reflexiei este normala curenta, care se seteaza prin apelul unei variante a functiei glNormal#() si se memoreaza ntr-o variabila de stare a bibliotecii. O parte din prototipurile functiilor glNormal#()sunt:
void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz); void glNormal3fv(const GLfloat *v);

Normala se poate specifica prin componentele nx, ny, nz, sau printr-un pointer la un vector care contine cele trei componente, de tipul cerut prin numele functiei glNormal#() . n exemplele precedente s -a putut observa iluminarea obiectului glutSolidTeapot () (sau alte obiecte GLUT) deoarece aceste functii calculeaza si seteaza corect normalele, dar, alte obiecte (cele ale caror modele au fost creat n lucrarile precedente: piramida, elipsoid, etc.) nu se redau corect cu iluminare. Deoarece nu se setea za normalele la suprafete (sau la vrfuri), valoarea normalei curente este nedeterminata si nu se pot calcula corect intensitatile componentelor de difuzie si speculara ale culorii. Componenta ambientala, care nu depinde de normala, se calculeaza corect. Pentru calculul iluminarii unui obiect definit printr-o multime de primitive date prin vrfurile lor, trebuie sa fie definite fie normalele la suprafete ( pentru umbrirea constanta) fie normalele n vrfuri (pentru umbrirea Gouraud). n mod obisnuit, fara precautii si testari ale starii OpenGL, nu se pot defini simultan ambele tipuri de normale pentru acelasi obiect. Normalele se specif ica n acelasi sistem de referinta ca si vrfurile primitivelor geometrice, deci n sistemul de referinta de modelare. Acest mod de calcul permite ca normalele n vrfuri sa fie calculate o singura data, la modelare, si memorate ca parte a modelului obiectului n baza de date grafice. Asupra lor se aplica transformarea de modelare-vizualizare folosind valoarea matricei din vrful stivei de modelare-vizualizare, existenta n momentul apelului functiei glNormal#(). n felul acesta, normalele sunt transformate n sistemul de referinta de observare, unde se calculeaza intensitatile componentelor de reflexie n vrfuri. Pentru modelele simple, care contin numai fete paralele cu planele sistemului de referinta, normalele se pot deduce direct, fara calcule deosebit e. De exemplu, pentru patratul desenat (RECTANGLE) n planul xOy, normala este (0, -1,0), dat fiind ca directia normalei este spre z negativ. Daca se schimba ordinea vrfurilor, normala va fi ndreptata spre z pozitiv, deci va fi (0,0,1).n mod asemanator se seteaza normalele pentru poligonul regulat modelat n lucrarile anterioare. Pentru cubul cu latura egala cu 2, se poate observa cu usurinta ca normala ntr-un vrf are componentele egale cu coordonatele vrfului. Deci, pentru setarea normalelor n vrfur ile cubului, functia de redare se modifica astfel:
void DrawCube(){

29

// Modelul cu fete indexate for (int i=0;i<6;i++){ glBegin(GL_POLYGON); for (int j=0;j<4;j++){ int index = cubeIndex[i][j]; glNormal3f(cubeCoords[index][0],cubeCoords[index][1], cubeCoords[index][2]); glVertex3f(cubeCoords[index][0],cubeCoords[index][1], cubeCoords[index][2]); } glEnd(); } }

Calculul iluminarii necesita ca vectorul normalei (transmis prin argumentele functiei glNormal()) sa fie vectorul unitate, altfel rezultatele nu sunt corecte. Daca vectorul nu este unitate, se poate folosi validarea glEnable(GL_NORMALIZE), care impune normalizarea vectorului nainte de calculul iluminarii. Aceasta validare se poate introduce n functia de initializare. 12 Pentru celelalte modele create (piramid a, elipsoid, etc.), adaugati structurile de date necesare memorarii materialului pentru fiecare suprafata si ai normalei n fiecare vrf, generati valorile normalelor n cursul creerii modelului si modificati functia de redare a obiectului astfel nct sa se transmita materialele (pentru fiecare suprafata) si normalele (pentru fiecare vrf) si sa se obtina imaginea cu ilumiare corecta a obiectelor. 13 Reprezentati pozitia sursei de lumina printr-un marcaj pe ecran. Introduceti functii de tratare a evenimentelor de mouse, astfel nct la apasarea si miscarea mouse-ului pe ecran sa se modifice corespunzator pozitia (directia) sursei de lumina. n proiectul Lab3d introduceti o comanda de meniu (sau n bara de dialog) care sa selecteze aplicarea miscarii mouse-ului obiectelor scenei sau sursei de lumina.

30