Sunteți pe pagina 1din 208

Felicia Ionescu

PROGRAMAREA
APLICAIILOR GRAFICE
Editura PRINTECH
Bucureti
Descrierea CIP a Bibliotecii Naionale
IONESCU, FELICIA
Programarea aplicaiilor grafice.
Felicia Ionescu, Bucureti: PRINTECH, 1999
203 p. :il. ; cm.
ISBN 973-9475-93-0
1.Programare
004.42
Refereni tiinifici:
Prof. Dr. Ing. R. Strungaru
.l. Dr. Ing. O. Grigore
Editura PRINTECH
Splaiul Independenei 313, Bucureti, Sector 6
Tel: 092 355 664
Director Editur:
Ecaterina Milic
Consilier Editorial:
Mihaela Toma
Toate drepturile asupra acestei ediii aparin autorului. Reproducerea parial sau total
a textului sau a ilustraiilor din aceast carte este posibil numai cu acordul scris al
autorului.
Cuprins
1 Introducere n grafica pe calculator 1
1.1 Aplicaii ale graficii pe calculator 1
1.2 Sisteme grafice 3
1.3 Sisteme de referin tridimensionale 4
2 Modelarea obiectelor 7
2.1 Modelarea poligonal a obiectelor 8
2.1.1 Reprezentarea poligoanelor 8
2.1.2 Reprezentarea poliedrelor 11
2.1.3 Implementarea modelului poligonal 13
2.1.4 Generarea modelului din descrierea matematic 16
2.1.5 Generarea modelului prin baleiere spaial 17
2.1.6 Generarea modelului pornind de la o mulime de puncte
care aparin suprafeei de frontier a obiectului
18
2.1.7 Redarea imaginii obiectelor poligonale 19
2.2 Modelarea obiectelor prin reele de petice 8
2.3 Modelarea prin compunerea obiectelor 21
2.4 Modelarea prin divizare spaial 22
3 Transformri geometrice 25
3.1 Transformri geometrice n spaiu 25
3.1.1 Transformri geometrice primitive 25
3.1.2 Sistemul de coordonate omogene 28
3.1.3 Compunerea transformrilor geometrice 31
3.1.4 Transformri inverse 35
3.1.5 Transformarea sistemelor de referin 37
3.1.5.1 Rotaia fa de o ax paralel cu una din axele
sistemului de referin
40
3.1.5.2 Scalarea fa de un punct oarecare n spaiu 42
3.1.5.3 Rotaia fa de o dreapt oarecare n spaiu 42
3.1.5.4 Transformarea de modelare 44
3.1.6 Alte transformri geometrice n spaiu 46
3.2 Transformri geometrice n plan 47
4 Sisteme de vizualizare 49
4.1 Transformarea de observare 51
4.2 Transformarea de proiecie 56
4.2.1 Proiecia paralel 57
4.2.2 Proiecia perspectiv 57
4.2.3 Sistemul de referin normalizat 59
4.3 Sistemul de vizualizare standard 66
4.3.1 Definirea sistemului de referin de observare 67
4.3.2 Definirea transformrii de normalizare 67
4.4 Sistemul de referin ecran 3D 72
4.5 Decuparea obiectelor 74
4.5.1 Decuparea n plan 74
4.5.2 Decuparea suprafeelor relativ la volumul de vizualizare 79
4.5.3 Eliminarea obiectelor aflate n exteriorul volumului de
vizualizare
82
4.5.4 Volumul de delimitare 83
4.5.5 Detecia coliziunii 84
5 Transformarea de rastru 85
5.1 Reprezentarea culorilor n sistemele grafice 86
5.1.1 Modelul RGB 86
5.1.2 Modelul HSV 88
5.2 Generarea segmentelor de dreapt 89
5.3 Generarea poligoanelor 91
5.4 Eliminarea suprafeelor ascunse 93
5.4.1 Compararea adncimilor 94
5.4.2 Eliminarea suprafeelor ascunse n spaiul obiect 95
5.4.3 Eliminarea suprafeelor ascunse n spaiul imagine:
algoritmul Z-buffer
96
5.4.4 Eliminarea suprafeelor orientate invers 99
5.5 Anti-aliasing 102
5.6 Texturarea 103
5.6.1 Aplicaia texturilor 104
5.6.2 Filtrarea texturilor 106
6 Biblioteca grafic OpenGL 109
6.1 Dezvoltarea programelor grafice folosind utilitarul GLUT 111
6.1.1 Funcii de control ale ferestrei de afiare 111
6.1.2 Funcii callback 112
6.1.3 Funcii de execuie 113
6.1.4 Generarea obiectelor tridimensionale 113
6.2 Caracteristicile biobliotecii OpenGL 114
6.2.1 Poarta de afiare OpenGL 114
6.2.2 Bufferul de cadru 115
6.2.3 Operaiile de baz OpenGL 117
6.2.4 Primitive geometrice 120
6.2.5 Reprezentarea culorilor n OpenGL 123
6.3 Sistemul de vizualizare OpenGL 125
6.3.1 Sistemele de referin 125
6.3.2 Transformri geometrice 127
6.4 Decuparea suprafeelor i eliminarea obiectelor aflate n exteriorul
volumului de vizualizare
141
6.4.1 Eliminarea suprafeelor ascunse 142
6.4.2 Selecia suprafeelor n funcie de orientare 142
6.5 Liste de display OpenGL 143
6.6 Texturarea n OpenGL 145
6.6.1 Definirea texturilor 145
6.6.2 Filtrarea texturilor 152
7 Modele de reflexie i iluminare 157
7.1 Consideraii teoretice asupra reflexiei luminii 157
7.2 Modelul Phong de reflexie a luminii 160
7.3 Modele de umbrire 162
7.3.1 Modelul de umbrire constant 162
7.3.2 Modelul de umbrire Gouraud 162
7.3.3 Modelul de umbrire Phong 166
7.4 Funciile OpenGL de calcul a iluminrii 167
7.4.1 Definirea surselor de lumin 167
7.4.2 Definirea proprietilor materialelor 169
7.4.3 Normalele n vrfurile primitivelor geometrice 174
7.4.4 Controlul poziiei i al direciei surselor de lumin 176
7.4.5 Combinarea culorilor 180
7.4.5.1 Transparena 181
7.4.5.2 Anti-aliasing 184
8 Crearea i vizualizarea scenelor virtuale 187
8.1 Reprezentarea scenelor virtuale 189
8.2 Limbajul VRML 192
8.2.1 Construirea formelor geometrice 195
8.2.2 Noduri de grupare 196
8.2.3 Animaia n VRML 201
Bibliografie 203
Prefa
Domeniile de aplicaie ale graficii pe calculator s-au extins o dat cu creterea
puterii de calcul a calculatoarelor i cu ieftinirea adaptoarelor i a acceleratoarelor
grafice: realizarea interfeelor utilizator dezvoltate n numeroase programe utilitare i
medii de programare, proiectarea asistat de calculator (CAD Computer Aided
Design), prezentrile grafice interactive, vizualizarea datelor tiinifice, tehnologia
multimedia, realitatea virtual. n acelai timp, apariia a numeroase biblioteci, limbaje
i programe utilitare (toolkits) care propun diferite modaliti de abordare a aplicaiilor
grafice face i mai dificil sarcina programatorului de a selecta cea mai adecvat
tehnic de soluionare a problemei dorite.
n aceast lucrare se pune accentul pe conexiunea dintre aspectele teoretice ale
graficii i implementarea programelor de generare a imaginii obiectelor i scenelor
virtuale tridimensionale. Lucrarea se bazeaz pe materialul de curs Grafica pe
Calculator, predat la anul IV, specializarea Ingineria Informaiei, secia Electronic
Aplicat i Ingineria Informaiei a Facultii de Electronic i Telecomunicaii. n
primele capitole sunt prezentate operaiile de baz n grafica pe calculator: modelarea
obiectelor tridimensionale, transformri geometrice n spaiu, sisteme de vizualizare,
transformarea de rastru. n cea de-a doua parte a lucrrii se reiau toate aceste aspecte
ale generrii imaginilor din perspectiva programrii, folosind biblioteca grafic
OpenGL, sistemul de dezvoltare GLUT i limbajul de modelare n realitatea virtual
VRML. De asemenea, sunt prezentate aspectele avansate ale generrii imaginilor
tridimensionale (anti-aliasing, umbrire, texturare), att din punct de vedere teoretic, ct
i al abordrii n programare.
Unul din scopuri principale ale crii este de a oferi soluii de implementare a
aplicaiilor grafice prin prezentarea metodelor actuale i accesibile de rezolvare a
fiecrei etape a procesului de generare a imaginilor. n acest sens, aproape toate
imaginile ilustrative ale diferitelor tehnici au fost produse de autoare prin programe
grafice descrise n text.
Octombrie, 1999 Autoarea
1
Introducere n grafica pe calculator
n standardul ISO (International Standardization Office) se definete grafica
pe calculator (computer graphics) ca metode i tehnici de conversie a datelor ctre i
de la un dispozitiv grafic (display) prin intermediul calculatorului. n plus, se mai
menioneaz c aceste metode reprezint modul cel mai puternic de comunicare ntre
om i calculator.
Informaia prezentat vizual este perceput de om n modul cel mai natural.
Structuri complexe i relaiile ntre ele pot fi percepute ntr-un timp mai scurt, ntr-un
numr mai mare i cu mai puine erori n prezentarea vizual dect n oricare alt mod
de prezentare.
Noiunea de grafic pe calculator este asimilat n cele mai multe referine
din domeniu cu aceea de grafic generativ (sau sintez de imagine), avnd ca direcie
de conversie i transformare a datelor aceea de a crea pe display imaginea unor obiecte
a cror descriere este stocat n memoria calculatorului.
1.1Aplicaii ale graficii pe calculator
Domeniile de aplicaie ale graficii pe calculator s-au extins o dat cu creterea
puterii de calcul a calculatoarelor i cu ieftinirea adaptoarelor i a acceleratoarelor
grafice. n continuare sunt prezentate cteva din cele mai importante domenii de
aplicaie ale graficii pe calculator.
Una din cele mai extinse utilizri ale graficii este n realizarea interfeelor
utilizator dezvoltate n numeroase programe utilitare, medii de dezvoltare
i programare, sisteme de operare, baze de date. Intefeele grafice sunt
mult mai prietenoase dect interfeele prin comenzi date n linia de
comand i permit instruirea rapid a utilizatorilor neexeperimentai n
folosirea unor astfel de aplicaii.
O alt ramur important de aplicare a graficii pe calculator o constitue
proiectarea asistat de calculator (CAD Computer Aided Design),
folosit n electronic, mecanic, aeronautic, arhitectur, etc. Domeniul
de proiectare asistat CAD a reprezentat mult vreme cea mai important
aplicaie a graficii pe calculator i a prilejuit dezvoltarea a numeroase
tehnici de generare i vizualizare a modelelor tridimensionale.
Prezentrile grafice interactive (n administraie, tehnologie, statistic,
management, planificare, comanda i conducerea proceselor industriale)
genereaz o gam variat de reprezentri sugestive ale datelor numerice.
Astfel de prezentri permit analiza sistemelor mult mai sugestiv dect
datele prezentate n tabele.
n tehnologia multimedia prezentarea de imagini grafice sintetizate, texte,
imagini video i sunet sunt integrate ntr-o singur aplicaie (de instruire
interactiv, teleconferine, etc). Conexiunea dintre generarea de imagini
tridimensionale i prezentarea de imagini video animate reprezint cel mai
important aspect al soluiei multimedia.
Realitatea virtual este tehnica prin care se obine imersiunea (total sau
parial) a observatorului ntr-un mediu tridimensional generat interactiv
de calculator.
Realitatea Virtual a cunoscut n ultimii ani o imens dezvoltare i publicitate.
n reviste, magazine, la televiziune, s-a prezentat aceast nou i fantastic
tehnologie din cele mai variate puncte de vedere. Cuvntul virtual este folosit n
mod obinuit n domeniul calculatoarelor pentru a desemna o entitate care simuleaz o
alt entitate. De exemplu, termenul memorie virtual se refer la simularea
memoriei principale prin memoria hard-discului. Cuvntul realitate se refer la
mediul perceput de om prin intermediul simurilor. Deoarece realitatea este
perceput prin intermediul simurilor, este posibil alterarea acesteia prin
modificarea datelor percepute de unul sau mai multe simuri. De aceea, Realitatea
Virtual se refer la modalitatea prin care calculatorul modific modul n care o
persoan percepe realitatea, prin simularea unei alte realiti. Aceast realitate, sau
mediu, simulat de calculator este numit Realitate Virtual.
Dintre cele cinci simuri care sunt folosite pentru percepia realitii, nu toate
sunt la fel de importante n crearea unui mediu virtual. Simul gustului i al mirosului
au aciuni limitate n perceperea realitii (cu excepia servirii mesei!) i puine
cercetri au fost efectuate pentru folosirea lor n medii virtuale. Simul tactil este mult
mai util, mai ales atunci cnd se manipuleaz obiecte n mediul virtual. Greutatea,
temperatura, duritatea, rezistena la effort, toate aceste informaii se obin prin simul
tactil. Din acest motiv, cercetri importante au fost fcute pentru a simula atingerea
obiectelor virtuale i, n momentul de fa, experimentele n mediul virtual permit
generarea informaiilor tactile. Cele mai importante simuri folosite n realitatea
virtual sunt vzul i auzul, deoarece cele mai multe informaii despre mediul
nconjurtor se obin prin intermediul ochilor i al urechilor. Din acest motiv, cele mai
multe cercetri n domeniul realitii virtuale au fost fcute n domeniul generrii
imaginii i a sunetelor. Dintre aplicaiile cele mai importante ale realitii virtuale se
pot enumera:
Simulatoare de antrenament, n special simulatoare de zbor, n care se pot
exersa manevre dificile, fr a pune n pericol viaa pilotului sau
securitatea aparatului de zbor.
Proiectare n diferite domenii de activitate (construcii, arhitectur).
Proiectantul are posibilitatea s vad rezultatele proiectului sub forma
imaginii acestuia n timp real, s observe detaliile mpreun cu alte
persoane interesate, i s ia decizii de modificare nainte de construirea
prototipului.
Vizualizarea tiinific, prin care se obine imaginea diferitelor modele sau
fenomene inaccesibile de fi observate altfel (structuri atomice, fluxuri de
informaie, etc).
n domeniul medical, n special chirurgie, se pot efectua experimente la
rece de nvare a diferitelor proceduri fr riscul vieii pacientului.
Jocurile distractive i filmele de animaie sunt unele din cele mai
cunoscute aplicaii de realitate virtual.
n aplicaiile de realitate virtual pot fi nglobate un numr diferit de
componente care asigur un anumit grad de imersiune, adic de senzaie a prezenei
participantului n mediul virtual: sistem de vizualizare, sistem de sunet, sistem de
urmrire a poziiei capului i a minii, sistem generare a senzaiei tactile i a forei de
reacie. n diferite aplicaii de realitate virtual, unele dintre aceste sisteme, cu
excepia sistemului de vizualizare, pot s lipseasc.
Sistemul de vizualizare este componenta cea mai important a aplicaiilor de
realitate virtual i exist unele categorii de aplicaii de realitate virtual (aplicaii de
realitate virtual desktop) dezvoltate numai pe baza generrii imaginii mediului
virtual. n aplicaiile de realitate virtual desktop, imaginea vizual a mediului virtual
tridimensional este afiat pe monitorul unui calculator (n general PC). Participantul
intercioneaz cu mediul virtual prin dispozitive de intrare standard (tastatur, mouse,
joystick). Aceste sisteme permit observarea mediului virtual printr-o fereastr
(ecranul monitorului) i de aceea se mai numesc sisteme WoW (Window on the
World). Sunt cele mai simple i mai ieftine sisteme de realitate virtual, dar este de
ateptat ca astfel de sisteme s cunoasc n viitor dezvoltri spectaculoase, datorit
apariiei unui mare numr de acceleratoare grafice care permit redarea n timp real a
unor imagini realiste.
Crearea unui mediu virtual, n care se pot efectua diferite experimente, este un
proces care necesit dou componente importante, i anume crearea modelului scenei
virtuale i vizualizarea scenei virtuale. Crearea modelului scenei virtuale (mai pe
scurt, crearea scenei virtuale) este un proces off-line i, de cele mai multe ori, de
durat considerabil, prin care se creeaz colecia de modele ale obiectelor
tridimensionale care constitue cea mai adecvat reprezentare a mediului virtual.
Vizualizarea scenelor virtuale este un proces on-line, care se desfoar n
timp real, cu participarea uneia sau mai multor persoane, n care scena virtual este
explorat n mod interactiv, i, n fiecare moment, imaginea scenei redat pe display
depinde de condiiile de explorare (poziie de observare, aciuni interactive, etc).
1.2Sisteme grafice
O aplicaie grafic, indiferent de domeniul creia i este destinat, se dezvolt
ntr-un sistem care prezint anumite faciliti grafice, sistem numit la modul general
sistem grafic.
Un sistem grafic este un calculator care dispune de componente hardware i
software pentru crearea sau prelucrarea imaginilor. Componenta hardware cea mai
important a unui sistem grafic este adaptorul (sau acceleratorul) grafic, prin
intermediul cruia este comandat un dispozitiv de afiare (display) color. La aceasta se
mai adaug diferite dispozitive de intrare (tastatur, mouse, joystick, trackball,
interfee specializate) care asigur interaciunea utilizatorului cu programul de
aplicaie.
n programarea aplicaiilor grafice intervin mai multe componente software,
care asigur crearea imaginilor pe display (Fig. 1.1).
Programul de aplicaie grafic se dezvolt pe baza unor sisteme de dezvoltare
de aplicaii (toolkit-uri) sau direct, prin utilizarea unor biblioteci grafice care asigur
interfaa cu echipamentul hardware prin intermediul driverelor sistemului de operare.
Sistemele de dezvoltare sunt de cele mai multe ori orientate ctre aplicaie i prevd
un set de funcii de nivel nalt care permit crearea unui anumit tip de aplicaie. De
exemplu, exist toolkit-uri pentru generarea obiectelor i a scenelor virtuale (3d
Studio, Autocad, AC3d, Sense8, Designer Workbench, etc), toolkit-uri pentru redarea
imaginii scenelor virtuale (Performer, browser Cosmo Player, etc).
Bibliotecile grafice sunt pachete de funcii care asigur interfaa programului
de aplicaie (creat direct sau prin intermediul unui toolkit care apeleaz funciile
bibliotecii) cu echipamentele hardware ale sistemului grafic.
Bibliotecile grafice reprezint nivelul de programare n care se ncearc
introducerea portabilitii programelor grafice, prin asigurarea unei interfee
Echipament
hardware
Sistem de operare Biblioteci grafice
Sistem de dezvoltare de aplicaii (toolkit)
Programul de aplicaie
Utilizator
Fig. 1.1 Componentele necesare pentru crearea aplicaiilor grafice.
independente de echipamentele hardware care s respecte anumite convenii de
reprezentare a entitilor grafice descrise n standarde.
Primul standard grafic a fost standardul GKS (Graphical Kernel System)
elaborat de ISO n 1985, care coninea un set de funcii grafice 2D independente de
echipament. Acest standard a fost extins n anul 1988 la GKS 3D, care conine funcii
3D independente de echipament.
Un alt standard, PHIGS (Programmers Hierarchical Graphical System) este
un standard 3D care permite n plus organizarea ierarhic a modelelor obiectelor i a
scenelor virtuale.
Bibliotecile grafice cele mai generale sunt bibliotecile grafice care
implementeaz un anumit standard n definirea funciilor de acces la echipamentele
hardware. Cele mai cunoscute biblioteci grafice sunt OpenGL, DirectX, QuickDraw,
care sunt implementate n numeroase sisteme grafice.
n momentul de fa, situaia cea mai obinuit n crearea aplicaiilor grafice
este aceea n care se poate folosi un calculator care dispune de faciliti grafice
(adaptoare, acceleratoare, drivere, biblioteci) care permit programarea la nivel nalt, de
cele mai multe ori complet independent de dispozitivele hardware. Biblioteci grafice
cum sunt OpenGL sau DirectX asigur accesul la funcii grafice adaptate i optimizate
pentru dispozitivele grafice disponibile ale sistemului. De aceea, n lucrare s-a acordat
o mai mic ntindere descrierii unor funcii existente n biblioteci (de exemplu
funciile de generare a segmentelor de linie dreapt, a cercurilor, etc.) i accentul s-a
ndreptat ctre prezentarea metodelor de baz de generare a imaginilor i a modului n
care acestea se pot aplica folosind limbaje i biblioteci grafice de nivel nalt.
Programele grafice propuse n aceast carte se prezint sub forma de cod C,
C++ i, uneori, pseudocod asemntor limbajului C. Biblioteca grafic OpenGL este
folosit intens, datorit portabilitii i disponibilitii acesteia n aproape toate
calculatoarele, de la calculatoare PC pn la staii grafice puternice, sub un numr
mare de sisteme de operare i apelabil din numeroase sisteme de dezvoltare (toolkit).
Scopul prezentei lucrri este acela de a da o descriere unificat a principalelor
metode de generare a imaginilor tridimensionale mpreun cu aspecte de implementare
care s faciliteze sarcina programatorului de a aborda acest domeniu de aplicaii
diversificat i n permanent cretere. n acest sens, aproape toate imaginile ilustrative
ale diferitelor tehnici au fost produse de autor prin programe grafice descrise n text.
1.3Sisteme de referin tridimensionale
Pentru crearea aplicaiilor grafice este necesar ca obiectele s fie poziionate
ntr-un sistem de referin tridimensional. Exist mai multe posibiliti de a specifica
poziia unei mulimi de puncte (vrfuri) prin care este reprezentat un obiect n spaiul
tridimensional: coordonate cilindrice, coordonate sferice, coordonate Carteziene.
Dintre aceste sisteme de referin, cel mai utilizat n aplicaiile grafice este sistemul de
coordonate Cartezian.
Sistemul de coordonate Cartezian n care sunt definite toate obiectele scenei
virtuale se numete sistem de referin universal (world coordinate system- WCS).
Un sistem de coordonate Cartezian se definete prin originea O i trei axe
perpendiculare, Ox, Oy i Oz, orientate dup regula minii drepte sau dup regula
minii stngi. Diferena dintre cele dou sisteme se poate urmri n Fig. 1.2. ntr-un
sistem orientat dup regula minii drepte, dac se rotete mna dreapt n jurul axei z
de la axa x pozitiv spre axa y pozitiv, orientarea degetului mare este n direcia z
pozitiv. ntr-un sistem orientat dup regula minii stngi, rotirea de la axa x pozitiv
spre axa y pozitiv, cu orientarea degetului mare n direcia z pozitiv se obine
folosind mna stng. Orientarea dup regula minii drepte a sistemelor de coordonate
corespunde conveniei matematice standard.
Diferite sisteme de grafic tridimensional sau de realitate virtual folosesc
convenii diferite pentru definirea sistemelor de referin, ceea ce conduce la confuzii,
dac nu se precizeaz convenia folosit. n acest text, pentru sistemul de referin
universal se folosete convenia de sistem de coordonate drept. n grafica
tridimensional se mai folosesc i alte sisteme de referin, care permit descrierea
operaiilor de transformri geometrice i care vor fi precizate pe parcursul lucrrii.
Un punct P n spaiul tridimensional se reprezint n sistemul de referin
Cartezian printr-un tripet de valori scalare, x, y, z, care reprezint componentele
vectorului de poziie OP pe cele trei axe de coordonate. Dac se notez cu i, j, k
versorii (vectorii unitate) ai celor trei axe de coordonate x, y, z, atunci vectorul de
poziie al punctului P este OP = xi + yj + zk. n notaia matriceal, un punct n spaiul
tridimensional se poate reprezenta printr-o matrice linie sau printr-o matrice coloan:
[ ] z y x P sau
1
1
1
]
1

z
y
x
P
Ambele convenii sunt folosite n egal msur n sistemele grafice, ceea ce,
din nou, poate provoca diferite confuzii, dac nu se precizeaz convenia folosit.
Convenia de reprezentare sub form de matrice linie a unui punct, folosit n unele
lucrri [Watt95], [Mold96], are avantajul c exprim operaiile de concatenare a
matricelor ntr-un mod natural, de la stnga la dreapta. Convenia de reprezentare
matematic, standardul grafic PHIGS, biblioteca grafic OpenGL, ca i unele din
lucrrile de referin n domeniu [Foley90] folosesc notaia de matrice coloan pentru
un punct n spaiul tridimensional, care este adoptat i n lucrarea prezent.
y
x
z
O
x
z
y
O
Fig.1.2 (a) Sistem de coordonate orientat dup regula minii drepte i
(b) dup regula minii stngi.
(a)
(b)
2
Modelarea obiectelor
Modul cel mai convenabil de modelare a scenelor virtuale este acela n care
fiecare obiect este modelat ntr-un sistem de coordonate propriu, numit sistem de
referin model (sau sistem de referin local), n care punctele (vrfurile) obiectului
sunt precizate relativ la un anumit punct de referin local. De fapt, n modelarea
ierarhic, un obiect complex poate avea un numr oarecare de sisteme de referin
locale, cte unul pentru fiecare parte component a sa. Instanierea unui obiect n
scena virtual nseamn amplasarea acestuia n sistemul de referin universal printr-o
succesiune de scalri, rotaii i translaii, care transform obiectul din sistemul de
referin local n sistemul de referin universal. Aceast succesiune de transformri
este cunoscut sub numele de transformare de modelare.
Proprietile obiectelor tridimensionale care se modeleaz n aplicaiile grafice
se pot mpri n dou categorii: forma i atribute de aspect. Informaia de form a
unui obiect este diferit de celelalte atribute ale obiectului, deoarece forma este aceea
care determin modul n care obiectul apare n redarea grafic i toate celelalte
atribute se coreleaz cu forma obiectului (de exemplu, culoarea se specific pentru
fiecare element de suprafa a obiectului).
Din punct de vedere al formei, obiectele tridimensionale reprezentate n
grafica pe calculator pot fi obiecte solide sau obiecte deformabile. Un solid este un
obiect tridimensional a crui form i dimensiuni nu se modific n funcie de timp sau
de poziia n scen (proprietatea de form volumetric invariant). Majoritatea
aplicaiilor de realitate virtual se bazeaz pe scene compuse din solide, dar exist i
aplicaii n care obiectele reprezentate i modific forma i dimensiunile ntr-un mod
predefinit sau ca urmare a unor aciuni interactive (de exemplu, n simulri ale
interveniilor chirurgicale). Chiar i reprezentarea unor astfel de obiecte (obiecte
deformabile) se bazeaz pe un model al unui solid, care se modific n cursul
experimentului de realitate virtual. n lucrarea de fa se vor prezenta modele ale
solidelor, care stau la baza prelucrrilor din grafic i realitate virtual.
Modelarea solidelor este o tehnic de proiectare, vizualizare i analiz a
modului n care obiectele reale se reprezint n calculator. n ordinea importanei i a
frecvenei de utilizare, metodele de modelare i reprezentare a obiectelor sunt
urmtoarele:
1. Modelarea poligonal. n acest form de reprezentare, obiectele sunt
aproximate printr-o reea de fee care sunt poligoane planare.
2. Modelarea prin petice parametrice bicubice (bicubic parametric patches).
Obiectele sunt aproximate prin reele se elemente spaiale numite petice
(patches). Acestea sunt reprezentate prin polinoame cu dou variabile
parametrice, n mod obinuit cubice.
3. Modelarea prin combinarea obiectelor (Constructive Solide Geometry -
CSG). Obiectele sunt reprezentate prin colecii de obiecte elementare, cum
sunt cilindri, sfere, poliedre.
4. Modelarea prin tehnica divizrii spaiale. Obiectele sunt ncorporate n
spaiu, prin atribuirea fiecrui element spaial a unei etichete n funcie de
obiectul care ocup elementul respectiv.
Aceste metode de modelare i reprezentare a solidelor se pot grupa n
reprezentri prin suprafaa de frontier (primele dou metode) i reprezentri prin
volum (ultimele dou metode).
2.1Modelarea poligonal a obiectelor
Modelarea poligonal, n care un obiect const dintr-o reea de poligoane
planare care aproximeaz suprafaa de frontier (boundary representation B-rep),
este forma clasic folosit n grafica pe calculator. Motivele utilizrii extinse a
acestei forme de reprezentare sunt uurina de modelare i posibilitatea de redare
rapid a imaginii obiectelor. Pentru obiectele reprezentate poligonal s-au dezvoltat
algoritmi de redare eficieni, care asigur calculul umbririi, eliminarea suprafeelor
ascunse, texturare, antialiasing, frecvent implementai hardware n sistemele grafice.
n reprezentarea poligonal, un obiect tridimensional este compus dintr-o
colecie de fee, fiecare fa fiind o suprafa plan reprezentat printr-un poligon.
2.1.1Reprezentarea poligoanelor
Un poligon este o regiune din plan mrginit de o colecie finit de segmente
de dreapt care formeaz un circuit nchis simplu.
Fie n puncte n plan, notate v
0
, v
1
, ,v
n1
i n segmente de dreapt
e
0
= v
0
v
1
, e
1
= v
1
v
2
, . e
n1
= v
n1
v
0
, care conecteaz perechi de puncte
succesive n ordine ciclic, deci inclusiv conexiunea ntre ultimul punct i primul
punct din list. Aceste segmente mrginesc un poligon dac i numai dac:
(a) Intersecia fiecrei perechi de segmente adiacente n ordinea ciclic este
un singur punct, coninut de ambele segemente: e
i
e
i+1
= v
i+1
, pentru
oricare i = 0,,n1.
(b) Segmente neadiacente nu se intersecteaz: e
i
e
j
= , pentru orice
j i+1.
Segmentele care mrginesc un poligon (linia poligonal) formeaz un circuit
nchis (ciclu) deoarece segmentele sunt conectate capt la capt i ultimul segment
conecteaz ultimul punct cu primul punct; ciclul este simplu deoarece segmentele
neadiacente nu se intersecteaz.
Punctele v
i
se numesc vrfurile poligonului (vertices); segmentele e
i
se
numesc muchii (sau laturi) ale poligonului. De remarcat c un poligon conine n
vrfuri i n muchii i c muchiile sunt orientate, astfel nct formeaz un ciclu (circuit
nchis). O astfel de orientare a segmentelor se numete orientare consistent. n
general, se folosete ordinea de parcurgere n sensul invers acelor de ceasornic: dac
se parcurg muchiile n sensul lor de definiie, interiorul poligonului este vzut
ntotdeauna n partea stng (Fig. 2.1).
O teorem important n prelucrarea poligoanelor este teorema lui Jordan,
care spune c orice curb plan nchis simpl mparte planul n dou pri: o parte
interioar curbei, care este o regiune limitat, i o parte exterioar curbei, care este o
regiune nelimitat. Dei pare simpl din punct de vedere intuitiv, demonstraia
teoremei lui Jordan este destul de dificil i poate fi gsit n referinele bibliografice
[Rour93].
Aceast teorem justific definiia care se mai folosete pentru poligoane, i
anume: poligonul este o regiune limitat din plan, mrginit de o colecie de segmente
orientate consistent. Prin aceast definiie se consider poligonul ca o regiune nchis
din plan. Uneori, poligonul este considerat ca fiind format numai din conturul su,
deci numai de segmentele de dreapt care mrginesc regiunea, i nu de regiunea nsi.
n continuare, se folosete notaia P pentru a desemna conturul poligonului P (linia
poligonal nchis care mrginete poligonul).
Triangularizarea poligoanelor. O alt proprietate important a poligoanelor
folosit n grafic este proprietatea de triangularizare. Se demonstreaz c orice
poligon poate fi mprit n triunghiuri prin adugarea a zero sau mai multe diagonale.
Proprietatea de triangularizare se bazeaz pe noiunile de vizibilitate i diagonal n
poligoane.
Fig. 2.1 Segmentele liniei poligonale sunt orientate i nu se autointerecteaz.
v
5
v
4
v
3
v
2
v
0
Un punct x din interiorul unui poligon poate vedea un alt punct y, dac i
numai dac segmentul xy nu este n nici un punct al su exterior poligonului, adic
xy P. Acest lucru nsemn c linia care unete dou puncte x i y, vizibile unul
altuia, poate atinge un vrf al poligonului. Vizibilitatea ntre dou puncte x i y este
complet (clearly visible), dac linia care unete cele dou puncte nu atinge frontiera
poligonal (Fig. 2.2).
O diagonal a unui poligon este un segment de dreapt ntre dou vrfuri a i
b, complet vizibile unul altuia. Acest lucru nseamn c intersecia dintre segmentul
nchis ab i P este mulimea {a,b}, adic segmentul ab nu atinge linia poligonal
P n alte puncte dect vrfurile a i b, de nceput i de sfrit ale segmentului.
Condiiile ca segmentul ab care unete vrfurile a i b ale unui poligon s fie o
diagonal n acel poligon sunt deci: ab P i ab P ={a, b}. Orice
diagonal mparte un poligon n dou poligoane mai mici (Fig. 2.2).
Dou diagonale ale unui poligon sunt nencruciate (noncrossing) dac
intersecia lor este o submulime a capetelor lor (punctele de nceput i de sfrit ale
segmentelor).
Dac se adaug attea diagonale nencruciate cte sunt posibile ntr-un
poligon, atunci poligonul este mprit n triunghiuri. O astfel de partiionare a unui
poligon n triunghiuri se numete triangularizarea poligonului. Diagonalele se pot
aduga n orice ordine, atta timp ct sunt nencruciate. Demonstraia teoremei
conform creia orice poligon admite o triangularizare, se bazeaz pe teorema lui
Meister, demonstrat n [Rour93], care stabilete c orice poligon cu n 4 vrfuri
admite cel puin o diagonal.
Teorema triangularizrii se bazeaz i pe lema numrului de diagonale: Orice
triangularizare a unui poligon P cu n vrfuri utilizeaz n 3 diagonale i const din
n 2 triunghiuri. Aceste teoreme se demonstreaz prin inducie. n Fig. 2.3 este
prezentat triangularizarea unui poligon convex cu opt laturi; se insereaz 8 3 = 5
diagonale nencruciate i rezult 8 2 = 6 triunghiuri.
Teorema triangularizrii, care asigur c orice poligon poate fi divizat n
triunghiuri, reprezint suportul celei mai eficiente metode de generare a imaginii
(redarea) obiectelor tridimensionale: obiectele se reprezint prin fee poligonale,
x
y
f
b
a
d
c
e
Fig. 2.2 Vizibilitate i diagonale n poligoane.
Punctele x i y sunt vizibile unul altuia.
Punctele c i d sunt invizibile unul altuia deoarece ef P.
Punctele a i b sunt complet vizibile unul altuia, deci ab este diagonal n P.
fiecare poligon se descompune n triunghiuri i triunghiurile sunt generate prin
algoritmi implementai hardware.
Din punct de vedere al reprezentrii n program a poligoanelor, cea mai
compact form este reprezentarea printr-o list liniar de vrfuri, fiecare vrf fiind
specificat printr-o structur (sau clas, n programarea orientat pe obiecte) care
memoreaz (cel puin) coordonatele vrfului. Alte date referitoare la vrfurile
poligoanelor necesare n modelarea i redarea obiectelor (normal, culoare,
coordonate de texturare, etc.) vor fi descrise n seciunile care urmeaz.
Este posibil reprezentarea unui poligon i prin lista segmentelor sale, dar
acest reprezentare necesit un volum mai mare de date i este folosit n
implementarea anumitor algoritmi de prelucrare a poligoanelor (reuniune, divizare,
etc.) i mai puin n reprezentarea modelului unui obiect. Lista liniar de vrfuri poate
fi implementat ca vector sau ca list simplu sau dublu nlnuit.
2.1.2Reprezentarea poliedrelor
n modelarea i reprezentarea prin suprafaa de frontier, obiectele sunt
aproximate prin poliedre i modelul lor este reprezentat prin suprafaa poliedrului,
compus dintr-o colecie de poligoane.
Un poliedru reprezint generalizarea n spaiul tridimensional a unui poligon
din planul bidimensional: poliedrul este o regiune finit a spaiului a crui suprafa de
frontier este compus dintr-un numr finit de fee poligonale plane. Suprafaa de
frontier a unui poliedru conine trei tipuri de elemente geometrice: vrfurile
(punctele) care sunt zero-dimensionale, muchiile (segmentele), care sunt
unidimensionale i feele (poligoane) care sunt bidimensionale (Fig. 2.4).
Suprafaa de frontier a unui poliedru este o colecie finit de fee poligonale
care se intersecteaz corect. Intersecia corect a feelor nseamn c pentru fiecare
pereche de fee ale obiectului, feele sunt disjuncte, au n comun un singur vrf, sau au
n comun dou vrfuri i muchia care le unete.
5
4
3
2
1
0
7
6
Fig. 2.3 Triangularizarea unui poligon convex.
Fee
poligonale
Muchii
Vrfuri
Fig. 2.4 Reprezentarea prin suprafaa de frontier a unui poliedru.
Din punct de vedere matematic, nu este imediat evident c un solid poate fi
reprezentat univoc prin suprafaa care l mrginete. De aceea, este necesar s fie
stabilite condiiile n care aceast reprezentare este permis. Aceste condiii, numite
condiii de construcie corect, se definesc pentru suprafee de frontier
triangularizate. Triangularizarea unei suprafee poliedrale se obine prin
triangularizarea fiecrei fee poligonale, astfel nct suprafaa rezultat const din
vrfuri care sunt nconjurate de triunghiuri, fiecare pereche de triunghiuri fiind
adiacente de-a lungul unei muchii. Laturile triunghiurilor adiacente unui vrf formeaz
un circuit de segmente, numit link-ul vrfului (Fig. 2.5).
O suprafa de frontier construit corect ndeplinete urmtoarele condiii:
Linkul fiecrui vrf al suprafeei triangularizate este complet, adic
formeaz un circuit nchis, nu neaprat planar.
Triunghiurile suprafeei triangularizate sunt orientate consistent.
nchiderea link-ului fiecrui vrf asigur proprietile suprafaei de a fi
nchis i conectat. Proprietate de nchidere nseamn c suprafaa nu are un sfrit.
Proprietatea de conectivitate nseamn c exist cel puin o cale de la un triunghi la
altul aparinnd aceleiai suprafee de frontier, care poate fi parcurs prin traversarea
muchiilor adiacente. Dac o suprafa nu este nchis sau nu este conectat, prin
triangularizarea suprafeei nu se obin link-uri nchise.
Proprietate de construcie corect a suprafeei de frontier a unui solid se
poate verifica folosind condiia de orientare consistent a suprafeei, formulat de
legea lui Moebius: O suprafa nchis este orientat consistent dac la traversarea
triunghiurilor sale (rezultate dintr-o triangularizare arbitrar), ntr-o direcie unic (de
exemplu, n direcia invers acelor de ceasornic), fiecare muchie este traversat de
dou ori, n direcii opuse (Fig. 2.6).
Generalizarea n spaiul tridimensional a teoremei lui Jordan spune c orice
suprafa de frontier nchis, consistent orientat, mparte spaiul n dou pri: o
Fig. 2.5 Triangularizarea suprafeei de frontier.
Link-ul unui vrf al suprafeei.
Link
parte interioar suprafeei, care este o regiune limitat, i o parte exterioar suprafeei,
care este o regiune nelimitat.
Din punct de vedere geometric, orientarea consistent se verific prin direcia
normalelor la feele obiectului: dac normalele feelor sunt ndreptate ctre aceeai
regiune a spaiului (fie toate ndreptate spre interior, fie toate ndreptate spre exterior),
atunci suprafaa are o orientare consistent. Acest mod de verificare se refer la
obiectele tridimensionale fr caviti, dar se poate extinde cu uurin i la obiecte
care prezint caviti.
Teoretic, orientarea consistent se verific pentru feele triangularizate ale
suprafeei de frontier, dar, prin extindere, se poate verifica orientarea consistent
folosind normalele la feele poligonale, deoarece toate triunghiurile obinute prin
triangularizarea unui poligon care reprezint o fa a unui obiect au aceeai orientare
(Fig. 2.7).
Orientarea consistent a feelor poligonale ale obiectelor este o condiie de
verificare a construciei corecte a suprafeei de frontier i, n acelai timp, este
folosit n operaiile de eliminare a suprafeelor ascunse n cursul redrii obiectelor
tridimensionale. De aceea, normalele la feele poligonale se memoreaz n modelul
obiectelor, mpreun cu coordonatele vrfurilor.
2.1.3Implementarea modelului poligonal
Fig. 2.6 Legea lui Mobius verific orientarea consistent a unei suprafee triangularizate.
Fig. 2.7 Orientarea consistent a feelor obiectului.
Reprezentarea prin reea de poligoane a obiectelor se implementeaz printr-o
list de poligoane, care poate fi un vector sau o list nlnuit. Astfel, ntreaga
informaie referitoare la forma unui obiect este compus din liste de coordonate ale
vrfurilor, la care se mai adaug i alte informaii geometrice necesare n redare (de
exemplu, normalele la suprafee).
Fr s se insiste acum asupra eficienei sau eleganei implementrii (se va
reveni ulterior), se poate considera c forma unui obiect modelat prin reea de
poligoane poate fi reprezentat ca un vector de fee, fiecare fa fiind un vector de
vrfuri, fiecare vrf fiind un vector de trei coordonate n virgul flotant. De exemplu,
un cub poate fi reprezentat astfel:
double CubeFaces[6][4][3] = {
{{-1,-1,-1}, // fata 0
{ 1,-1,-1},
{ 1,-1, 1},
{-1,-1, 1}},
{{-1, 1, 1}, // fata 1
{ 1, 1, 1},
{ 1, 1,-1},
{-1, 1,-1}},
{{-1,-1, 1}, // fata 2
{ 1,-1, 1},
{ 1, 1, 1},
{-1, 1, 1}},
{{ 1,-1,-1}, // fata 3
{-1,-1,-1},
{-1, 1,-1},
{ 1, 1,-1}},
{{ 1,-1, 1}, // fata 4
{ 1,-1,-1},
{ 1, 1,-1},
{ 1, 1, 1}},
{{-1,-1, 1}, // fata 5
{-1, 1, 1},
{-1, 1,-1},
{-1,-1,-1}}
};
O astfel de implementare este ns ineficient deoarece fiecare vrf este
prelucrat de trei ori, pentru fiecare fa adiacent acestuia. O implementare mult mai
eficient a modelului poligonal definete un vector cu toate vrfurile unui obiect, iar
fiecare fa se definete printr-un vector de indeci n vectorul de vrfuri. De exemplu,
modelul unui cub folosind indeci pentru definirea feelor arat astfel:
double CubeCoords[8][3]={
{-1,-1, 1},
{ 1,-1, 1},
{ 1,-1,-1},
{-1,-1,-1},
{-1, 1, 1},
{ 1, 1, 1},
{ 1, 1,-1},
{-1, 1,-1}
};
int CubeIndexFace[6][4]={
{3, 2, 1, 0},
{4, 5, 6, 7},
{0, 1, 5, 4},
{2, 3, 7, 6},
{1, 2, 6, 5},
{0, 4, 7, 3}
};
Att n cursul modelrii, ct i n cursul redrii imaginii, modelul obiectelor se
reprezint mai complex, coninnd i alte informaii geometrice i atribute de aspect.
Astfel, culoarea (mai general spus, materialul) este o informaie care se asigneaz
fiecrei fee sau fiecrui vrf al obiectului. n general, modelul poligonal cu
reprezentarea prin indeci a feelor poligonale este implementat orientat pe obiecte,
folosind mai multe clase (de baz i derivate) care permit ncapsularea tuturor
informaiilor necesare pentru redarea obiectelor.
O reea de poligoane poate s reprezinte fie suprafaa de frontier a unui solid,
fie o suprafa deschis, necesar n anumite situaii de modelare, cum este suprafaa
terenului simulat ntr-o scen virtual. Deoarece se modeleaz o zon geografic
limitat i nu se exploreaz scena astfel ca s fie vzut marginea pmntului, se
poate folosi o suprafa poligonal deschis pentru reprezentarea terenului.
Reprezentarea obinuit n grafica din scenele virtuale este aceea n care
fiecare poligon este reprezentat ca o suprafa (poligoane pline), dar n proiectrile
grafice (n mecanic, construcii, etc) se folosete i reprezentarea prin contur a
poligoanelor, numit reprezentare cadru de srm (wireframe) (Fig. 2.8).
Precizia de reprezentare a modelului, adic diferena dintre suprafaa
obiectului i feele poligonale prin care este aproximat, este un parametru important de
modelare. n general, cu ct numrul de poligoane prin care se aproximeaz suprafaa
obiectului este mai mare, cu att precizia de reprezentare este mai bun. Se observ
diferena dintre imaginea unui obiect (tor) reprezentat prin 64 de poligoane n Fig.
2.8(a) i prin 128 de poligoane n Fig. 2.8 (b).
Folosirea unui numr mare de poligoane pentru reprezentarea obiectelor
conduce la un volum imens de date n modelarea scenelor virtuale, care implic
cerine corespunztoare de memorare i de capacitate de calcul. Orict de mult ar
crete capacitatea de prelucrare n sistemele grafice, prin folosirea paralelismului i
(a) (b)
Fig. 2.8 Reprezentarea plin (filled) i cadru de srm (wireframe)
a obiectelor.
prin implementarea hardware a algoritmilor de prelucrare, performane de generare
interactiv n timp real a imaginilor se pot obine numai dac obiectele scenei se
modeleaz n mod corespunztor. Metodele de aproximare eficient a modelelor sunt
cunoscute sub numele de simplificarea (sau rafinarea) datelor.
Tehnica de simplificare direct, prin reducerea uniform a numrului de
poligoane de reprezentare a obiectului este inacceptbil, deoarece nu se poate controla
precizia de reprezentare. Pentru pstrarea unei precizii de reprezentare constant, se
folosete modelarea adaptiv, n care dimensiunea feelor poligonale variaz n funcie
de curbura suprafeei; n prile cu curbur pronunat sunt introduse mai multe
poligoane pe unitatea de suprafa.
O alt metod se simplificare a datelor este modelarea cu nivele de detaliu
multiple a obiectelor (levels of detail- LOD). Fiecare model al unui obiect este compus
dintr-o succesiune de reprezentri, fiecare cu o precizie diferit. n cursul generrii
imginilor, se selecteaz nivelul de detaliu corespunztor, n funcie de poziia
obiectului fa de punctul de observare. Cu ct obiectul este mai deprtat, se selecteaz
o reprezentare cu o precizie mai sczut a obiectului. Acest metod este posibil
datorit folosirii proieciei perspectiv n generarea imaginilor i va fi neleas mai
uor dup parcurgerea seciunii urmtoare privind transformrilor geometrice.
Modelul poligonal al unui obiect se poate genera prin mai multe metode, n
funcie de tipul obiectului i de aplicaia grafic n care este folosit modelul respectiv.
Se poate folosi una din urmtoarele metode de modelare poligonal:
Generarea modelului din descrierea matematic a obiectului.
Generarea modelului obiectului prin baleiere spaial.
Generarea modelului pornind de la o mulime de puncte care aparin
suprafeei de frontier a obiectului.
2.1.4Generarea modelului din descrierea
matematic
Se poate genera reeaua de poligoane de aproximare a obiectelor care au o
descriere matematic cunoscut. De exemplu, ecuaiile de definiie a unor suprafee
quadrice:
Elipsoid:
0 1 c z b y a x
2 2 2 2 2 2
+ + (2.1)
unde a, b c sunt semiaxele elipselor.
Hiperboloid:
0 1 c z b y a x
si 0 1 c z b y a x
2 2 2 2 2 2
2 2 2 2 2 2
+ +
+
(2.2)
Paraboloid eliptic:
z b y a x
2 2 2 2
+ (2.3)
Surprafaa se intersecteaz mai nti cu un numr n de plane perpendiculare
pe axa Oz, de ecuaii z = n z , pentru n = k, k+1, -1, 0, 1 , 2 ,k
1, k. Se obin n elipse (paralele) i pe fiecare elips se eantioneaz m puncte
echidistante (pe meridiane), obinndu-se (n 1) x m poligoane care aproximeaz
suprafaa de frontier a obiectului respectiv.
Aceste suprafee se pot obine i prin rotaia unei curbe n jurul unei axe de
coordonate. De exemplu, suprafaa elipsoidului se obine prin rotaia n jurul axei z a
elipsei:
0 1 c z b y a x
2 2 2 2 2 2
+ + (2.4)
0 = y
.
Prin rotaia unei curbe n jurul unei axe se pot obine obiecte tridimensionale
mai variate, n funcie de forma curbei care se rotete. De exemplu, un tor se obine
prin rotaia unui cerc n jurul unei axe paralele cu planul cercului. Suprafeele astfel
obinute se numesc suprafee de rotaie.
2.1.5Generarea modelului prin baleiere spaial
Se pot genera obiecte tridimensionale prin deplasarea (sweeping) unei
suprafee generatoare de-a lungul unei curbe oarecare. Dac se variaz forma i
orientarea suprafeei generatoare n cursul deplasrii, se pot obine obiecte variate, n
funcie de forma curbei i de orientarea, forma i variaia formei suprafeei
generatoare. Prin aceast metod se pot obine att formele regulate descrise mai sus
(elipsoid, hiperboloid, paraboloid eliptic, tor) ct i alte obiecte numite solide ductibile
sau extrudate (ducted solids) sau cilindri generalizai (generalized cylinders)
(Fig. 2.9).
Pentru definirea deplasrii unei suprafee de-a lungul unei curbe, este necesar
s se defineasc intervalul u al curbei pe care are loc deplasarea i modul n care se
divide intervalul parcurs. mprirea intervalului n distane egale nu d rezultate bune,
deoarece punctele obinute nu vor fi egal distribuite pe suprafaa obiectului. De aceea
Fig. 2.9 Obiect poligonal modelat prin deplasarea unui cerc de diametru variabil
de-a lungul unei linii drepte.
este necesar divizarea intervalului n funcie de curbura curbei. Dac curbura este
pronunat, se aleg subdiviziuni mai mici ale intervalului, iar pentru curburi mai
reduse se aleg subdiviziuni mai mari ale intervalului.
2.1.6Generarea modelului pornind de la o mulime
de puncte care aparin suprafeei
de frontier a obiectului
O metod mai general de modelare a obiectelor tridimensionale se bazeaz
pe cunoaterea unei mulimi de puncte distribuite uniform sau neuniform pe suprafaa
obiectului. Aceast metod implic mai nti obinerea coleciei de puncte, i apoi
construirea reelei de poligoane care s aproximeze obiectul cu precizia dorit. Dac
metodele prezentate mai nainte pot fi utilizate pentru o categorie restrns de obiecte,
n schimb, metoda generrii modelului pornind de la o mulime de puncte ale
suprafeei acestuia poate fi aplicat pentru cele mai variate obiecte: cldiri, vehicule,
plante, animale, elemente anatomice, teren, etc.
Mulimea de puncte de pe suprafaa obiectului se determin diferit, n funcie
de modul n care este cunoscut sau reprezentat obiectul real:
Pentru obiectele care se proiecteaz ntr-un sistem de proiectare bazat pe
calculator CAD (Computer Aided Design), informaiile de form
necesare n generearea modelului se pot obine din reprezentarea
proiectului. De exemplu, cldiri, obiecte mecanice, vehicule, pot fi
proiectate n AutoCad i coordonatele vrfurilor suprafeelor sunt folosite
pentru reprezentarea prin reea poligonal a obiectului.
Pentru obiectele real existente, sau machete ale acestora, se poate folosi
un scanner 3D cu laser. Obiectul real (sau macheta acestuia) este plasat pe
o mas rotativ n direcia de emisie a unei raze laser. La fiecare rotaie
complet a mesei se obine o colecie de puncte pe un contur al obiectului,
prin msurarea distanei la suprafaa obiectului. Dup fiecare rotaie, se
deplaseaz masa n sus sau n jos, astfel c se obine o colecie de
contururi ale obiectului. Toate aceste puncte de pe suprafaa obiectului
sunt apoi folosite pentru crearea modelului poligonal.
Pentru modelarea terenului se folosesc hri digitale care furnizeaz
altitudinile terenului ntr-o gril uniform de puncte, sau contururi de
nivel, care unesc puncte cu altitudine constant.
Fiind cunoscut o mulime de puncte V care caracterizeaz un obiect
tridimensional, volumul R
3
acoperit de aceste puncte se numete domeniul
mulimii V. este un poliedru, convex sau neconvex, iar punctele mulimii V pot fi
dispuse regulat sau neregulat n domeniul . Cazul cel mai frecvent ntlnit n
modelare este acela n care punctele mulimii V sunt distribuite neregulat n spaiu i
aproximarea obiectului se realizeaz printr-o reea tridimensional de poligoane ,
care aproximeaz linear pe poriuni obiectul dat. Reeaua trebuie s fie construit
pornind de la mulimea V de puncte n spaiu i de la cerinele de precizie de
aproximare a obiectului.
Construirea modelului poligonal al unui obiect cunoscut printr-o mulime de
puncte de pe suprafaa sa se poate realiza prin mai multe metode, dintre care cele mai
folosite sunt triangularizarea (triangulation) i transformata Wavelet.
2.1.7Redarea imaginii obiectelor poligonale
Aa cum s-a mai amintit, modelarea poligonal este cea mai folosit form de
modelare a obiectelor n grafica pe calculator, datorit simplitii reprezentrii
modelului poligonal i a faptului c, n momentul de fa, majoritatea acceleratoarelor
din sistemele grafice conin programe implementate hardware de redare eficient a
poligoanelor. Algoritmii de redare implementai n acceleratoarele grafice trateaz
separat fiecare poligon (primitiv geometric) reprezentat prin coordonatele vrfurilor
sale, ceea ce face ca procesul de redare a imaginii s fie foarte simplu. Redarea
imaginilor scenelor virtuale compuse din obiecte a cror reprezentare nsumeaz mii
de poligoane nu este ceva neobinuit.
Redarea obiectelor poligonale este implementat printr-o succesiune de
operaii de transformri grafice asupra obiectelor, numit pipeline grafic. Aceast
succesiune, care va fi descris pe larg n seciunea urmtoare, const din transformri
geometrice aplicate vrfurilor obiectelor, prin care se transform fiecare fa a
obiectului din sistemul de referin de modelare ntr-un sistem de referin de afiare,
urmat de transformarea de redare, prin care se obine culoare pixelilor care se
afieaz pe display. n Fig. 2.10 este redat imaginea avionului F-16 modelat prin
2366 fee poligonale i redat prin prelucrarea fiecrei fee, n modul cu fee pline i
umbrire i n modul wireframe.
Fig. 2.10 Redarea obiectelor modelate prin reea de fee poligonale.
Pentru toate celelalte modele de reprezentare a obiectelor (reprezentarea prin
reele de petice, prin compunerea obiectelor sau prin subdivizarea spaial), pe lng
redarea direct a modelului respectiv, exist i posibilitatea de redare prin deducerea
mai nti a reprezentrii poligonale corespunztoare, urmat de folosirea algoritmilor
de redare poligonal.
2.2Modelarea obiectelor prin reele de petice
Un petic (patch) este o suprafa curb definit parametric n spaiul
tridimensional. Prin reprezentarea parametric, punctele de pe suprafa se pot calcula
secvenial, pentru diferite valori ale parametrilor, mult mai simplu dect prin
rezolvarea sistemului de ecuaii care descriu implicit suprafaa. Reprezentarea
parametric a curbelor i a suprafeelor este folosit n proiectarea i n modelarea
obiectelor pentru obinerea unei precizii mai ridicate de aproximare.
Un segment de curb n spaiul tridimensional poate fi definit printr-un sistem
de ecuaii n funcie de un parametru:
z z
2
z
3
z
y y
2
y
3
y
x x
2
x
3
x
d + u c + u b + u a = ) u ( z
d + u c + u b + u a = ) u ( y
d + u c + u b + u a = ) u ( x
(2.5)
Aceasta este o curb cubic, definit ca form i mrime de cei 12 coeficieni,
numii coeficieni algebrici ai curbei. n notaie vectorial se poate scrie forma
parametric a unei curbe cubice:
D C B A Q + u + u + u = ) u (
2 3
(2.6)
unde vectorul Q are componentele (x, y, z), iar vectorii A, B, C, D au componentele
(a
x
, a
y
, a
z
), (b
x
, b
y
, b
z
), (c
x
, c
y
, c
z
), (d
x
, d
y
, d
z
), respectiv, iar u este cuprins n intervalul
nchis [0,1].
n aplicaiile grafice se utilizeaz n mod frecvent curbele cubice, deoarece ele
asigur suficient flexibilitate n definirea curbelor i pot fi prelucrate eficient.
Polinoame de grad mai mare pot descrie curbe mai complexe, dar necesit un numr
mai mare de coeficieni i sunt mai dificil de prelucrat eficient n reprezentrile
grafice. La modul general, o curb parametric cubic se poate defini prin ecuaiile:
) u ( ) u (
i
3
0 i
i
B P Q

(2.7)
unde Q este vectorul de componente (x, y, z), P
i
sunt punctele de control ale curbei,
fiecare vector P
i
avnd componentele (x
i
, y
i
, z
i
), iar B
i
sunt funciile de baz (sau de
amestec blending functions) ale reprezentrii parametrice.
Diferite funcii de baz au proprieti diferite n determinarea formei curbei
parametrice: ele pot interpola sau aproxima o curb dat, pot asigura anumite condiii
de continuitate a mai multor segmente de curb.
Specificarea unui segment de curb (sau a unui petic de suprafa curb) printr-un
set de puncte de control este o metod de baz n proiectarea grafic interactiv:
proiectantul definete punctele de control; curba este generat i vizualizat interactiv;
dac forma curbei nu este mulumitoare, proiectantul modific unul sau mai multe
puncte de control, pn obine rezultatul dorit.
Cele mai utilizate tipuri de curbe i suprafee parametrice n proiectarea grafic
sunt curbele (i suprafeele) Bzier i B-spline. n bibliotecile grafice exist funcii de
generare a curbelor i suprafeelor parametrice.
2.3Modelarea prin compunerea obiectelor
Modelarea prin compunerea obiectelor (Constructive Solid Geometry CSG)
se folosete atunci cnd un obiect poate fi obinut prin combinarea mai multor obiecte
elementare, numite primitive geometrice.
Primitivele geometrice utilizate sunt sfere, conuri, cilindri sau paralelipipede
dreptunghice i sunt combinate folosind operatori booleni i transformri liniare. Un
obiect complex este reprezentat printr-un arbore, ale crui frunze sunt primitivele
geometrice iar nodurile memoreaz operatori booleeni sau transformri liniare.
n Fig. 2.11 este prezentat operaia de reuniune a dou obiecte elementare.
Alte operaiile posibile care se pot efectua asupra primitivelor geometrice sunt
scderea i intersecia.
Fig. 2.12 arat reprezentarea CSG a unui obiect prin combinarea a trei obiecte
elementare: dou paralelilpipede dreptunghice i un cilindru. Arborele de reprezentare
are ca frunze primitivele geometrice, iar celelate noduri conin operatorii booleni.
Paralelipipedele sunt combinate folosind operaia de reunuine, iar o gaur este
practicat ntr-unul din paralelipipede prin scderea unui cilindru din ansamblul celor
dou paralelipipede.
Fig. 2.11 Operaia de reuniune a dou primitive geometrice.
+
=
Scadere
Cilindru
Bloc1
Reuniune
Bloc 2
Fig. 2.12 Arborele de construire a unui obiect din trei primitive geometrice.
Deoarece arborele de reprezentare memoreaz att operaiile boolene ct i
forma primitivelor geometrice, operaiile de modificare ale obiectului compus sunt
relativ simple. De exemplu, o gaur ntr-un obiect se modific prin modificarea
poziiei sau a dimensiunii primitivei geometrice folosite n operaia de scdere. O
astfel de modificare este mult mai dificil n reprezentarea prin suprafaa de frontier a
modelelor.
Redarea imaginii obiectelor CSG se poate face prin mai multe metode:
Redarea direct a obiectului n aplicaiile de ray-tracing.
Conversia la reprezentarea prin suprafaa de frontier (B-rep) pornind de
la modelul CSG i aplicarea procedurilor standard de redare a
poligoanelor.
Conversia la reprezentarea prin subdivizarea spaiului (n elemente numite
voxeli) i redarea volumului corespunztor
Tehnica ray-tracing genereaz imaginea obiectelor prin intersecia acestora cu
raze de proiecie i permite obinerea unor efecte deosebit de realiste n modelarea
reflexiei, transparenei i a umbrelor.
Un dezavantaj important al modelrii CSG este cela c nu orice fel de obiect
poate fi obinut prin combinarea unor primitive geometrice simple. De exemplu,
modelul unei statui (folosit n crearea muzeelor virtuale) sau modelul unui organ
anatomic (folosit n simulrile de intervenii chirurgicale) nu pot fi obinute prin
combinarea unor primitive geometrice simple.
2.4Modelarea prin divizarea spaial
n tehnica de divizare spaial, se atribuie fiecrei subdiviziuni a spaiului
tridimensional cte o etichet n funcie de obiectul care ocup acea subdiviziune.
n acest tehnic se consider spaiul tridimensional compus dintr-un numr
de m x n x k volume elementare (numite voxeli), i pentru fiecare voxel se memoreaz
eticheta (un numr de identificare) obiectului care ocup acel element. Reprezentarea
prin subdiviziunea spaiului este util n diferite aplicaii grafice, cum sunt imagistica
medical sau aplicaiile de ray tracing.
Implementarea direct, prin atribuirea unei etichete fiecrui element de volum
al spaiului, implic o mare redundan a datelor: toi voxelii interiori unui obiect
conin acceai informaie, eticheta obiectului. Acest lucru conduce la o cantitatate de
informaie foarte mare necesar pentru reprezentarea unui spaiu de obiecte i este, n
general, inacceptabil.
Pentru reducerea redundanei de reprezentare se folosete o tehnic de
reprezentare a ocuprii spaiale printr-un arbore numit arbore octal (octree). Arborele
octal este o structur ierarhic care specific ocuparea unei regiuni cubice din spaiul
tridimensional. Ideea de reprezentare a ocuprii spaiale poate fi exemplificat mai
uor ntr-un spaiu bidimensional prin intermediul unui arbore cuaternar (quadtree). n
Fig. 2.13(a) este prezentat ocuparea unei regiuni bidimensionale de trei obiecte, iar n
Fig. 2.14 este reprezentat arborele de ocupare a regiunii.
Arborele se creeaz pornind cu o regiune ptrat n plan, reprezentnd ntrega
zon care se modeleaz i care este reprezentat prin nodul rdcin al arborelui
cuaternar. n cazul spaiului tridimensional, acest regiune este un cub. Fiecare
regiune, ncepnd cu regiunea iniial, se subdivide n patru subregiuni, reprezentate
ca patru noduri fii n arbore. n Fig. 2.13(b) se arat ordinea de numerotare a nodurilor
fii obinui prin divizarea unei subregiuni.
e
e
e t e t t e t e e t e t
e
e e
e
e e e c e e c c e c e e c c e e
e
e
e
e d e d e d e d
d
d e
d
e
Etichete:
t: triunghi
d: dreptunghi
c: cerc
e: spaiu vid
(empty)
Fig. 2.13 (a) Ocuparea unei regiuni plane.
(b) Ordinea de numerotare a nodurilor fii.
3 4
2 1
1
4 3 2
(a)
(b)

n spaiul tridimensional o regiune este divizat n opt subregiuni, reprezentate
prin opt noduri fii; de aici provine i numele octree acestui mod de reprezentare.
Subregiunile sunt divizate recursiv pn se ntlnete una din urmtoarele
situaii:
Subregiunea este ocupat n ntregime de un singur obiect sau nu este
ocupat de nici un obiect. Unei astfel de regiuni i se atribuie eticheta cu
numele obiectului respectiv, sau eticheta de spaiu vid (e).
Subregiunea are dimensiunea minim admisibil n reprezentarea
respectiv (un pixel). n acest caz, subregiunea primete eticheta
obiectului (sau a spaiului vid) care ocup cea mai mare parte din
subregiunea respectiv.
n arborele de reprezentare a ocuprii spaiului tridimensional, dimensiunea
minim pn la care se divizeaz subregiunile este dimensiunea unui voxel. n
arborele de reprezentare sunt dou tipuri de noduri frunz: noduri care au o etichet a
unui obiect sau noduri care au eticheta spaiului vid. Compactarea volumului de date
n aceast reprezentare fa de reprezentarea prin etichetarea fiecrui element (pixel
sau voxel), provine din faptul c se poate ca o ntreag subregiune (mai mare dect un
voxel) primete o singur etichet, dac este nu este ocupat deloc sau este ocupat de
un singur obiect. n Fig 2.13 (a), regiunea 1 din prima subdivizune nu mai este
subdivizat mai departe deoarece este n ntregime vid i primete eticheta (e).
O variant de reprezentare a ocuprii spaiale prin arbori octali folosete ca
element spaial un tetraedru regulat, care este subdivizat n opt tetraedre, pn la
rezoluia dorit sau pn cnd este ocupat de un singur obiect din spaiu. Avantajul
folosirii arborilor octali bazai pe tetraedre este c se poate obine direct o reprezentare
echivalent a suprafeei triangularizate de aproximare a obiectului.
Redarea imaginii obiectelor modelate prin divizare spaial se face fie prin
conversie n reprezentarea prin suprafaa de frontier, fie direct, prin redare
volumetric, adic redarea tuturor elementelor de volum (voxeli).
Fig. 2.14 Arborele de reprezentare a ocuprii spaiale.
3
Transformri geometrice
n procesul de redare a obiectelor tridimensionale se definesc mai multe
sisteme de referin, care permit descrierea operaiilor de transformri succesive ale
obiectelor, pornind de la modelul acestora, pn la imaginea bidimensional pe
suportul de reprezentare.
Aceste sisteme de referin vor fi precizate pe parcursul expunerii; ceea ce
intereseaz n acest moment este faptul c n vizualizarea scenelor virtuale sunt
necesare (i folosite) mai multe sisteme de referin n care sunt reprezentate obiectele.
Modificarea unui obiect ntr-un sistem de referin dat, sau trecerea de la un sistem de
referin la altul se realizeaz prin diferite transformri grafice. Dintre transformrile
grafice folosite, unele modific forma i poziia obiectelor n spaiu, fiind numite
transformri geometrice, altele sunt transformri de conversie ntre diferite modaliti
de reprezentare a obiectelor (transformarea de rastru).
Transformri geometrice n spaiu
Obiectele scenei virtuale pot fi modificate sau manevrate n spaiul
tridimensional, folosind diferite transformri geometrice. Dintre acestea, cele mai
importante sunt translaia, care modific localizarea obiectului, rotaia, care modific
orientarea, i scalarea, care modific dimensiunea obiectului. Aceste transformri sunt
denumite transformri geometrice primitive.
3.1.1Transformri geometrice primitive
Translaia este transformarea prin care toate punctele se deplaseaz n aceeai
direcie i cu aceeai distan ntre punct i transformatul su. Translaia se poate
descrie printr-un vector de translaie T, avnd componentele z y x
t t t , ,
pe cele trei
axe de coordonate; un punct
) , , ( P z y x
se transform n punctul
) ' , ' , ' ( P' z y x
astfel:
z
y
x
t z ' z
t y ' y
t x ' x
+
+
+
n notaie matriceal, transformarea prin translaie cu vectorul de translaie T,
avnd componentele z y x
t t t , ,
pe cele trei axe de coordonate a unui punct
) , , ( P z y x

n punctul
) ' , ' , ' ( P' z y x
se exprim printr-o nsumare de matrice:
T + P = P' , unde
1
1
1
]
1

z
y
x
t
t
t
T
; deci:
.
t
t
t
z
y
x
' z
' y
' x
z
y
x
1
1
1
]
1

+
1
1
1
]
1

1
1
1
]
1


Scalarea modific coordonatele tuturor punctelor unui obiect folosind factorii
de scal s
x
, s
y
, respectiv s
z
pe cele trei axe de coordonate. n aceast transformare de
scalare, numit scalare fa de origine, un punct
) z , y , x ( P
se transform n punctul
) ' z , ' y , ' x ( P'
, unde:
z
y
x
s z ' z
s y ' y
s x ' x



Pentru scrierea sub form matriceal a acestor relaii de transformare, se
definete matricea de scalare S de dimensiune 3x3 astfel:
1
1
1
]
1

z
y
x
s 0 0
0 s 0
0 0 s
S
Rezult relaia de transformare de scalare n notaie matriceal:
, P S P'
adic
1
1
1
]
1

1
1
1
]
1

1
1
1
]
1

z
y
x
s 0 0
0 s 0
0 0 s
' z
' y
' x
z
y
x
Rotaia cu un unghi n raport cu o ax D este o transformare prin care orice
punct P care nu este situat pe dreapta d se transform ntr-un punct P astfel nct P i
P sunt situate ntr-un plan perpendicular pe dreapta D, unghiul PIPeste egal cu ,
iar modulele |IP| i |IP| sunt egale (punctul I este intersecia dintre dreapta D i planul
). Prin aceast transformare toate punctele dreptei d sunt fixe i numai ele sunt
puncte invariante ale transformrii. Transformarea de rotaie n raport cu o ax
oarecare se descompune o ntr-o succesiune de maximum trei transformri de rotaie
n raport cu axele de coordonate ale sistemului de referin.
Rotaia n raport cu axa z cu un unghi transform un punct
) z , y , x ( P
n
punctul
) ' z , ' y , ' x ( P'
, ambele aflate n planul peroendicular pe axa z. Pentru
deducerea relaiilor de transformare se exprim coordonatele punctelor P i P n acest
plan n coordonate polare (Fig. 3.1).

u sin y
u cos x




) u sin( ' y
) u cos( ' x
+
+
Se dezvolt cosinusul i sinusul sumei de unghiuri i se obin relaiile:
+ +

cos y sin x ) u cos sin cos u (sin ' y
sin y cos x ) sin u sin cos u (cos ' x
Aceast transformare se poate scrie sub form matriceal dac se definete
matricea de rotaie R
Z
() de dimensiune 3x3 astfel:
1
1
1
]
1




1 0 0
0 cos sin
0 sin cos
) (
Z
R
Rezult relaiile de transformare de rotaie a unui punct n raport cu axa z cu
un unghi scrise sub form matriceal:
P R P
Z
'
= ,
1
1
1
]
1

1
1
1
]
1

1
1
1
]
1

z
y
x
1 0 0
0 cos sin
0 sin cos
' z
' y
' x
Pentru rotaiile elementare ale unui punct n raport cu axele x i y ale
sistemului de referin se urmrete un raionament asemntor i se deduc relaiile de
transformare corespunztoare.
Rotaiile n raport cu axele de coordonate ale sistemului de referin sunt
denumite tangaj (pitch), giraie (yaw, heading) i, respectiv ruliu (roll). Aceast
asignare depinde de conveniile de definire a sistemului de referin universal. Pentru
Fig. 3.1 Transformarea de rotaie n raport cu axa z.
P
P
u
P

P
I

y
x
O
z
convenia definit mai sus, tangajul este o rotaie n raport cu axa x, giraia este o
rotaie n raport cu axa y, iar ruliul este o rotaie n raport cu axa z (Fig. 3.2).
Aceste denumiri au originea n modul n care sunt definite micrile unui
avion poziionat n spaiu cu axa longitudinal orientat ctre z pozitiv: tangajul este
rotaia ntr-un plan vertical, care nclin botul avionului; giraia este o micare ntr-un
plan orizontal, care schimb direcia axei avionului, iar ruliul este rotaia ntr-un plan
vertical, care nclin aripile avionului.
Semnul rotaiilor n raport cu axele de coordonate se alege, prin convenie,
dup regula minii drepte sau dup regula minii stngi. Dac se cuprinde axa
corespunztoare cu patru degete ale minii (drepte, respectiv, stngi) astfel ca degetul
mare s fie ndreptat n sensul pozitiv al axei, direcia celor patru degete indic sensul
pozitiv al rotaiei. n aceast lucrare se adopt regula minii drepte pentru sensul de
rotae n raport cu axele de coordonate (Fig. 3.2).
S-au obinut relaiile pentru transformrile spaiale elementare (primitive),
translaia, scalarea fa de originea sistemului de coordonate i rotaia n raport cu
axele sistemului de coordonate. Tratarea ntr-un mod unitar a acestor transformri se
poate face prin creterea dimensionalitii sistemului de coordonate Cartezian,
definindu-se un sistem de coordoonate cu 4 dimensinui, numit sistem de coordonate
omogene.
3.1.2Sistemul de coordonate omogene
Se observ c transformrile de scalare i de rotaie se reprezint prin nmuliri
de matrice, iar translaia se reprezint prin nsumare de matrice. Reprezentarea unitar
i combinarea transformrilor geometrice spaiale se poate face ntr-un sistem de
coordonate cu patru dimensiuni, numit sistem de coordonate omogene. n sistemul de
coordonate omogene, un punct
) z , y , x ( P
se reprezint ca
) w , Z , Y , X ( P
pentru orice
factor de scar w 0.
n general, un punct
) z , y , x ( P
n sistemul de coordonate Cartezian se
transform n sistemul de coordonate omogene prin alegerea 1 = w , deci are
coordonatele omogene
) 1 , z , y , x ( P
. Pentru transformarea invers, se calculeaz
coordonatele carteziene ale unui punct
) w , Z , Y , X ( P
reprezentat n sistemul de
coordonate omegene printr-o mprire cu factorul de scar w astfel:
x
z
y
Giraie
Tangaj
Ruliu
Fig. 3.2 Rotaiile n raport cu axele sistemului de referin.
w / Z z
w / Y y
w / X x

(3.1)
n coordonate omogene, dou puncte ) w , Z , Y , X ( P
1 1 1 1 1
i
) w , Y , Y , X ( P
2 2 2 2 2
sunt egale dac :
2 2 1 1 2 2 1 1 2 2 1 1
w / Z w / Z si w / Y w / Y , w / X w / X
n sistemul de coordonate omogene, toate matricele de transformri sunt de
dimensiune 4x4 i toate operaiile de transformri geometrice se pot exprima prin
produse de matrice.
Matricea de translaie n coordonate omogene se definete astfel:
1
1
1
1
]
1

1 0 0 0
t 1 0 0
t 0 1 0
t 0 0 1
) t , t , t (
z
y
x
z y x
T
(3.2)
Transformarea de translaie a unui punct
) w , Z , Y , X ( P
reprezentat n
coordonate omogene, n punctul
) ' w , ' Z , ' Y , ' X ( P'
se exprim ca un produs de
matrice:
P T P'
1
1
1
1
]
1

1
1
1
1
]
1

1
1
1
1
]
1

w
Z
Y
X
1 0 0 0
t 1 0 0
t 0 1 0
t 0 0 1
' w
' Z
' Y
' X
z
y
x
, rezult:

'

+
+
+
w ' w
wt Z ' Z
wt Y ' Y
wt X ' X
z
y
x
(3.3)
Teoretic, pentru a se obine coordonatele cartezine ale punctului transformat
P, trebuie s se execute operaia de mprire cu factorul de scar w pentru fiecare
coordonat:
' w / ' Z ' z
' w / ' Y ' y
' w / ' X ' x

Dar, dac se alege w =1, rezult w=1 i mprirea nu mai este necesar. n
general, transformrile geometrice primitive conserv valoarea factorului de scar i,
dac se alege w =1, mprirea cu w (numit mprirea omogen) nu este necesar .
Matricea de scalare fa de origine reprezentat n sistemul de coordonate
omogene are expresia:
1
1
1
1
]
1

1 0 0 0
0 s 0 0
0 0 s 0
0 0 0 s
) s , s , s (
z
y
x
z y x
S
(3.4)
Transformarea de scalare a unui punct reprezentat n coordonate omogene
) w , Z , Y , X ( P
, n punctul
) ' w , ' Z , ' Y , ' X ( P'
este dat de relaiile:
SP P'

1
1
1
1
]
1

1
1
1
1
]
1

1
1
1
1
]
1

w
Z
Y
X
1 0 0 0
0 s 0 0
0 0 s 0
0 0 0 s
' w
' Z
' Y
' X
z
y
x
, rezult:

'

w ' w
Z s ' Z
Y s ' Y
X s ' X
z
y
x
(3.5)
Dac factorii de scalare sunt egali ( z y x
s s s
), scalarea se numete
uniform, i pstrez forma obiectului. Dac factorii de scalare difer, obiectul este
deformat, iar scalarea se numete neuniform.
Transformrile de rotaie n raport cu axele sistemului de referin
exprimate n coordonate omogene sunt urmtoarele:
Rotaia n raport cu axa x (tangaj) cu un unghi :
1
1
1
1
]
1




1 0 0 0
0 cos sin 0
0 sin cos 0
0 0 0 1
) (
X
R
(3.6)
n aceast transformare, axa x rmne nemodificat, iar toate celelalte puncte
din spaiu se transform prin nmulire ca matricea R
X
():
P R P'
X

1
1
1
1
]
1

1
1
1
1
]
1

1
1
1
1
]
1

w
Z
Y
X
1 0 0 0
0 cos sin 0
0 sin cos 0
0 0 0 1
' w
' Z
' Y
' X
, rezult

'

w ' w
cos Z sin Y ' Z
sin Z cos Y ' Y
X ' X
(3.7)
Rotaia n raport cu axa y (giraie) cu un unghi :
1
1
1
1
]
1




1 0 0 0
0 cos 0 sin
0 0 1 0
0 sin 0 cos
) (
Y
R
(3.8)
n aceast transformare, axa y rmne nemodificat, iar toate celelalte puncte
din spaiu se transform prin nmulire ca matricea R
Y
():
P R P'
Y

1
1
1
1
]
1

1
1
1
1
]
1

1
1
1
1
]
1

w
Z
Y
X
1 0 0 0
0 cos 0 sin
0 0 1 0
0 sin 0 cos
' w
' Z
' Y
' X
, rezult:

'

+
w ' w
cos Z sin X ' Z
Y ' Y
sin Z cos X ' X
(3.9)
Rotaia n raport cu axa z (ruliu), cu un unghi :
1
1
1
1
]
1




1 0 0 0
0 1 0 0
0 0 cos sin
0 0 sin cos
) (
Z
R
(3.10)
n aceast transformare, axa z rmne nemodificat, iar toate celelalte puncte
din spaiu se transform prin nmulire ca matricea R
Z
():
P R P'
Z

1
1
1
1
]
1

1
1
1
1
]
1

1
1
1
1
]
1

w
Z
Y
X
1 0 0 0
0 1 0 0
0 0
0 0
w
Z
Y
X
cos sin
sin cos
'
'
'
'
, rezult:

'

+

w ' w
Z ' Z
cos Y sin X ' Y
sin Y - cos X ' X
(3.11)
Toate matricele de transformare de rotaie sunt matrice ortogonale i
ortonormate. Transformrile geometrice elementare sunt transformri liniare, prin care
liniile drepte i suprafeele plane sunt transformate n linii dreapte, respectiv suprafee
plane. Din aceast cauz, pentru transformarea unui obiect tridimensional, este
suficient s se transforme toate vrfurile acestuia i s se pstreze relaiile topologice
ntre vrfurile transformate, aceleai cu cele ntre vrfurile iniiale.
Transformrile mai complexe ale obiectelor n spaiu se pot defini prin
compunerea mai multor transformri primitive.
3.1.3Compunerea transformrilor geometrice
Compunerea mai multor tranformri elementare pentru obinerea unei
transformri complexe se obine prin executarea succesiv a produsului fiecriei
matrice de transformare cu matricea de reprezentare a punctului iniial sau rezultat
dintr-o transformare precedent. De exemplu, n Fig. 3.3 este prezentat o
transformare compus a unui obiect.
Obiectul iniial este un cub cu latura de dou uniti, amplasat cu centrul su
n centrul sistemului de referin i laturile orientate n direciile axelor de coordonate.
Dup o scalare cu factorii de scar 2, 2, 2, o rotaie cu un unghi de 30 grade n raport
cu axa z i o translaie cu un vector de translaie cu componente 8,0,0, se obine un
nou obiect cub, definit n acelai sistem de referin, dar cu alte dimensiuni i
localizare. Reprezentarea din Fig. 3.3 conine i o transformare de proiecie
perspectiv, pentru percepia adncimii (a distanei fa de observator a obiectelor),
care va fi explicat ulterior. Una din feele cubului (cea mai apropiat de observator)
este desenat ca suprafa de culoare gri; celelalte fee ale cubului sunt reprezentate
numai prin muchiile lor (reprezentare numit cadru de srm, wireframe).
Transformarea efectuat asupra cubului din figura de mai sus se obine prin
aplicarea succesiv a trei transformri geometrice elementare (scalare, rotaie i
translaie) asupra fiecrui punct (vrf) al cubului. Pentru un vrf al cubului, reprezentat
prin matricea coloan P, succesiunea de transformri este:
Scalarea: P S P
1

Rotaia n raport cu axa z: P
2
= R
Z
P
1
= R
Z
(S P)
Translaia:
2
P T P' = T(R
Z
(S P)) = (TR
Z
S) P
Fig. 3.3 Transformare compus a unui obiect:
scalare, rotaie fa de axa z, translaie.
P
P
Nu este necesar s fie executate pe rnd operaiile de nmulire cu matricele de
transformare S, R
Z
, i T, ci se poate calcula o matrice compus a transformrii M,
care se aplic apoi fiecrui punct P al obiectului:
P M P S R T P'
Z
, unde S R T = M
Z
O transformare compus se poate deci defini printr-o matrice de transformare
M care este un produs (compunere) de matrice de transformri geometrice elementare.
n exemplul dat, se calculeaz matricea de transformare M astfel:
1
1
1
1
]
1

1
1
1
1
]
1


1
1
1
1
]
1


1 0 0 0
0 2 0 0
0 0 2 0
0 0 0 2
1 0 0 0
0 1 0 0
0 0 866 . 0 5 . 0
0 0 5 . 0 866 . 0
1 0 0 0
0 1 0 0
0 0 1 0
8 0 0 1
S R T M
z
1
1
1
1
]
1

1 0 0 0
0 2 0 0
0 0 732 , 1 1
8 0 1 - 732 . 1
M
Unul din vrfurile cubului, vrful P(1,1,1,1) se transform n P(8.732,
3.732,1,1 ):
1
1
1
1
]
1

1
1
1
1
]
1

1
1
1
1
]
1



1
2
732 . 3
732 . 8
1
1
1
1
1 0 0 0
0 2 0 0
0 0 732 . 1 1
8 0 1 732 . 1
P M P'
Ordinea de compunere a matricelor de transformare este definitorie pentru
rezultatul transformrii, dat fiind c produsul matricelor nu este comutativ.
Se poate verifica pe exemplul dat, prin inversarea ordinii transformrii de
rotaie cu translaia (Fig. 3.4).
Fig. 3.4 Transformare compus a unui obiect:
scalare, translaie, rotaie fa de axa z.
P
P
Se obine o matrice de transformare Mdiferit de M i punctul transformat
corespunztor P, diferit de P:
1
1
1
1
]
1



1 0 0 0
0 2 0 0
330 . 4 0 732 . 1 1
928 . 6 0 1 732 . 1
S T R ' M'
z
,
1
1
1
1
]
1


1
2
06 . 7
560 . 7
P ' M' ' P'
Convenia de reprezentare a punctelor n spaiu prin matrice coloan impune
ordinea de nmulire numit postmultiplicare (sau multiplicare la dreapta) a matricelor
de transformare: se nmulete matricea de transformare curent cu matricea
transformrii urmtoare. Convenia de terminologie (postmultiplicare sau multiplicare
la dreapta) semnific faptul c o nou transformare se concateneaz ca factor dreapta
al produsului de matrice. Este important de reinut faptul c ordinea de aplicare a
transformrilor este de la dreapta la stnga din succesiunea de matrice ale unei
compuneri. Mai precis, dac un punct se transform prin aplicarea succesiv a
transformrilor definite prin matricele M
1
, M
2
,., M
n
, matricea compus de
transformare este:
1 2 n
M M M M (3.12)
Se poate verifica c, dac se adopt convenia de reprezentare a unui punct n
spaiul tridimensional printr-o matrice linie, atunci transformarea unui punct se obine
prin nmulirea vectorului de poziie al punctului cu matricea de transformare
(premultiplicare sau multiplicare la stnga). n aceast situaie, ordinea n care se
aplic matricele compunente ale unei transformri compuse este de la stnga la
dreapta:
n 2 1
S S S S PS P' unde , (3.13)
Punctul P este transformat n ordinea S
1
, S
2
,.S
n
. Acesta este un mod mai
natural de a urmri secvenele de transformri geometrice i de aceea, n unele lucrri
este adoptat aceast convenie. Nu exist alte diferene ntre cele dou convenii (nici
de simplificare a calculelor, nici de eficien).
Se poate demonstra cu uurin c orice matrice de transformare elementar n
convenia de reprezentare prin matrice linie a unui punct n spaiul tridimensional este
transpusa matricei corespunztoare de transformare definit n convenia de
reprezentare prin matrice coloan a punctului. De exemplu, translaia unui punct
P(x,z,y) cu valorile t
x
, t
y
, t
z
se exprim astfel:
[ ] [ ]
1
1
1
1
1
]
1

1 t t t
0 1 0 0
0 0 1 0
0 0 0 1
w Z Y X ' w ' Z ' Y ' X
z y x
n aceast lucrare se folosete convenia de reprezentare prin matrice coloan
a punctelor din spaiu, dat fiind c aceasta este convenia din biblioteca grafic
OpenGL, care este folosit pentru exemplificarea operaiilor grafice prezentate.
Un alt exemplu de transformare compus este transformarea de rotaie
complet specificat prin trei rotaii fa de axele sistemului de coordonate. Cea mai
obinuit convenie pentru ordinea de specificare a rotaiilor este: ruliu cu unghiul
(dup axa z), tangaj cu unghiul (dup axa x) i giraie cu unghiul (fa de axa y). n
aceast situaie matricea de rotaie total R are expresia:
1
1
1
1
]
1


1 0 0 0
0 r r r
0 r r r
0 r r r
) ( ) ( ) (
33 32 31
23 22 21
13 12 11
Z X Y
R R R = R
(3.14)
Matricea R rezultat prin compunerea (nmulirea) mai multor matrice de
rotaie este de asemenea ortogonal i ortonormat.
O transformare complex a unui obiect prin combinarea mai multor
transformri elementare (scalri, rotaii, translaii) se poate exprima printr-o matrice de
transformare M care are forma general:
1
1
1
1
]
1

1 0 0 0
t ' r ' r ' r
t ' r ' r ' r
t ' r ' r ' r
z 33 32 31
y 23 22 21
x 13 12 11
M
(3.15)
Submatricea stnga-sus R de dimensiune 3x3 exprim transformarea de
rotaie i scalare total, iar submatricea coloan dreapta T exprim transformarea de
translaie total. Matricea R este o matrice ortogonal, dar poate s nu fie i
ortonormat.
Dou proprieti importante ale transformrilor geometrice compuse trebuie s
fie remarcate i reinute.
Prima proprietate este c o transformare geometric compus reprezentat
printr-o matrice de forma 3.15 conserv valoarea coordonatei w a unui punct (acest
lucru este evident). Aceast proprietate este folosit n implementarea operaiilor
grafice, prin amnarea mpririi omogene (cu w) dup ce s-au selectat numai
obiectele vizibile (dup operaia de decupare).
A doua proprietate este proprietatea de liniaritate a transformrilor geometrice
compuse, prin care liniile drepte i suprafeele plane sunt transformate n linii dreapte,
respectiv suprafee plane. De aceea, la fel ca i n cazul transformrilor geometrice
elementare, pentru transformarea unui obiect tridimensional, este suficient s se
transforme toate vrfurile acestuia i s se pstreze relaiile topologice ntre vrfurile
transformate.
3.1.4Transformri inverse
Fiind dat o transformare a unui punct P ntr-un punct P definit printr-o
matrice de transformare M, transformarea invers, de la punctul P la punctul P se
obine prin nmulirea cu matricea invers, M
-1
:
1
1
1
1
]
1

1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
I I, MM
1
, (3.16)
unde I este matricea identitate.
Dat fiind c, n general, matricea de transformare M se obine printr-un produs
de matrice de transformri elementare, matricea invers M
1
se calculeaz prin
produsul n ordine invers a inverselor matricelor elementare componente:
I M M M M M M = MM
M M M = M
M M M = M
1
n
1
2
1
1 1 2 n
1
1 -
n
1 -
2
1 -
1
1 -
1 2 n

- - -

(3.17)
Relaia 3.17 se demonstreaz imediat, prin gruparea factorilor ncepnd cu
I M M
-1
1 1
= .
Toate matricele de transformri elementare sunt matrice inversabile i au
urmtoarele expresii:
1
1
1
1
]
1

1 0 0 0
t 1 0 0
t 0 1 0
t 0 0 1
) t , t , t ( )] t , t , t ( [
z
y
x
z y x
1
z y x
T T
(3.18)
1
1
1
1
]
1

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





1 0 0 0
0 cos sin 0
0 sin cos 0
0 0 0 1
) ( )] ( [
1
x x
R R
(3.20)
1
1
1
1
]
1





1 0 0 0
0 cos 0 sin
0 0 1 0
0 sin 0 cos
) ( )] ( [
1
y y
R R
(3.21)
1
1
1
1
]
1





1 0 0 0
0 1 0 0
0 0 cos sin
0 0 sin cos
) ( )] ( [
1
z z
R R
(3.22)
) ( ) ( ) ( )] ( ) ( ) ( [
1 1


y x z z x y
R R R R R R = R (3.23)
Datorit faptului c matricea de rotaie este ortogonal i ortonormat, inversa
unei matrice de rotaieeste egal cu transpusa acesteia.
3.1.5Transformarea sistemelor de referin
Interpretarea relaiilor de transformri geometrice prezentate pn acum a fost
aceea de manevrare i modificare a obiectelor ntr-un sistem de referin dat: obiectele
sunt reprezentate ntr-un anumit sistem de referin prin coordonatele unei mulimi de
puncte ale acestora (vrfuri) i ele pot fi deplasate, reorientate sau redimensionate prin
aplicarea transformrilor geometrice corespunztoare.
O alt interpretare care se poate da operaiilor de transformri geometrice este
aceea de schimbare a sistemului de referin.
Se consider sistemul de referin Oxyz i un nou sistem de referin Oxyz,
a crui origine O este determinat n sistemul Oxyz prin coordonatele x
0
,y
0
,z
0
ale
centrului O. Sistemul de referin Oxyz este definit de versorii (vectori unitate) i, j, k,
iar sistemul de referin Oxyz de versorii i, j, k.
Axa Ox are cosinuii directori c
11
, c
12
, c
13
fa de sistemul de referin Oxyz;
axa Oy are cosinuii directori c
21
, c
22
, c
23
fa de sistemul de referin Oxyz; axa Oz
are cosinuii directori c
31
, c
32
, c
33
fa de sistemul de referin Oxyz.
Matricea de transformare care descrie poziionarea sistemului Oxyz relativ
la sistemul de referin Oxyz este:
1
1
1
1
]
1

1 0 0 0
z c c c
y c r c
x c c c
0 33 23 13
0 32 22 12
0 31 21 11
M
(3.24)
Fie un punct P definit prin coordonatele sale x,y,z n sistemul de referin
Oxyz. Se demonstrez [Drag57], [Sab81], c n sistemul de referin Oxyz acest
punct (notat P) are coordonatele x,y,z, care se obin nmulirea matricei
-1
M (care
este inversa matricei M care definete poziionarea sistemului Oxyz n sistemul
Oxyz) cu matricea P de reprezentare a punctului P n sistemul de coordonate iniial:
P M = P'
-1
(3.25)
Transformarea invers, a unui punct P(x,y,z) din sistemul de referin
Oxyz n punctul P(x,y,z) n sistemul de referin Oxyz se obine prin nmulire cu
matricea de transformare M:
MP' = P (3.26)
Se poate urmri cu mai mult uurin aceast modalitate de transformare ntr-
un caz simplu. Se consider un sistem de referin Oxyz i un alt sistem de referin
Oxyz care are originea O(x
0
,y
0
,z
0
) i aceeai orientare a axelor de coordonate ca i
sistemul Oxyz.
Poziionarea sistemului de referin Oxyz relativ la sistemul Oxyz este
definit de matricea de transformare M; poziionarea sistemului de referin Oxyz
relativ la sistemul Oxyz este definit de matricea de transformare invers
-1
M :
1
1
1
1
]
1

1 0 0 0
z 1 0 0
y 0 1 0
x 0 0 1
0
0
0
M
,
1
1
1
1
]
1

1 0 0 0
z 1 0 0
y 0 1 0
x 0 0 1
0
0
0
-1
M
Submatricea de rotaie component a matricei M este matricea unitate, dat
fiind c sistemul de referin Oxyz are axele cu aceeai orientare ca i sistemul de
referin. ntr-adevr, cosinuii directori ai axelor Ox,Oy,Oz fa de axele
sistemului de referin Oxyz sunt (1,0,0), (0,1,0), (0,0,1) i matricea de rotaie este
matricea unitate.
Un punct oarecare P(x,y,z) n sistemul de referin Oxyz, se transform n
punctul P(x,y,z) n sistemul de referin Oxyz printr-o translaie cu x
0
,y
0
,z
0
,
deci :
1
1
1
1
]
1

1
1
1
1
]
1

1
1
1
1
]
1


1
z
y
x
1 0 0 0
z 1 0 0
y 0 1 0
x 0 0 1
1
' z
' y
' x
;
0
0
0
P M P'
1
Particularizarea pentru O(4,2,0) i P(6,3,0) este reprezentat n Fig. 3.5.
Punctul P(2,1,0) este transformatul punctului P n sistemul de referin O'x'y'z'.
x
y
z
O
x'
y'
z'
O'
P(6,3,0)
P'(2,1,0)
n concluzie, aplicarea unei transformri definit printr-o matrice M, asupra
unei mulimi de puncte definite ntr-un sistem de referin Oxyz, poate fi interpretat
n mai multe moduri:
(a) Fiecare punct este modificat i capt o nou poziionare n sistemul de
referin Oxyz, conform cu matricea de transformare M.
(b) Fiecare punct este transformat din sistemul de referin iniial Oxyz ntr-
un nou sistem de referin, Oxyz, a crui poziie i orientare relativ la
sistemul de referin Oxyz este descris de matricea M
-1
.
(c) Fiecare punct este transformat din sistemul de referin iniial Oxyz ntr-
un nou sistem de referin, Oxyz. Poziia i orientarea sistemului Oxyz
relativ la sistemul de referin Oxyz este descris de matricea M.
i nc o precizare: un sistem de referin nu este materializat n nici un fel
ntr-un sistem grafic (n software sau hardware), ci este o convenie cunoscut de
programator sau utilizator. Trecerea de la un sistem de referin la altul se efectueaz
prin transformri aplicate punctelor (obiectelor): modificarea coordonatelor acestora le
transfer dintr-un sistem de referin n altul. n acest sens, orice transformare
geometric poate fi considerat ca o schimbare a sistemului de referin. Dar, dup
cum se va observa n continuare, transformrile geometrice sunt uneori considerate ca
modificri ale obiectelor, iar n alte situaii, ca schimbare a sistemului de referin.
Este normal ca un nceptor n practica programrii sistemelor grafice s pun o
justificat ntrebare: cum se poate ti care este interpretarea corect a unei
transformri? Rspunsul este c ambele interpretri sunt corecte, dar se alege aceea
care permite urmrirea cea mai direct a unui raionament pentru calculul unor
transformri complexe. Nu exist reete unice i sigure care s poat fi aplicate fr
greeal n orice situaie, deci experiena de proiectare i spune ntotdeauna cuvntul.
n dezvoltarea sistemelor de vizualizare se folosesc, totui, cteva sisteme de
referin bine definite, care permit specificarea cea mai simpl i eficient a operaiilor
de redare a obiectelor (scenelor). Unul dintre acestea, sistemul de referin universal, a
fost deja introdus. Alte sisteme de referin folosite n grafica tridimensional vor fi
definite pe parcursul lucrrii.
Sistemele de referin intermediare, care apar n descrierea unor transformri
complexe, sunt interpretri ale operaiilor de transformri geometrice care permit
urmrirea unui raionament de calcul. Exemplul urmtor evideniaz acest aspect.
Exemplul 3.2
Se consider sistemul de coordonate Oxyz i o matrice de transformare R
X
(
/2) care realizeaz o rotaie cu unghiul /2 n raport cu axa x:
Fig.3.5 Transformarea sistemelor de referin.
1
1
1
1
]
1


1 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1
) 2 / (
X
R
Aceast transformare poate fi interpretat ca o transformare prin rotaie cu 90
n raport cu axa x a fiecrui punct P(x,y,z), n punctul transformat P(x,y,z). n
Fig.3.6 (a) este considerat punctul P(0,1,1), care se transform n punctul P(0,-1,1).
n Fig. 3.6(b) este reprezentat transformarea echivalent a sistemului de
coordonate Oxyz n sistemul de coordonate Oxyz folosind matricea de
transformare invers corespunztoare, R
X
(-/2): axa y se transform n axa z, iar axa
z se transform n axa y. Punctul P, de coordonate 0,1,1 n sistemul Oxyz, se
transform n punctul P de coordonate 0,-1,1 n sistemul Oxyz.
Se pot verifica uor rotaiile cu un unghi de /2 n raport cu celelalte axe de
coordonate. Rotaia cu /2 fa de axa y transform sistemul de coordonate ntr-un
sistem n care axa z se schimb n axa x, iar axa x se schimb n axa z. Rotaia cu /2
fa de axa z transform sistemul de coordonate ntr-un sistem n care axa x se
schimb n axa y, iar axa y se transform n axa x.
Pentru deducerea matricelor unor transformri complexe se procedeaz prin
reducerea acestora la cazuri mai simple, pentru care se cunosc expresiile de calcul,
folosind transformri primitive succesive. Iniial se aplic o transformare ajuttoare
pentru aducerea obiectelor ntr-o poziie sau sistem de referin adecvat, se execut
transformarea dorit, dup care se revine la poziia sau sistemul de referin iniial prin
transformarea invers celei aplicate iniial.
Cteva exemple prezentate n continuare vor preciza acest mod de realizare a
transformrilor geometrice compuse.
Fig. 3.6 Rotaie cu /2 n raport cu axa x.
(a) Rotaia punctelor cu /2. (b) Rotaia sistemului de coordonate cu -/2.
y
x
O
z
P(0,1,1)
x O
y
P(0,-1,1)
z
(b)
x
O
z
y
(a)
P(0,1,1)
P(0,-1,1)
3.1.5.1 Rotaia fa de o ax paralel cu una din axele
sistemului de referin
Un exemplu ilustrativ de compunere a transformrilor geometrice este
calculul rotaiei n raport cu o ax paralel cu una din axele sistemului de referin.
Se consider o dreapt d paralel cu axa z a sistemului, care intersecteaz
planul Oxy n punctul I(t
x
,t
y
,0). Transformarea de rotaie a obiectelor fa de aceast
ax nu poate fi realizat folosind matricea dedus n paragraful precedent (relaia
3.10), care presupune rotaia fa de o ax a sistemului de coordonate.
De aceea, se aplic mai nti tuturor punctelor o transformare ajuttoare,
translaia cu T( t
x
, t
y
,0).Acest transformare poate fi intrepretat n dou moduri: ca
o schimbare a sistemului de referin Oxyz n sistemul Oxyz , n care punctul I este
transformat n punctul I(0,0,0), sau ca o modificare a poziiei tuturor punctelor din
spaiu, prin care punctul I este adus n originea sistemului de referin Oxyz.
Dac se consider prima interpretare, operaiile se continu n noul sistem de
referin Oxyz, n care dreapta d se suprapune peste axa z, deci se poate obine
rotaia dorit cu un unghi folosind matricea de rotaie 3.10. Dup aceasta, se revine
la sistemul de referin iniial Oxyz, printr-o transformare invers, T(t
x
, t
y
, 0).
Rezult matricea compus de rotaie cu unghiul fa de o dreapt paralel cu
axa z care interecteaz planul Oxy n punctul I(t
x
, t
y
,0):
) 0 , t , t ( ) ( ) 0 , t , t (
y x y x
T R T R
Z d
1
1
1
1
]
1

1
1
1
1
]
1



1
1
1
1
]
1

1 0 0 0
0 1 0 0
t 0 1 0
t 0 0 1
1 0 0 0
0 1 0 0
0 0 cos sin
0 0 sin cos
1 0 0 0
0 1 0 0
t 0 1 0
t 0 0 1
y
x
y
x
d
R
1
1
1
1
]
1

1 0 0 0
0 1 0 0
sin t ) cos 1 ( t 0 cos sin
sin t ) cos 1 ( t 0 sin cos
x y
y x
d
R
(3.27)
Acest proces este descris n Fig. 3.7 (a) pentru un unghi de 30 grade, cu
reprezentarea unei proiecii n planul Oxy.
(a)
x
y
O
t
x
t
y
I
y
O
I
O
x
y
x
x
y
O
O
y
x
y
O
I
x
) , , ( 0 t t
y x
T ) (
z
R ) , , ( 0 t t
y x
T
n Fig. 3.7 (b) se prezint aceleai transformri succesive necesare pentru
realizarea rotaiei n raport cu o dreapt paralel cu axa z a sistemului, considernd c
transformarea iniial T(-t
x
,-t
y
,0) transform toate punctele din sistemul de referin
Oxyz, astfel nct punctul I se suprapune peste originea O. Se remarc faptul c, n
aceast situaie, este doar o diferen de interpretare, operaiile i rezultatul acestora
fiind identic.
3.1.5.2 Scalarea fa de un punct oarecare n spaiu
Matricea de scalare din relaia 3.4 efectueaz scalarea fa de originea
sistemului de coordonate, prin care componentele x, y, z ale vectorului de poziie OP
al punctului P sunt multiplicate fiecare cu factorul de scalare corespunztor. Se poate
defini o scalare fa de un punct fix ) z , y , x ( F
f f f
din spaiu, prin care componentele
vectorului FP sunt multiplicate cu factorii de scalare corespunztori.
Matricea de scalare fa de un punct oarecare se poate deduce printr-o metod
asemntoare celei prezentate anterior, prin compunerea a trei transformri elementare
deja definite.
1. Se execut o translaie cu ) z , y , x (
f f f
T , prin care punctul fix F se
suprapune peste originea sistemului de coordonate.
2. Se aplic o transformare de scalare cu matricea
) s , s , s (
z y x
S
.
3. Se efectueaz o translaie invers celei aplicate la punctul 1, deci cu
matricea ) z , y , x (
f f f
T .
Rezult matricea de scalare cu factorii de scar z y x
s , s , s
fa de un punct fix
din spaiu ) z , y , x ( F
f f f
:
x
y
O
t
x
t
y
I
y
O
I
x x
y
I
O
y
O
I
x
) , , ( 0 t t
y x
T
) (
Z
R
) , , ( 0 t t
y x
T
(b)
Fig. 3.7 Rotaia fa de o dreapt paralel ca axa z a sistemului de referin: (a)
considernd transformarea sistemelor de referin;
(b) considernd transformarea punctelor.
) z , y , x ( ) s , s , s ( ) z , y , x (
f f f z y x f f f
T S T S
F
1
1
1
1
]
1

1
1
1
1
]
1

1
1
1
1
]
1

1 0 0 0
z 1 0 0
y 0 1 0
x 0 0 1
1 0 0 0
0 s 0 0
0 0 s 0
0 0 0 s
1 0 0 0
z 1 0 0
y 0 1 0
x 0 0 1
f
f
f
z
y
x
f
f
f
F
S
1
1
1
1
]
1

1 0 0 0
) s 1 ( z s 0 0
) s 1 ( y 0 s 0
) s 1 ( x 0 0 s
z f z
y f y
x f x
F
S
(3.28)
3.1.5.3 Rotaia fa de o dreapt oarecare n spaiu
Urmrind un raionament asemntor cu cele anterioare, se poate deduce
matricea de rotaie cu un unghi fat de o dreapt oarecare D din spaiu, dat printr-un
punct D
0
(x
0
,y
0
,z
0
) i vectorul unitate (versorul) d, avnd cosinuii directori d
x
,d
y
,d
z
(
k j i d
z y x
d + d + d =
). Paii de transformare sunt urmtorii:
1. Translaia cu matricea T(-x
0
,-y
0
,-z
0
), prin care punctul D
0
ajunge n
originea sistemului de referin.
2. Alinierea dreptei D cu una din axele sistemului de referin, de exemplu,
axa z . Alinierea cu una din axele de coordonate ale sistemului se
efectueaz prin dou rotaii n raport cu celelalte dou axe.
Mai nti se efectueaz o rotae n raport cu axa x, cu un unghi , astfel ca dreapta
D s ajung n planul Oxz. Pentru calculul unghiului se consider notaiile din Fig.
3.8 (b).
OM este versorul dreptei D dup translaia efectuat n pasul precedent. M
x
, M
y
,
M
z
sunt interseciile planelor paralele cu planele sistemului de coordonate care trec
prin punctul M, cu axele corespunztoare (M
x
este intersecia planului paralel cu
planul Oyz care trece prin M, cu axa x, etc.). M
xy
, M
yz
, M
zx
sunt proieciile punctului
M pe planele O
xy
, O
yz
i, respectiv, O
zx
. Se pot scrie urmtoarele relaii:
z z y y x x
d = OM ; d = OM ; d = OM
2
z
2
y yz x
d + d = d = MM
2
z
2
y y yz y
2
z
2
y z yz z
d + d d = d / d = sin ; d + d d = d / d = cos (3.29)
Rotaia n raport cu axa x se efectueaz n planul MM
xy
M
zx
. Punctul M, rotit cu
unghiul n planul MM
xy
M
zx
, se transform n punctul M aflat n planul O
zx
, pe
dreapta M
x
M
zx
paralel cu axa Oz, astfel c MM
x
= MM
x
= d
yz
.
A doua etap pentru alinierea versorului OM al dreptei D cu axa z este o
rotaie cu unghiul , efectuat n planul Ozx, n raport cu axa y. Pentru calculul
unghiului se urmresc notaiile din Fig. 3.8 (c). n triunghiul dreptunghic OMM
x
(unghiul drept n M
x
) OM
x
= d
x
, OM= 1, M
x
M= d
yz
. Rezult unghiul OMM
x
(notat
unghiul ):
x
2
z
2
y yz
d = sin ; d + d = d = cos (3.30)

Rotaia dreptei OM n planul Ozx fa de axa Oy transform punctul M n
punctul M pe axa Oz printr-o rotaie cu unghiul de valoare n sens invers sensului
pozitiv de rotaie dup axa y (a se revedea Fig. 3.3) Aceast transformare de aliniere a
dreptei D cu axa z se exprim matriceal astfel:
) ( ) (
X Y Z
R R A
3. n acest pas se execut rotaia dorit, cu unghiul n raport cu dreapta D,
care este aliniat cu axa z a sistemului, deci se poate scrie:
1
1
1
1
]
1




1 0 0 0
0 1 0 0
0 cos sin 0
0 sin cos 1
) (
Z
R
4. n pasul al patrulea se execut transformarea invers celei de la pasul 2,
deci cu o matrice ) ( ) (

Y X
1
Z
R R A .
5. n ultimul pas se execut transformarea de translaie invers, cu matricea
) z , y , x (
0 0 0
T .
Rezult matricea compus de rotaie fa de dreapta D cu unghiul :
) z , y , x ( ) ( ) ( ) ( ) ( ) ( ) z , y , x (
0 0 0 0 0 0
T R R R R R T R
X Y Z Y X D
(3.31)
Valorile unghiurilor i rezult din cosinuii directori ai axei de rotaie D i
au valorile date de relaiile 3.29 i 3.30.
Fig. 3.8 Alinierea dreptei D cu axa z.
y
x
O
z
M
y
x
z
M
d
y
d
z
M
xy
M
zx
M
yz
M
z
M
x
M
y
d
yz
M
O
y
x
z
M
d
x
M
xy
M
x
d
yz
M
O
d
yz
-
M
(a)
(c)
(b)

M
z
M
yz
M
y
M
zx
3.1.5.4 Transformarea de modelare
O scen virtual este compus dintr-un numr oarecare de obiecte
tridimensionale amplasate n diferite poziii n scen. Tehnica de modelare a scenelor
de dimensiuni mari (ca numr de obiecte sau ca volum ocupat de scen) se bazeaz pe
amplasarea modelelor obiectelor tridimensionale n sistemul de referin universal al
scenei virtuale.
Fiecare obiect este modelat ntr-un sistem de referin local, prin alegerea
celei mai convenabile origini i orientri a axelor de coordonate ale acestuia. De
exemplu, un cub se modeleaz cel mai convenabil ntr-un sistem de referin ales cu
centrul n centrul cubului i cu axele orientate paralel cu laturile cubului. Dac se
presupune c latura cubului este egal cu 2 uniti, 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 referin local, poate fi instaniat
(introdus) n scena virtual printr-o transformare numit transformare de modelare
(sau transformare de instaniere). Mai mult, reprezentarea ierarhic a scenelor virtuale
prin grafuri aciclice direcionate, permite instanierea de un numr oarecare de ori a
fiecrui model, folosind matrice de transformare corespunztoare. Acesta este modul
cel mai frecvent de modelare a scenelor virtuale, care are suport n formatele i
limbajele de descriere a scenelor virtuale, cum este limbajul VRML.
n modelarea ierarhic a scenelor virtuale, operaia de baz este transformarea
de modelare, prin care toate punctele unui obiect (model tridimensional) sunt
transformate din sistemul de referin local ntr-un alt sistem de referin, care poate fi
sistemul de referin universal sau un alt sistem intermediar. Pentru nceput se
consider cea mai simpl transformare de modelare, dintr-un sistem de referin local
n sistemul de referin universal.
n mod obinuit, prima transformare care se aplic modelului este
transformarea de scalare cu o matrice de scalare S(s
x
,s
y
,s
z
), executat n sistemul de
referin local (fa de originea acestuia), prin care obiectul este adus la dimensiunile
dorite ale instanei respective.
Poziia unei instane a obiectului n scen se definete printr-o matrice de
transformare care conine submatricea de rotaie R, care definete orientarea
sistemului de referin local Oxyz fa de sistemul de referin universal Oxyz (al
scenei virtuale) i submatricea de translaie T, care definete poziia originii
O(x
0
,y
0
,z
0
) a sistemului de referin local n sistemul universal. Submatricea de rotaie
R poate fi specificat fie prin cosinuii directori (c
11
, c
12
, c
13
), (c
21
, c
22
, c
23
), (c
31
, c
32
, c
33
)
ai axelor sistemului local fa de sistemul de referin universal, fie printr-o succesiune
de rotaii fa de axele de coordonate ale sistemului de referin local:
1
1
1
1
]
1

1 0 0 0
0 c c c
0 c r c
0 c c c
33 23 13
32 22 12
31 21 11
R
sau ) ( ) ( ) (
Z X Y
R R R = R
Rezult matricea de transformare de modelare (instaniere):
) s s , s ( ) z , y , x (
z , y x 0 0 0
S R T M
I

(3.32)
Un punct P al obiectului n sistemul de referin model este transformat n
punctul P
I
n sistemul de referin universal prin instanierea:
P M P
I I
=
(3.33)
Exemplul urmtor ilustreaz crearea unei scene virtuale simple prin
transformri de instaniere.
Exemplul 3.3
Se consider un cub ca latura de dimensiune 2, modelat ntr-un sistem de
referin local ales cu centrul n centrul cubului i cu axele orientate paralel cu laturile
cubului i se construiete o scen virtual (n sistemul de referin universal) n care se
instaniaz patru obiecte pornind de la modelul cub.
Prima instaniere este chiar cubul din sistemul de referin model, deci
sistemul de referin model are acelai centru i aceeai orientare a axelor ca i
sistemul de referin universal; deci C
1
(0,0,0).
A doua instaniere este un cub cu latura de 4 uniti, cu orientarea sistemului
de referin local cu axele de coordonate paralele cu axele sistemului de referin al
scenei, amplasat cu centrul n punctul C
2
(0,-8,0).
A treia instaniere este un paralelipiped dreptunghic, cu laturile de dimensiuni
4,2,4, amplasat cu centrul n poziia C
3
(8,0,0). Sistemul de referin local are axa z
paralel cu axa z a sistemului universal, iar axele x i y sunt rotite cu un unghi de /4
fa de axa x i, respectiv, y a sistemului universal.
A patra instaniere este un paralelipiped dreptunghic, cu laturile de dimensiuni
4,2,4, amplasat cu centrul n poziia C
4
(-8,0,0). Sistemul de referin local are axa z
paralel cu axa z a sistemului universal, iar axele x i y sunt rotite cu un unghi de
-/4 fa de axa x i, respectiv, y a sistemului universal.
Pentru crearea scenei se calculeaz pe rnd cele trei matrice de instaniere.
Matricea de instaniere M
1
este chiar matricea identitate: M
1
= I.
Pentru calculul matricei de instaniere M
2
, se deduc n mod foarte simplu
matricele S
2
=S(2,2,2), R
2
=I, i T
2
=T(0,-8,0), deci: ) 2 , 2 , 2 ( ) 0 , 8 , 0 ( S T M
2
.
Pentru calculul matricei de instaniere M
3
, se poate scrie S
3
=S(2,1,2),
R
3
=R
Z
(/4), T
3
=T(8,0,0), deci: ) 2 , 1 , 2 ( ) 4 / ( ) 0 , 0 , 8 ( S R T M
Z 3
.
Pemtru calculul matricei de instaniere M
4
, se poate scrie: S
4
=S(2,1,2),
R
4
=R
Z
(-/4), T
4
=T(-8,0,0), ) 2 , 1 , 2 ( ) 4 / - ( ) 0 , 0 , 8 - ( S R T M
Z 4
.
Scena virtual virtual rezultat este redat n Fig. 3.9. Axele de coordonate
reprezentate n imagine sunt axele sistemului de referin universal. n centrul
sistemului de referin universal este reprezentat primul cub, cu aceleai dimensiuni ca
cele ale modelului. Cubul din partea de jos a imaginii se obine prin transformarea de
instaniere P
2
= M
2
P; paralelipipedul din dreapta se obine prin transformarea de
instaniere P
3
= M
3
P; paralelipipedul din stnga se obine prin transformarea de
instaniere P
4
= M
4
P.
Reprezentarea de mai jos conine i o transformare de proiecie perspectiv,
pentru percepia adncimii care va fi explicat ulterior. Una din feele cubului (cea mai
apropiat de observator) este desenat ca suprafa de o culoare gri; celelalte fee ale
cubului sunt reprezentate numai prin muchiile lor (reprezentare numit cadru de
srm, wireframe)
3.1.6Alte transformri geometrice n spaiu
Printre alte transformri n spaiul tridimensional care se pot aplica obiectelor,
cele mai importante sunt transformarea de simetrie i transformarea de forfecare.
Transformarea de simetrie. O transformare de simetrie (oglindire) a unui
punct P fa de un plan calculeaz un punct P aflat pe o dreapt perpendicular pe
planul , la o distan egal cu distana lui P fa de planul dat. Pentru cazul particular
n care planul de simetrie este unul din planele sistemului de coordonate, simetricul
unui punct este punctul care are coordonatele pe cele dou axe ale planului egale i
coordonata pe cealalt ax a sistemului de coordonate cu valoare negat.
Se pot deduce simplu matricele de transformare de simetrie relative la planele
sistemului de referin:
1
1
1
1
]
1

1
1
1
1
]
1

1
1
1
1
]
1

1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
,
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
,
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
ZX YZ XY
S S S
(3.34)
Transformarea de simetrie fa de un plan oarecare se poate calcula folosind o
secven de transformri elementare (E3.2).
Fig. 3.9 Scen virtual rezultat prin instanierea mai multor obiecte.
Dac se consider transformarea de simetrie ca o transformare aplicat unui
sistem de coordonate dat, sistemul de coordonate rezultat are convenia de orientare a
axelor invers fa de convenia iniial. De exemplu, sistemul drept Oxyz se
transform prin simetria S
xy
ntr-un sistem de coordonate orientat dup regula minii
stngi (Fig. 3.10).
Transformarea de forfecare (shear) este o transformare care modific forma
i dimensiunea obiectului transformat. Transformrile de forfecare cele mai simple
sunt cele definite fa axele sistemului de coordonate.
Forfecarea dup axa x a sistemului de coordonate modific un punct P(x,y,z)
n punctul P(x,y,z), astfel c:
z ' z ; y ' y ; bz ay x ' x + +
n forma matriceal n coordonate omogene, forfecarea dup axa x se scrie astfel:
X
F P P' , unde
1
1
1
1
]
1

1 0 0 0
0 1 0 0
0 0 1 0
0 b a 1
) b , a (
X
F
(3.35)
n mod similar se definesc matricele de forfecare pe axele y i z:
1
1
1
1
]
1

1 0 0 0
0 1 0 0
0 d 1 c
0 0 0 1
) d , c (
Y
F
,
1
1
1
1
]
1

1 0 0 0
0 1 f e
0 0 1 0
0 0 0 1
) f , e (
Z
F

(3.36)
Transformarea de forfecare este folosit n definirea sistemelor de proiecie.
y
x
O
z
y
x
O
z
S
XY
Fig. 3.10 Transformarea de simetrie SXY transform sistemul de coordonate drept Oxyz
n sistemul de coordonate stng Oxyz.
3.2Transformri geometrice n plan
Uneori sunt necesare transformri geometrice n planul bidimensional. Exprimarea
matriceal unitar a transaformrilor geometrice n plan se poate face ntr-un sistem de
coordonate omogene definit n mod asemntor sistemului de coordonate omogene n
spaiu: unui punct P(x,y) n plan i corespunde un punct P(X,Y,w), cu relaiile ntre
coordonate:
w / Y y ; w / X x
, unde factorul de scar w este diferit de zero.
Transformrile geometrice n planul bidimensional pot fi definite prin matrice de
transformare de dimensiune 3x3. Pentru transformrile geometrice primitive n plan,
matricele de transformare se deduc simplu, ca o particularizare a transformrilor
geometrice spaiale. Acestea au urmtoarele expresii:
Translaia cu valorile t
x
i t
y
:
1
1
1
]
1


1 0 0
t 1 0
t 0 1
) t , t ( unde , ) t , t (
y
x
y x y x
T P T P'
(3.37)
Scalarea fa de origine, cu factorii de scar s
x
, s
y
:
1
1
1
]
1


1 0 0
0 s 0
0 0 s
) s , s ( unde , ) s , s (
y
x
y x y x
S P S P'
(3.38)
Rotaia fa de origine cu un unghi :
1
1
1
]
1




1 0 0
0 cos sin
0 sin cos
) ( unde , ) ( R P R P'
(3.39)
Transformri complexe n plan se pot defini, la fel ca i n spaiu, prin compunerea
(produs) de matrice de transformri primitive. Toate transformrile ntre sisteme de
referin n plan pot fi considerate cazuri particulare ale transformrilor
corespunztoare n spaiu.
4
Sisteme de vizualizare
Un sistem de vizualizare este definit printr-o colecie de sisteme de referin,
convenii de reprezentare i relaii (matriceale) de transformare care permit executarea
unei succesiuni de transformri care au ca efect punerea n coresponden (mapping) a
punctelor din sistemul de referin de modelare (modelling coordinate space) cu
puncte ale suprafeei de vizualizare (view surface).
ntr-un sistem de vizualizare, generarea imaginii scenei virtuale este un proces
complex care poate fi parcurs prin reprezentri n mai multe sisteme de referin,
fiecare sistem de referin facilitnd specificarea i executarea anumitor operaii (Fig.
4.1). n multe lucrri, generarea imaginii de mai este denumit i vizualizarea sau
redarea scenelor (viewing, rendering). Pe parcursul lucrrii vor fi utilizai toi aceti
termeni.

Transformare
de modelare
Transformare
de observare
Transformare
de normalizare
Transformare
n ecran 3D
Fig. 4.1 Succesiunea operaiilor de vizualizare.
Transformare
de rastru
Definire
obiecte
Sistem
de referin
local
Definire
sistem de
referin
de observare
Sistem
de referin
universal
Definire
proiecie
i volum de
vizualizare
Sistem
de referin
de observare
Decupare
mprire
cu w
Calcul
proiecie
Sistem
de referin
normalizat
Sistem
de referin
ecran 3D
Afiare
imagine
Sistem
de referin
imagine
Obiectele tridimensionale componente ale scenei sunt modelate i reprezentate
n sisteme de referin locale (sau de modelare), care au originea i orientarea alese cel
mai convenabil pentru reprezentarea obiectelor respective.
Pentru construirea scenei, obiectele specificate n sistemul de referin de
modelare sunt instaniate prin aplicarea unei succesiuni de transformri geometrice,
care constitue transformarea de modelare (descris n paragraful 3.1.5.4). Prin
transformarea de modelare se obine descrierea obiectelor ntr-un sistem de referin
unic al scenei virtuale, numit sistemul de referin universal. n sistemul de referin
universal mai sunt definite i alte elemente necesare redrii realiste a scenelor, cum
sunt sursele de lumin sau traiectoriile de modificare a poziiei obiectelor mobile n
scen.
n sistemul de referin universal se definete un sistem de referin de
observare (view reference), care specific punctul i direcia din care este privit
(observat) scena. Este evident c, pentru aceeai scen, imaginea care se red pe
display depinde de punctul i direcia din care este observat scena, deci de felul n
care este definit sistemul de referin de observare (care mai este denumit i sistem de
referin ochi- eye coordinate space). Transformarea obiectelor din sistemul de
referin universal n sistemul de referin de observare este numit transformare de
observare (sau de vizualizare view transform; s-a evitat, ns, aceast traducere,
datorit suprautilizrii termenului de vizualizare).
n sistemul de referin de observare se poate face o analogie simpl cu modul
n care este privit o scen real prin ochiul uman sau printr-un aparat fotografic
(camer). Poziia i orientarea sistemului de referin de observare corespund poziiei
i orientrii ochiului sau a camerei ntr-o scen real. Dintr-un punct de observare dat,
numai o parte a scenei poate fi vzut, restul aflndu-se n spatele sau n prile
laterale ale direciei de observare. Partea vizibil din scen (real sau virtual) este
definit ca volum de vizualizare (viewing volume), care, n general, este o piramid
(sau un trunchi de piramid) cu centrul n punctul de observare i cu direcia dat de
direcia de observare. n redarea scenelor, deschiderea unghiular a piramidei de
vizualizare definete cmpul de vizualizare (field of view), care este o caracteristic
important a sistemelor grafice.
Dei exist i unele dispozitive de afiare tridimensional, majoritatea sistemelor
grafice afieaz imaginile pe o suprafa plan a unui dispozitiv de afiare (display).
De aceea, n succesiunea operaiilor de vizualizare a obiectelor sau a scenelor
tridimensionale, este necesar introducerea unei proiecii, care convertete spaiul
tridimensional ntr-o reprezentare bidimensional. n general, proieciile transform
spaiul R
n
n spaiul R
m
, unde m < n.
Modul n care se realizeaz proiecia obiectelor tridimensionale se definete n
sistemul de referin de observare prin mai muli parametri, dintre care cei mai
importani sunt: tipul proieciei i planul de vizualizare (view plane). Intersecia dintre
planul de vizualizare i piramida de vizualizare definete o regiune plan numit
fereastr de vizualizare (view plane window) n care sunt reprezentate toate imaginile
bidimensionale ale obiectelor (sau prilor de obiecte) vizibile din scen.
n grafica tridimensional exist mai multe posibiliti de definire a sistemelor
de vizualizare, de la definiri simple, utile n mici programe grafice, pn la definiri
complete, care permit crearea simultan a mai multor imagini ale scenei, n ferestre de
vizualizare diferite. n majoritatea acestor sisteme de vizualizare, din motive de
eficien i precizie a calculelor (care sunt explicate mai jos), transformarea de
proiecie se execut n dou etape: prima etap este o transformare de normalizare,
care este o schimbare a sistemului de referin de la sistemul de referin de observare
la sistemul de referin normalizat. Volumul de vizualizare definit n sistemul de
referin de observare este transformat n sistemul de referin normalizat ntr-un
volum canonic (n general, un paralelipiped dreptunghic).
n sistemul de referin normalizat (normalized coordinates) se execut
decuparea obiectelor (clipping), astfel nct obiectele sau prile din obiecte care se
afl n afara volumului de vizualizare (volumul canonic) sunt eliminate (ignorate
pentru operaiile urmtoare de redare, nu terse din scen).
Urmtoarea transformare geometric este transformarea din sistemul
normalizat n sistemul de referin ecran tridimensional (three-dimensional sceen),
prin care fereastra definit n planul de vizualizare este transformat ntr-o regiune
corespunztoare zonei de afiare pe display, numit poart (viewport), iar coordonata z
se pstreaz nemodificat. n sistemul de referin ecran 3D se calculeaz
coordonatele tridimensionale ale punctelor din coordonatele omogene prin mprirea
cu w, dup care se execut transformarea de rastru (rasterization). Transformarea de
rastru calculeaz mulimea pixelilor care aparin unui segment sau poligon dat prin
coordonatele vrfurilor. Prin aceast transformare (care se mai numete i conversie de
baleiere scan conversion) spaiul bidimensional continuu al porii de afiare este
convertit n spaiul bidimensional discret al imaginii. n general, concomitent cu
transformarea de rastru sunt executate i alte operaii: eliminarea suprafeelor ascunse
(hidden surface removal), umbrirea (shading), texturarea (texturing).
Aceasta este succesiunea cea mai general a operaiilor de vizualizare a
scenelor, care este descris i utilizat n momentul de fa n grafic i realitatea
virtual. Trebuie ns remarcat faptul c evoluia tehnologic, deosebit de
spectaculoas n acest domeniu, a modificat, uneori substanial, modul de abordare a
generrii imaginii obiectelor tridimensionale. De exemplu, posibilitatea de
implementare eficient (uneori chiar n hardware) a operaiei de comparare a
adncimii punctelor a impus utilizarea algoritmului cunoscut sub numele de algoritm
Z-buffer i a condus la ignorarea complet a altor algoritmi de eliminare a suprafeelor
ascunse, care n sistemele mai vechi aveau o mare importan i implicaie asupra
ntregii succesiuni de operaii grafice. Se pot da numeroase exemple de modul n care
schimbrile tehnologice au influienat abordarea graficii tridimensionale, i, probabil,
astfel de influiene vor continua s apar i n viitor. De aceea, lucrarea i propune s
prezinte aspectele eseniale ale graficii utilizate n realitate virtual, mai puin
influienate de contextul tehnologic de moment.
Transformarea de observare
Transformarea de observare este analog cu poziionarea unei camere
fotografice sau de nregistrare, prin care se observ o anumit zon din scena virtual.
n sistemul de referin universal sunt reprezentate toate obiectele (modelele) scenei
virtuale, iar n fiecare cadru al imaginii (frame), este generat imaginea acelor obiecte
din scen care sunt vizibile din punctul de observare curent (view point).
Transformarea de observare este, aadar, o schimbare a sistemului de
coordonate de la sistemul de referin universal la sistemul de referin de observare
(view coordinate). n majoritatea aplicaiilor de realitate virtual (simulatoare, aplicaii
n arhitectur, etc) scena virtual reprezentat n sistemul de referin universal este
meninut ntr-o poziie constant (cel mult existnd anumite obiecte mobile n scen),
iar observatorul este cel care i modific poziia i orientarea, i n funcie de acestea
se red imaginea corespunztoare pe ecran. Direcia de observare a scenei este, n
majoritatea sistemelor de vizualizare, direcia axei z a sistemului de referin de
observare.
Localizarea i orientarea sistemului de referin de observare O
V
x
V
y
V
z
V
n
raport cu sistemul de referin universal Oxyz poate fi descris printr-o matrice de
transformare M

de forma general:
1
1
1
1
]
1

1
1
1
1
]
1

1
1
1
1
]
1


1 0 0 0
z c c c
y c c c
x c c c
1 0 0 0
0 c c c
0 c c c
0 c c c
1 0 0 0
z 1 0 0
y 0 1 0
x 0 0 1
V 33 23 13
V 32 22 12
V 31 21 11
33 23 13
32 22 12
31 21 11
V
V
v
V V
R T M
(4.1)
Matricea component T
V
este matricea de translaie a sistemului de referin de
observare n raport cu sistemul de referin universal:
V V V
z , y , x sunt coordonatele
punctului de observare O
V
n sistemul Oxzy. Matricea de rotaie R
V
reprezint
orientarea sistemului de referin de observare fa de sistemul de referin universal:
coeficienii c
11
, c
12
, c
13
sunt cosinuii directori ai axei O
V
x
V
fa de axele Ox, Oy,
respectiv Oz; coeficienii c
21
, c
22
, c
23
sunt cosinuii directori ai axei O
V
y
V
fa de axele
Ox, Oy, respectiv Oz; coeficienii c
31
, c
32
, c
33
sunt cosinuii directori ai axei O
V
z
V
fa
de axele Ox, Oy, respectiv Oz.
Fiind dat matricea de poziionare i orientare a sistemului de referin observator
relativ la sistemul de referin universal M, un punct oarecare P(x,z,y) din sistemul
Oxyz se transform n punctul P
V
(x
V
,y
V
,z
V
) n sistemul de referin observator prin
nmulire cu matricea invers, deci:
P M P T R P M P
V
1
V
1
V
1
V


(4.2)
unde matricea de transformare de observare M
V
este inversa matricii de localizare a
sistemului de referin de observare relativ la sistemul de referin universal:
1
V

M M .
Matricea de rotaie mai poate fi precizat i printr-o succesiune de rotaii n raport
cu axele sistemului de referin universal. Cea mai obinuit convenie pentru ordinea
de specificare a rotaiilor este: ruliu cu unghiul (dup axa z), tangaj cu unghiul
(dup axa x) i giraie cu unghiul (fa de axa y). n aceast situaie:
) ( ) ( ) (
Z X Y V
R R R R
i rezult:
P T R R R P T R P
Y X Z
1
V
-1
V V
) z , y , x ( ) ( ) ( ) (
v v V


(4.3)
n aceste relaii de transformare de observare s-a presupus c sistemul de referin
de observare este tot un sistem drept, la fel ca i sistemul de referin universal. Exist
ns i sisteme de vizualizare n care se definete sistemul de referin de observare ca
un sistem orientat dup regula minii stngi. Pentru schimbarea sistemului de referin
de observare drept n sistem de referin stng, se adaug o transformare de oglindire
(simetrie), de exemplu cu matricea S
XY
, iar matricea de transformare de observare
devine M
V
, unde:
V XY V
M S = M'
Dat fiind c nu exist o predilecie cert pentru una din aceste convenii posibile
(sistem de referin de observare drept sau stng), este necesar s fie precizat de
fiecare dat convenia folosit, ceea ce se va face i pe parcursul acestei lucrri.
n deducerea relaiilor 4.2 i 4.3 s-a presupus c este cunoscut matricea M de
localizare a sistemului de referin de observare fa de sistemul de referin universal
i atunci matricea de transformare de observare M
V
se calculeaz ca matrice invers a
acesteia. Exist situaii n care matricea M nu este cunoscut i atunci matricea de
transformare de observare M
V
(sau M
V
) trebuie s fie calculat prin diferite
transformri geometrice i raionamente. n exemplul urmtor se urmrete un
raionament de calcul al transformrii de observare, pentru o anumit cerin de
observare a scenei.
Exemplul 4.1
Se poate defini un sistem de referin de observare pornind de la alte condiii
dect cele prezentate mai sus. De exemplu, se cere definirea matricii de transformare
de observare n situaia n care obiectul care trebuie s fie vzut se afl n centrul
sistemului de referin universal, iar punctul de observare este un punct dat n spaiul
tridimensional, E(x
E
, y
E
, z
E
).
Pentru ca obiectul aflat n centrul sistemului de referin universal s fie vzut
din punctul E dat, se definete sistemul de referin de observare drept cu centrul n
punctul E, i cu axa z
V
orientat pe dreapta OE (cu sensul de la O ctre E). Direcia de
observare ntr-un sistem de referin drept este definit (n majoritatea sistemelor de
vizualizare) n sens invers direciei axei z, deci ctre centrul O.
Calculele de transformare se efectueaz mai uor dac se dau coordonatele
sferice ale punctului E: distana a punctului E fa de origine i unghiurile i
(Fig. 4.2). Coordonatele carteziene ale punctului E pot fi calculate n funce de
coordonatele sferice:



cos z
cos sin y
cos sin x
E
E
E
Pentru transformarea unui obiect din sistemul de referin universal n
sistemul de referin de observare astfel definit, sunt necesare trei transformri
elementare. n Fig. 4.2 sunt reprezentate primele dou transformri componente ale
transformrii de observare.

Translaia T
1
= T(x
E
, y
E
, z
E
) transform sistemul de referin universal ntr-un
sistem de referin cu centrul n punctul E i cu axele x, y, z paralele cu axele
sistemului de referin universal.
1
1
1
1
]
1

1 0 0 0
cos 1 0 0
sin sin 0 1 0
sin cos 0 0 1
1
T
Orientarea sistemului de referin de observare astfel nct axa z s se
suprapun peste dreapta OE se obine prin dou rotaii.
Prima rotaie se efectueaz n raport cu axa z cu un unghi de 90 n sens
negativ, astfel nct noua ax x obinut s fie normal la planul care trece prin axa z
i punctul E (planul OEE
xy
) (Fig. 4.2(b)). Aceast operaie este echivalent cu o rotaie
n sens direct aplicat asupra punctelor, deci cu matricea R
2
= R
Z
(90 ), unde
1
1
1
1
]
1

1 0 0 0
0 1 0 0
0 0 sin cos
0 0 cos sin
2
R
Dup aceast rotaie, sistemul observator are axa x perpendicular pe planul
planul OEE
xy
i axa Ez n planul OEE
xy
.
x
y
E

y
z
z
x
Exy
(a)
x
y
E

y
z
z
x
E
xy
(b)
Fig. 4.2 Transformarea de observare: (a) translaia (b) rotaia n raport cu axa z.
A doua rotaie este o rotaie a sistemului de coordonate Exyz n sens
negativ cu un unghi egal cu n raport cu axa Ex, pentru a suprapune axa Ez peste
dreapta OE (Fig. 4.2(a)). Acest rotaie este echivalent cu o rotaie invers aplicat
obiectelor, deci cu matricea R
3
= R
X
( ):
1
1
1
1
]
1

1 0 0 0
0 cos sin 0
0 sin cos 0
0 0 0 1
3
R
Rezult matricea de transformare de observare:
) z , y , x ( ) 90 ( ) (
E E E
T R R M
Z X V
1
1
1
1
]
1

1 0 0 0
cos sin sin sin cos
0 sin cos sin cos cos
0 0 cos sin
V
M
Transformarea unui punct P(x,y,z) din sistemul de referin universal n
punctul P(x
V
,y
V
,z
V
) n sistemul de referin observator se obine astfel:
[ ] [ ]
T T
V V V
1 z y x 1 z y x
V
M
n Fig. 4.3 este reprezentat imaginea unui cub cu centrul n origine i laturile
egale cu 2 i paralele cu axele de coordonate, observat din punctul E(10,10,10).
Pentru punctul E:
Fig. 4.2 Transformarea de observare:
(c) rotaia n raport cu axa x(d) sistemul de referin rezultat
(c)
(d)
x
y
E

y
z z
x
E
xy
x
y
E
y
V
z z
V
x
V
O

' 45 54 , 3 6 sin , 3 3 cos
45 , 2 2 sin , 2 2 cos
3 10




Matricea de transformare de observare are valoarea:
1
1
1
1
1
]
1

1 0 0 0
3 10 3 3 3 3 3 3
0 3 6 6 6 6 6
0 0 2 2 2 2
V
M

Centrul O al sistemului de referin universal se transform n punctul
( )
3 9 - , 0 , 0 ' O n sistemul de referin de observare, iar vrful cubului P(1,1,1), se
transform n punctul ( )
3 10 - , 0 , 0 ' P . Direcia de observare trece printr-un vrf al
cubului i prin centrul lui.
Transformarea de proiecie
Proiecia unui obiect tridimensional pe un plan (numit plan de proiecie sau plan
de vizualizare view plane) este format din mulimea punctelor de intersecie ntre
acest plan i dreptele numite proiectori, care pornesc dintr-un punct fix numit centru
de proiecie i trec prin fiecare punct al obiectului.
n funcie de distana centrului de proiecie fa de planul de proiecie, proieciile
plane se clasific n proiecii perspectiv i proiecii paralele. n proieciile perspectiv
centrul de proiecie se afl la distan finit fa de planul de vizualizare, iar n
proieciile paralele centrul de proiecie este la infinit. n cazul proieciilor paralele,
proiectorii sunt drepte paralele i au o direcie comun, numit direcie de proiecie.
x
y
z
Fig. 4.3 Exemplu de observare ctre centrul sistemului de referin universal.
n grafica tridimensional se folosete cel mai frecvent proiecia perspectiv,
deoarece aceast proiecie red cel mai bine efectul de descretere a dimensiunilor
obiectelor odat cu creterea distanei acestora fa de observator.
Modul de definire a punctului de observare al scenei, al centrului de proiecie i al
planului de vizualizare depind de sistemul de vizualizare folosit. Un studiu atent al
sistemelor de vizualizare este necesar din mai multe motive. Chiar dac un utilizator
nu trebuie s proiecteze el nsui sistemul de vizualizare, exploatarea oricrui sistem
necesit o nelegere precis a modului n care diferii parametri determin imaginea
obinut pe display. Combinaiile posibile sunt n munr att de mare, nct ansa de a
potrivi diferii parametri ai unui sistem de vizualizare, fr a fi cunoscute condiiile n
care lucreaz acesta, este infim.
Proiecia paralel
n prioecia paralel, centrul de proiecie este la infinit, iar toate dreptele de
proiecie sunt paralele ntre ele, avnd o direcie numit direcia de proiecie.
Proieciile paralele sunt foarte rar folosite n grafica destinat sistemelor de
realitate virtual, dat fiind c imaginea rezultat nu d informaii asupra distanei
obiectelor n scen.
Planul de proiecie al unei proiecii paralele poate fi perpendicular pe direcia
de proiecie, i atunci proiecia se numete proiecie ortografic, sau poate avea o
inclinare oarecare fa de direcia de proiecie, i atunci proiecia se numete proiecie
oblic.
Dintre proieciile ortografice, cele mai utilizate sunt proieciile ortografice n
care planul de proiecie este unul din planurile sistemului de coordonate. Proieciile
ortografice sunt folosite frecvent n desenul tehnic i, de asemenea, ca o etap
intermediar n definirea sistemelor de vizualizare normalizate, care vor fi prezentate
n paragraful urmtor. Matricea de transformare de proiecie ortografic n planul z = 0
are urmtoarea expresie:
1
1
1
1
]
1

1 0 0 0
0 0 0 0
0 0 1 0
0 0 0 1
Z
P
(4.4)
Un punct P(x,y,z) se transform n punctul P(x,y,0) prin proiecie ortografic
n planul z=0, care are aceleai coordonate x i y, iar coordonata z are valoarea zero.
n mod similar, se definesc matricile de proiecie ortografic n planele x = 0
i y = 0:
1
1
1
1
]
1

1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 0
X
P
,
1
1
1
1
]
1

1 0 0 0
0 1 0 0
0 0 0 0
0 0 0 1
Y
P
(4.5)
Proiecia perspectiv
Exist mai multe modaliti de definire a unei proiecii perspectiv, de la o
definire minimal, prin care se poate realiza proiecia punctelor din spaiu pe un plan,
pn la definirea adoptat n sisteme de vizualizare complexe, n care se specific
volumul de vizualizare, centrul de proiecie i ali parametri. n continuare, vor fi
prezentate cteva sisteme de vizualizare cu proiecie perspectiv, ncepnd cu cel mai
simplu sistem i pn la sistemul complet de vizualizare care se conformeaz
standardelor GKS i PHIGS.
Proiecia perspectiv se poate defini mai intuitiv pornind de la sistemul de
observare considerat ca un sistem de referin stng. Centrul de proiecie se fixeaz n
centrul sistemului de referin de observare O
V
, direcia de observare (de privire) este
n sensul pozitiv al axei O
V
z
V
, iar planul de vizualizare este un plan perpendicular pe
axa O
V
z
V
, la distana d fa de centru (Fig. 4.4(a)).
Punctul P(x
V
,y
V
,z
V
) n sistemul de referin de observare se proiecteaz n
punctul P(x
P
,y
P
,z
P
), aflat la intersecia dreptei O
V
P cu planul de vizualizare. Din
triunghiurile asemenea O
V
PA i O
V
PB, rezult:
V
V
P
z
y d
y
n mod asemntor se poate deduce valoarea lui x
P
:
V
V
P
z
x d
x

(4.6)
Aceste relaii se pot exprima matriceal prin definirea matricei de proiecie
perspectiv M
P
astfel:
Fig. 4.4 Proiecia perspectiv definit prin centrul de proiecie O
V

i planul de proiecie perpendicular pe axa O
V
z
V
.

y
V
z
V
O
V
x
V
P
P
A
Sistem de referin de observare stng
B
y
V
y
P
z
V
d
y
V
z
V
O
V
x
V
P
P
A
Sistem de referin de observare drept
B
y
V
y
P
z
V
d
z
V
Direcia de observare Direcia de observare

1
1
1
1
]
1

0 d / 1 0 0
0 1 0 0
0 0 1 0
0 0 0 1
P
M
(4.7)
Transformarea de proiecie se poate scrie atunci:
P M = P'
P
,
1
1
1
1
]
1

1
1
1
1
]
1

1
1
1
1
]
1

V
V
V
V
P
P
P
P
w
Z
Y
X
0 d / 1 0 0
0 1 0 0
0 0 1 0
0 0 0 1
w
Z
Y
X
Rezult:

'

d / Z w
Z Z
Y Y
X X
V P
V P
V P
V P
i

'




d w / Z z
z y d Z / Y d w / Y y
z x d Z / X d w / X x
P P P
V V V V P P P
V V V V P P P
(4.8)
Se observ c expresiile lui x
P
i y
P
i z
P
obinute prin calcul matriceal sunt
identice cu cele din relaiile 4.6, rezultate din construcia geometric prezentat n Fig
4.4(a). Proiecia perspectiv nseamn deci o mprire a coordonatelor x i y cu
distana z, i, ntr-adevr, n proiecia perspectiv imaginea unui obiect este cu att mai
mic cu ct se afl la distan mai mare de punctul de observare.
n acest sistem de vizualizare simplu s-a definit sistemul de referin de
observare ca un sistem stng. Se poate defini acest sistem ca un sistem de referin
drept, iar direcia de observare ndreptat spre z
V
. Planul de vizualizare este
poziionat perpendicular pe axa z, la distan egal cu d fa de origine (Fig. 4.4(b)), d
avnd valoare negativ. Urmnd un raionament asemnotor cu cel de mai sus, rezult
matricea de proiecie perspectiv cu aceeai expresie 4.7, n care d are o valoare
negativ. Coordonatele punctului transformat sunt date de relaiile 4.8. Trebuie
precizat c n aceast convenie se proiecteaz pe planul de vizualizare punctele aflate
n direcia de observare, deci cu z
V
negativ.
Se remarc echivalena rezultatelor obinute, iar convenia de sistem de
referin de observare stng este util doar pentru a se urmri mai uor raionamentul
de calcul.
Sistemul de referin normalizat
Sistemul de proiecie simplu definit mai sus, n care toate obiectele din scen
sunt proiectate pe planul de vizualizare, are mai multe inconveniente i nu poate fi
folosit dect n aplicaii foarte simple, n care se proiecteaz obiecte aflate tot timpul
n cmpul de observare. Nu aceasta este situaia imaginilor generate n realitatea
virtual, n care se exploreaz o scen virtual de dimensiuni mari, din care numai o
parte este vizibil i deci redat pe ecran.
Transformarea de proiecie perspectiv este o transformare costisitoare,
datorit faptului c necesit operaii de mprire, care consum timp de calcul ridicat,
dac este executat prin program, sau circuite complexe, dac este implementat
hardware. Execuia ei pentru toate obiectele scenei, inclusiv pentru cele care nu sunt
vizibile, deci nu sunt reprezentate pe display i nu necesit coordonatele n planul de
vizualizare, este costisitoare i inutil. n plus, operaia de decupare (clipping) a
prilor din obiectele tridimensionale care nu sunt vizibile dintr-un anumit punct de
observare, nu se poate executa eficient dup proiecie i este necesar execuia ei
nainte de proiectarea coordonatelor n planul de vizualizare. Asupra acestui aspect se
va reveni cu ocazia descrierii operaiei de decupare.
Este evident c, pentru redarea eficient a scenelor tridimensionale, este
necesar definirea unui volum de vizualizare (view volume), cunoscut sub numele de
piramida de vizualizare sau trunchiul de piramid de vizualizare (frustum). Trunchiul
de piramid de vizualizare se definete n sistemul de referin de observare. n forma
cea mai simpl, trunchiul de piramid de vizualizare este mrginit de patru plane
laterale care trec prin punctul de observare O
V
i de dou plane perpendiculare pe axa
O
V
z
V
, planul apropiat (near) pe care se execut proiecia, i planul deprtat (far). n
figura Fig. 4.5 este prezentat volumul de vizualizare ntr-un sistem de referin de
observare stng i direcia de observare ctre z
V
pozitiv.
Intersecia dintre cele patru plane laterale i planul de vizualizare (care, n
aceast definiie, este i planul apropiat de vizibilitate) determin o suprafa
dreptunghiular ABCD n planul de vizualizare n care vor fi proiectate toate obiectele
vizibile ale scenei. Aceast suprafa este fereastra de vizualizare (view plane
window). Ecuaiile celor ase plane ale trunchiului de piramid regulat sunt:
Fig. 4.5 Definirea trunchiului de piramid de vizualizare (frustum)
n sistemul de referin de observare stng.
z
V
x
V
y
V
O
V
z
V
= f
z
V
= d
x
V
= g z
V
/d
y
V
= h z
V
/d
A
B
D
C
Direcia de observare

'

t
t
f z
d z
d z h y
d z g x
V
V
V V
V V

(4.9)
unde: 2g dimensiunea laturii orizontale a ferestrei de vizualizare (latura AB)
2h dimensiunea laturii verticale a ferestrei de vizualizare (latura BC)
d distana planului de vizualizare i a planului apropiat
f distana planului deprtat.
Semnificaia volumului de vizualizare este evident: dintre toate obiectele din
scena virtual, sunt vizibile i redate n fereastra de vizualizare numai acele obiecte
sau pri din obiecte care sunt cuprinse n acest volum. Trunchiul de piramid de
vizualizare definete n acest fel i volumul de decupare (clipping), operaie care se
execut ntr-unul din sistemele de referin care se definesc n cadrul transformrii de
proiecie, i anume sistemul de referin normalizat. Acest sistem de referin se mai
numete i sistem de referin canonic. Motivele pentru care decuparea se efectueaz
cel mai eficient n sistemul de referin normalizat vor fi explicate ulterior.
Sistemul de referin normalizat este un sistem de coordonate tridimensional
n care trunchiul de piramid de vizualizare se transform ntr-un volum canonic, care,
n general, este un paralelipiped dreptunghic. Pentru sistemul de proiecie definit n
acest paragraf, volumul canonic este un paralelipiped dreptunghic cu latura bazei egal
cu 2 i nlimea 1 (dup axa z
N
).
Introducerea acestui nou sistem de referin permite abordarea transformrii
de proiecie perspectiv n dou etape: o transformare din sistemul de referin de
observare n sistemul de referin normalizat (numit transformare de normalizare),
urmat de calculul proieciei prin mprirea cu w a coordonatelor omogene. ntre cele
dou etape ale transformrii de proiecie perspectiv se execut o operaie important
n grafica tridimensional, decuparea obiectelor relativ la volumul de vizualizare
normalizat (volumul canonic).
Pentru transformarea de normalizare (transformarea de la sistemul de referin
de observare la sistemul de referin normalizat), se impun urmtoarele cerine:
(1) Se normalizeaz coordonata z
N
, care reprezint adncimea, astfel nct s
se obin precizie maxim n operaiile de comparaie a adncimii
punctelor.
(2) Liniile din sistemul de referin observator trebuie s se transforme n linii
n sistemul de referin normalizat.
(3) Suprafeele plane din sistemul de referin observator trebuie s se
transforme n suprafee plane n sistemul de referin normalizat.
S-a demonstrat [New81] c aceste cerine sunt satisfcute de transformarea:
V N
b/z + a = z
unde a i b sunt constante. Aceste constante se determin din urmtoarele
constrngeri:
Se alege b < 0, astfel ca z
N
s creasc atunci cnd crete z
V
. Aceast
condiie conserv noiunea intuitiv de adncime: un punct are coordonata
z
N
cu att mai mare cu ct este mai departe de observator.
Se normalizeaz domeniul de variaie al lui z
N
, astfel ca domeniul z
V
[d,f]
s se transforme n domeniul z
N
[0,1].
Rezult urmtoarele relaii care definesc transformarea de normalizare:

'

,
_

V
N
V
V
N
V
V
N
z
d
1
d f
f
z
z h
y d
y
z g
x d
x
(4.10)
Coordonatele omogene ale unui punct n sistemul normalizat au expresiile:

'

V N
V N
V N
V N
z w
d) df/(f d) f /( f z Z
h y d Y
g x d X
(4.11)
Din aceste expresii se deduce matricea de transformare de normalizare M
N
care efectueaz transformarea de la sistemul de referin observator la sistemul de
referin normalizat:
1
1
1
1
]
1

0 1 0 0
d) df/(f d) f /( f 0 0
0 0 h / d 0
0 0 0 g / d
N
M
,
1
1
1
1
]
1

1
1
1
1
]
1

1
z
y
x
w
Z
Y
X
V
V
V
N
N
N
N
N
M (4.12)
Matricea de transformare de normalizare M
N
poate fi exprimat ca un produs
de dou matrice astfel:
N1 N2 N
M M M
1
1
1
1
]
1

1
1
1
1
]
1

1 0 0 0
0 1 0 0
0 0 h / d 0
0 0 0 g / d
0 1 0 0
d) df/(f d) f /( f 0 0
0 0 1 0
0 0 0 1
Aceast reprezentare permite analiza mai detaliat a transformrii de
normalizare. Sistemul de referin normalizat astfel definit este un sistem de referin
stng. Matricea M
N1
este o matrice de scalare neuniform prin care trunchiul de
piramid de vizualizare este transformat ntr-un trunchi de piramid regulat cu
unghiul la vrful piramidei de 90. Matricea M
N2
transform acest trunchi de piramid
regulat n volumul canonic, care este un paralelipiped dreptunghic (Fig. 4.6).
n sistemul de referin normalizat se execut operaia de decupare a
obiectelor n coordonate normalizate omogene. n urma acestei operaii, din totalitatea
obiectelor scenei virtuale sunt reinute numai acele obiecte sau pri (rezultate prin
decupare) aflate n interiorul volumului de vizualizare canonic, ceea ce nseamn c,
nainte de transformarea de normalizare, acestea se aflau n interiorul trunchiului de
piramid de vizualizare.
Din coordonatele omogene X
N
, Y
N
, Z
N
, w
N
se pot deduce coordonatele x
N
, y
N
i z
N
ale punctului n sistemul de referin normalizat tridimensional:
Fig. 4.6 Etapele transformrii de normalizare.
z
V
y
V
O
V
Volumul
de vizualizare
d
f
h
y
z
O
d
d
M
N1
M
N2
z
N
y
N
1
1
1
(b)
(a)
(c)
Volumul de vizibilitate n sistemul de
referin observator.
Scalarea care transform volumul de
vizibilitate n trunchi de piramid regulat
cu unghil la vrful piramidei de 90 grade.
Volumul de vizibilitate canonic n
sistemul de referin normalizat
tridimensional.

,
_


V
N N N
V
V
N N N
V
V
N N N
z
d
1
d f
f
w Z z ;
z h
y d
w Y y ;
z g
x d
w X x
S-au obinut, evident, expresii identice cu cele din relaiile 4.10, de la care s-a
pornit pentru definirea transformrii de proiecie perspectiv.
Coordonatele x
N
i y
N
n sistemul de referin normalizat reprezint
coordonatele proieciei ortografice n planul z
N
= 0 (care este planul de vizualizare) a
punctului corespunztor. Este de remarcat faptul c transformarea de proiecie
perspectiv din sistemul de referin observator a devenit o transformare de proiecie
ortografic n sistemul de referin normalizat. Dar aceaste operaii de trecere de la
coordonate omogene la coordonate tridimensionale i proiecia ortografic nu se
efectueaz n sistemul normalizat ci ntr-un alt sistem de referin, sistemul ecran 3D,
obinut prin transformarea fereastrei de vizualizare n poart de afiare.
Unghiul dintre planele laterale ale piramidei de vizualizare (care trec prin axa
O
V
y
V
i au ecuaiile x
V
= tg z
V
/d ) se numete unghi de vizualizare pe orizontal
(horizontal field of view fovx). Unghiul dintre planele piramidei de vizualizare care
trec prin axa O
V
x
V
se numete unghi de vizualizare pe vertical (vertical field of view
fovy). Valorile acestora se deduc din parametrii de proiecie perspectiv:
d
h
arctg 2 = fovy ,
d
g
arctg 2 = fovx (4.13)
Valorile unghiurilor de vizualizare variaz pentru diferite sisteme grafice n
funcie de dispozitivele de afiare folosite.
O alt convenie de definire a unui sistem de vizualizare este aceea de a
considera sistemul de referin de observare ca un sistem drept, iar direcia de
observare i volumul de vizualizare ndreptate ctre z
V
negativ. Urmrind un
raionament asemntor celui de mai sus, se obine aceeai expresie a matricii de
normalizare (relaia 4.12), n care valorile d i f au valori negative, iar sistemul de
referin normalizat rezultat este un sistem de referin stng.
Exemplul 4.2
Se reia scena virtual din Exemplul 3.3. Imaginile din figura de mai jos
corespund obiectelor instaniate n scena virtual. Axele de coordonate reprezentate
sunt axele sistemului de referin universal. Sistemul de referin de observare este un
sistem de referin drept, iar direcia de observare ndreptat ctre z
V
negativ. Originea
O
V
are valori diferite n diferitele imagini ale figurii, aa cum este indicat pentru
fiecare dintre ele, i orientare dat prin unghiurile de giraie, tangaj, ruliu ( ,, ).
Transformarea de perspectiv este definit prin parametrii: d = 1, f = 40, g =
1, h = 1. Succesiunea de transformri efectuate pentru obinerea acestor imagini este:
(a) Transformarea de modelare, diferit pentru fiecare din cuburi, cu
matricele M
1
, M
2
, M
3
, M
4
calculate n Exemplul 3.3. Dup transformarea
de modelare (instaniere), toate obiectele sunt reprezentate n sistemul de
referin universal i, n continuare, vor fi supuse toate acelorai
transformri.
(b) Transformarea de observare cu matricea:
) z , y , x ( ) ( ) ( ) (
V V V
T R R R M
Y X Z V
,
cu valorile parametrilor x
V
, y
V
, z
V
, , , corespunztoare fiecrei
imagini redate.
(c) Transformarea de normalizare cu matricea:

1
1
1
1
]
1

0 1 0 0
1.025 1.025 0 0
0 0 1 0
0 0 0 1
N
M
(e) x
V
= 2
y
V
= 2
z
V
= 20
= 30
= = 0
(f) x
V
= 2
y
V
= 2
z
V
= 20
= 30
= = 0
(a) x
V
= 2
y
V
= 2
z
V
= 20
= = = 0
(b) x
V
= 2
y
V
= 2
z
V
= 20
= = = 0
x
(c) x
V
= 2
y
V
= 2
z
V
= 20
= = = 0
(d) x
V
= 2
y
V
= 2
z
V
= 20
= = = 0
x
Imaginile generate pe ecran mai necesit i alte transformri grafice, pe lng cele
prezentate pn acum: transformarea n coordonate ecran 3D, prin care se efectueaz o
coresponden ntre fereastra de vizualizare i zona de afiare alocat pe ecran (numit
poart viewport), precum i o transformare de rastru, prin care se genereaz mulimea
pixelilor afiai pe ecran. Aceste transformri vor fi descrise paragrafele urmtoare.
Imaginile prezentate au fost captate din fereastra de afiare a programului care
execut toate operaiile prezentate mai sus. Acest program a fost scris folosind
biblioteca grafic OpenGL, care ofer funcii adecvate acestor operaii de transformare
i redare a imaginilor. Funciile OpenGL pentru realizarea transformrilor grafice vor
fi descrise n seciunea 6.
n acest sistem de proiecie perspectiv s-a presupus c planul de vizualizare i
planul de vizibilitate apropiat coincid. Deducerea matricii de normalizare pentru
cazul general, n care cele dou plane sunt diferite, este lsat ca un exerciiu pentru
cursani. De asemenea, tot ca un exerciiu, se poate deduce matricea de normalizare n
situaia n care centrul ferestrei de vizualizare nu se afl pe axa z
V
.
Prin specificarea sistemului de referin de observare, a volumului de vizualizare
i a sistemului de proiecie (tipul de proiecie, centrul de proiecie, direcia de
observare, fereastra de vizualizare) s-a definit un sistem de vizualizare care poate fi
folosit pentru redarea obiectelor i a scenelor tridimensionale. Acest sistem este destul
de flexibil i poate acoperi un numr mare de aplicaii de grafic proiectiv (CAD-
Computer Aided Design) i unele aplicaii de realitate virtual neimersiv de tip
desktop, n care mediul grafic este generat pe monitorul unui calculator.
Dar restriciile impuse acestui sistem de vizualizare (de exemplu, s-a considerat c
centrul de proiecie coincide cu centrul sistemului de referin de observare) nu permit
utilizarea lui n sisteme de realitate virtual imersive sau semi-imersive n care este
necesar un cmp de vizualizare de dimensiune mare. Astfel de situaii se pot defini n
sistemul de vizualizare standard PHIGS.
Sistemul de vizualizare standard
Imaginea generat pe un monitor sau proiectat de un proiector pe un ecran poate
acoperi un cmp de vizualizare tipic de 35-45 vertical-orizontal. Pentru cmpuri de
Fig. 4.7 Transformri de proiecie perspectiv
pentru diferite puncte i direcii de observare a scenei
vizualizare mai mari se folosesc imagini multicanal, n care fiecare canal reprezint un
volum de vizualizare care se proiecteaz n fereastra de vizualizare a acestuia. Mai
multe canale de imagine, care genereaz imagini pe monitoare juxtapuse sau
proiectate pe un ecran de dimensiuni corespunztoare, permit obinerea unor cmpuri
de vizualizare extinse n sistemele de realitate virtual imersive.
Pentru generarea imaginilor multicanal se utilizeaz un sistem de vizualizare care
permite definirea tuturor parametrilor necesari pentru generarea simultan a mai
multor ferestre de vizualizare. Un astfel de sistem de vizualizare este cel definit n
standardele GKS i PHIGS, i va fi descris n continuare.
n sistemul de vizualizare standard PHIGS, sistemul de referin observator (numit
view reference coordinate VRC) este definit prin punctul de observare VRP (view
reference point), iar centrul de proiecie este diferit de acesta i este specificat prin
punctul PRP (projection reference point). Planul de vizualizare (pe care se execut
proiecia imaginii) nu este n mod necesar perpendicular pe linia care unete centrul de
proiecie cu centrul ferestrei de vizualizare, ceea ce permite realizarea proieciilor
oblice. Fereastra de vizualizare este poziionat n orice loc n planul de vizualizare,
ceea se permite definirea i redarea simultan a mai multor imagini ale scenei.
Sistemul de vizualizare PHIGS se specific n trei etape. n prima etap se
definete sistemul de referin de observare; n cea de-a doua etap se definete
transformarea de normalizare, iar n ultima etap se definete transformarea fereastr-
poart.
3.1.7Definirea sistemului de referin de
observare
Sistemul de referin de observare se definete prin urmtorii parametri specificai
n sistemul de referin universal:
Punctul de observare VRP (View Reference Point).
Direcia normal la planul de vizualizare, VPN (View Plane Normal).
Un vector a crui proiecie determin sensul de prezentare a imaginii,
VUP (view up vector), i care nu poate fi paralel cu vectorul VPN.
Punctul VRP, mpreun cu vectorii VPN i VUV definesc sistemul de referin
de observare ca un sistem orientat dup regula minii drepte, cu axele notate U, V, N.
N este vectorul VPN, normal la planul de vizualizare, iar UV este un plan paralel cu
planul de vizualizare (Fig. 4.8). Direcia de observare este orientat n sensul negativ
al vectorului VPN.
n planul de vizualizare se definete fereastra de vizualizare, care este un
dreptunghi orientat cu laturile paralele cu axele u i v ale unui sistem de referin
bidimensional definit n acest plan. Acest sistem de referin are originea n punctul n
care se proiecteaz (paralel cu direcia VPN) centrul sistemului de referin de
observare (VRP) pe planul de vizualizare. Direcia axei v este paralel cu proiecia
(dup direcia VPN) a vectorului VUV pe planul de vizualizare, astfel nct vectorul
VUV specific dac scena este redat n direcie vertical (n sus sau n jos) sau pe
direcie orizontal (spre dreapta sau spre stnga).
3.1.8Definirea transformrii de normalizare
Parametrii transformrii de normalizare definesc corespondena ntre volumul
de vizualizare specificat n sistemul de referin observator i volumul canonic n
sistemul de referin normalizat. Se specific urmtorii parametri de definire a
sistemului de referin normalizat relativ la sistemul de referin de observare:
Tipul proieciei (paralel sau perspectiv).
Centrul de proiecie PRP (Projection Reference Point).
Distana VPD (View Plane Distance) a planului de vizualizare fa de
centrul sistemului de referin de observare, VRP.
Distana planului apropiat (near) i al planului deprtat de vizibilitate (far)
fa de centrul sistemului de referin de observare.
Limitele ferestrei de vizualizare, u
min
, u
max
, v
min
, v
max
.
Planul de vizualizare este un plan paralel cu planul UV, aflat la distana dat
de valoarea VPD fa de centrul sistemului de observare, VRP. n planul de vizualizare
se definete sistemul de coordonate plan uv, n care fereastra de vizualizare este un
dreptunghi ntre limitele u
min
, u
max
, v
min
, v
max
.Volumul de vizualizare se definete prin
dou plane paralele cu planul de vizualizare aflate la distanele near i far de centrul
sistemului de referin observator VRP i planele care trec prin centrul de proiecie
PRP i laturile ferestrei de vizualizare.
Fig. 4.8 Specificarea sistemului de vizualizare PHIGS n proieca perspectiv.
Planul apropiat

PRP
VRP
Planul de
vizualizare
Fereastra de
vizualizare
Planul
deprtat
V
U
VPN
VPD
near
far
(u
max
, v
max
)
(u
min
, v
min
)
Direcia de
observare
Exist dou posibiliti de poziionare a centrului de proiecie PRP fa de
fereastra de vizualizare:
(a) Dac linia care unete centrul de proiecie cu centrul ferestrei de
vizualizare este paralel cu vectorul VPN, normal la planul de vizualizare,
atunci se obine o proiecie perspectiv normal, echivalent celei
descrise anterior (Fig. 4.9(a)).
(b) Dac punctul PRP nu se afl pe linia paralel cu vectorul VPN care trece
prin centrul ferestrei de vizualizare, atunci proiecia este o proiecie oblic
(Fig. 4.9(b)).
Implementarea sistemului de vizualizare PHIGS se face prin transformri
geometrice succesive, la fel ca n exemplele prezentate pn acum. Trebuie precizat c
n sistemul PHIGS standard sistemul de referin de observare UVN este sistem drept,
iar volumul de vizualizare i direcia de observare sunt orientate ctre axa N.
O prim transformare geometric este o schimbare de sistem de referin din
sistemul de referin de observare UVN ntr-un sistem de referin notat Oxyz, cu
centrul n centrul de proiecie PRP i cu axele paralele cu axele sistemului UVN (s-a
ales aceast denumire pentru simplificarea notaiilor, dar acest sistem nu este sistemul
de referin universal pentru care, n mod obinuit, s-a folosit notaia Oxyz). Aceast
transformare se efectueaz printr-o translaie invers celei definite de vectorul de
poziie al punctului PRP.
Ca urmare a acestei transformri se modific corespunztor valorile VPD, near,
far, u
min
, u
max
, v
min
, v
max
. Fie d, n, f, x
min
, x
max
, y
min
, respectiv y
max
, valorile rezultate dup
translaie. Aceste valori sunt numere reale i pot fi pozitive sau negative. Matricea de
transformare de normalizare pornind din acest sistem Oxyz, se poate descompune n
produs de trei matrice:
M
N
= M
N2
M
N1
M
N0
PRP
VPN
Planul de
vizualizare
Fereastra de
vizualizare
(a)
PRP
VPN
Planul de
vizualizare
Fereastra de
vizualizare
(b)
Fig. 4.9 (a) Proiecia normal (b) Proiecie oblic.
Matricele M
N1
i M
N2
au semnificaii asemntoare cu matricele dezvoltate pentru
sistemul de vizualizare precedent. Cealalt transformare component, M
N0
, este o
transformare de forfecare, prin care linia central a volumului de vizualizare (cea care
unete centrul de proiecie PRP cu centrul ferestrei de vizualizare, Fig. 4.10) se
suprapune cu aza z a sistemului.
Transformarea de forfecare modific valorile coordonatelor x i y cu valori
proporionale cu z.
Fig. 4.10 Transformare de forfecare n sistemul de vizualizare standard.
z
y
Axa volumului de
vizualizare
Volumul de
vizualizare
d
n
f
y
min
y
max
Planul apropiat
Planul de
vizualizare
Planul
deprtat
(0, y
max
, d)
(0, y
min
, d)
PRP
(x
max
+x
min
)/2, (y
max
y
min
)/2, d
(x
max
+x
min
)/2, (y
max
y
min
)/2, d
(a) Situaia dup
translaia
punctului PRP n origine
(b) Situaia dup
transformarea de
forfecare. Volumul de
vizualizare este simetric,
i axa acestuia suprapus
peste axa z.
Forfecare
Este simplu de observat c matricea:
1
1
1
1
]
1

+
+

1 0 0 0
0 1 0 0
0 d 2 ) y y ( 1 0
0 d 2 ) x x ( 0 1
min max
min max
N0
M
(4.14)
efectueaz o simetrizare a volumului de vizualizare. De exemplu, interseciile
muchiilor orizontale ale ferestrei de vizualizare cu planul x = 0 se transform astfel:
[ ] [ ]
T
min max min max
T
max
1 d 2 ) y y ( 2 ) x (x 1 d y 0 +
N0
M
[ ] [ ]
T
min max min max
T
min
1 d 2 ) y y ( 2 ) x (x 1 d y 0 +
N0
M
A doua transformare component este transformarea de scalare M
N1
, prin care
volumul de vizualizare este transformat ntr-un volum simetric, cu unghiul de la vrful
piramidei de 90:
1
1
1
1
]
1

1 0 0 0
0 1 0 0
0 0 ) y y ( d 2 0
0 0 0 ) x x ( d 2
min max
min max
N1
M
(4.15)
De exemplu, transformarea compus M
N1
M
N0
aplicat punctului din centrul
ferestrei de vizualizare, l transform ntr-un punct aflat pe axa z negativ (d este
negativ):
[ ] [ ]
T T
min max min max
1 d 0 0 = 1 d 2 / ) y + y ( 2 / ) x + x (
N0 N1
M M
Ultima component a transformrii de normalizare transform volumul de
vizualizare n volum canonic (paralelipiped dreptunghic). Matricea acestei
transformri, M
N2
, este asemntoare matricei descrise n paragraful precedent, dar se
ine seama de faptul c planul de vizibilitate apropiat nu mai coincide cu planul de
vizualizare:
1
1
1
1
]
1

0 1 0 0
n) nf/(f n) f /( f 0 0
0 0 1 0
0 0 0 1
N2
M
(4.16)
Sistemul normalizat astfel definit este un sistem de referin stng. n acest sistem
se efectueaz operaiile de decupare a obiectelor, dup care secvena transformrilor
necesare pentru generarea imaginii continu cu transformarea n sistemul de referin
ecran 3D.
Sistemul de referin ecran 3D
Transformarea n sistemul de referin ecran 3D efectueaz o coresponden ntre
fereastra din planul de vizualizare i zona de afiare alocat pe display numit poart
de afiare (viewport). Fereastra de vizualizare este definit ntr-un sistem de referin
bidimensional n planul z
N
= 0 al sistemului de referin normalizat. Poarta de afiare
este definit ntr-un sistem de referin bidimensional n planul z
S
= 0 al sistemului de
referin ecran 3D i este, n general, o zon rectangular de dimensiuni egale cu
numrul de pixeli corespunztori pe orizontal i pe vertical a zonei afiate. (Fig.
4.11). Transformarea din sistemul de referin normalizat n sistemul ecran 3D las
coordonata z nemodificat. Sistemul de referin ecran 3D astfel definit este un sistem
de referin stng, la fel ca i sistemul de referin normalizat.
Pentru definirea transformrii n sistemul de referin ecran 3D, se calculeaz mai
nti coordonatele centrului C
F
al ferestrei i ale centrului C
P
al porii:
2 ) y y ( y ; 2 ) x x ( x
2 ) y y ( y ; 2 ) x x ( x
min P max P CP min P max P CP
min max CF min max CF
+ +
+ +
(4.17)
Corespondena dintre coordonatele unui punct P(x
N
, y
N
) din fereastr cu ale
punctului P(x
S
, y
S
) n poarta de afiare se formuleaz matematic astfel:
Fig. 4.11 Transformarea de la fereastra de vizualizare la poarta de afiare.
x
N
y
N
x
min
x
S
y
S
x
max
y
min
y
max
x
Pmax
y
Pmax
y
Pmin
x
Pmin
P
y
N
x
N
P
x
S
y
S
C
F y
CF
x
CF
x
CP
y
CP
C
P
min max
min P max P
CF S
CP S
min max
min P max P
CF N
CP S
y y
y y
y y
y y
;
x x
x x
x x
x x


Se definesc factorii de scalare ai transformrii:
1 s
y y
y y
s
x x
x x
s
z
min max
min P max P
y
min max
min P max P
x

(4.18)
Rezult:
N S
CF y CP N y CF y CP S
CF x CP N x CF N x CP S
z z
y s y y s ) y y ( s y y
x s x x s ) x x ( s x x

+ +
+ +
(4.19)
Se poate deduce matricea de transformare ecran 3D prin compunerea a trei
transformri succesive. Mai nti se execut o translaie, astfel ca centrul C
F
al
ferestrei s ajung n origine, deci cu matricea de translaie T(x
CF
, y
CF
,0).
Fereastra centrat n origine se scaleaz cu factorii de scar s
x
, s
y
, definii de relaia
4.18, astfel nct fereastra s ajung la dimensiunea porii, iar coordonata z se las
nemodificat. Matricea de scalare este deci S(s
x
, s
y
, s
z
). Ultima transformare necesar
este o translaie, prin care centrul porii este adus n punctul C
P
, deci cu matricea de
translaie T(x
CP
, y
CP
, 0). Rezult matricea de transformare din sistemul de referin
normalizat n sistemul de referin ecran 3D:
1
1
1
1
]
1

1
1
1
1
]
1

1
1
1
1
]
1

1
1
1
1
]
1

1
1
1
1
]
1

1
1
1
1
]
1

N
N
N
N
S
S
S
S
CF y CP y
CF x CP x
CF
CF
y
x
CP
CP
w
Z
Y
X
w
Z
Y
X
;
1 0 0 0
0 1 0 0
y s y 0 s 0
x s x 0 0 s
1 0 0 0
0 1 0 0
y 0 1 0
x 0 0 1
1 0 0 0
0 1 0 0
0 0 s 0
0 0 0 s
1 0 0 0
0 1 0 0
y 0 1 0
x 0 0 1
NS NS
NS
M M
M
(4.20)
Din aceste relaii rezult Z
S
= Z
N
i w
S
= w
N
. n sistemul de referin ecran 3D se
trece de la coordonatele omogene X
S
, Y
S
, Z
S
, w
S
, la coordonatele tridimensionale x
S
,
y
S
, z
S
prin mprirea cu w
S
.
Planul z
S
= 0 din sistemul de referin ecran 3D este planul de proiecie.
Coordonatele x
S
i y
S
reprezint coordonatele proieciei ortografice n planul z
S
= 0
(care este planul de porii de afiare). Transformarea de proiecie perspectiv din
sistemul de referin de observare a devenit o transformare de proiecie ortografic n
sistemul de referin ecran 3D. Coordonata z
S
n sistemul de referin ecran 3D este
utilizat n algoritmii de eliminare a suprafeelor ascunse. Volumul de vizualizare n
sistemul ecran 3D este un paralelipiped dreptunghic cu baza un dreptunghi de
dimensiuni egale cu dimensiunile porii afiate i nlimea egal cu 1 (z
S
[0,1])
(Fig. 4.12).
Decuparea obiectelor
ntr-un sistem n care este definit punctul de observare i un volum de
vizualizare, nu intereseaz dect obiectele din interiorul acestui volum, a cror
proiecie se genereaz n fereastra de vizualizare. De aceea, n vizualizarea scenelor
tridimensionale, se execut operaia de decupare la volumul de vizualizare, prin care
se rein numai obiectele sau prile din obiecte cuprinse n acest volum.
Operaia de decupare la volumul de vizualizare poate fi definit astfel: fiind
dat un obiect tridimensional i un volum de vizualizare, pot exista trei posibiliti:
Obiectul este complet n interiorul volumului i, n acest caz, el este
proiectat n fereastr i redat pe display.
Obiectul este complet n afara volumului de vizualizare i, n acest caz, el
poate fi ignorat.
Obiectul intersecteaz volumul de vizualizare; n acest caz se decupeaz
obiectul i partea vizibil (cuprins n interiorul volumului) este proiectat
n fereastra de vizualizare i redat pe display.
Fig. 4.12 Volumul de vizualizare n sistemul de referin ecran 3D
z
S
x
S
y
S
1
0
Poarta de
afiare
Decuparea obiectelor tridimensionale la volumul de vizualizare se execut n sistemul de referin
normalizat n coordonate omogene, nainte de mprirea cu w.
Operaia de decupare n spaiul tridimensional reprezint o extindere a
decuprii n planul bidimensional, de aceea se va prezenta mai nti decuparea n plan.
Decuparea n plan
Fiind dat un poligon oarecare n plan i o regiune de decupare, problema
decuprii poligonului este de a reine numai acea parte din poligon care se afl n
interiorul regiunii de decupare. Se consider cazul cel mai frecvent ntlnit, n care
regiunea de decupare este un dreptunghi cu laturile paralele cu axele de coordonate.
Aceast regiune de decupare corespunde ferestrei de vizualizare.
Majoritatea algoritmilor de decupare, att n plan ct i n spaiu, se bazeaz
pe algoritmul de decupare Sutherland-Hodgman. Algoritmul Sutherland-Hodgman
mparte planul bidimensional n nou regiuni, dup poziia fa de regiunea
dreptunghiular de decupare dat prin ecuaiile a patru drepte: x = x
min
; x = x
max
;
y = y
min
; y = y
max
. (Fig. 4.13).
Fiecrei regiuni i corespunde un cod de vizibilitate (cunoscut sub numele de
cod Sutherland-Cohen) reprezentat pe 4 bii, b
0
, b
1
, b
2
, b
3
, definii astfel:
b
0
= semn(x x
min
)
b
1
= semn(x
max
x)
b
2
= semn(y y
min
)
b
3
= semn(y
max
y)
n continuare codurile de vizibilitate se reprezint ca o secven de cifre
binare.
Fig. 4.13 Codurile de vizibilitate Sutherland-Cohen.
0000 0010
0100
0001
1000
1001
0101
0110
1010
x = x
min
x = x
max
y = y
max
y = y
min
y
x
Un poligon oarecare din plan poate fi complet inclus n regiunea de decupare,
poate fi complet n afara regiunii de decupare sau o poate intersecta. Folosind codurile
de vizibilitate ale vrfurilor poligonului se pot identifica direct (fr s se execute
calcule de intersecii) dou situaii ale poligonului fa de regiunea de decupare:
Acceptare sigur. Dac toate vrfurile poligonului se afl n regiunea de
decupare, atunci polinomul este vizibil n ntregime. Fie c1, c2, ., cn,
codurile de vizibilitate ale celor n vrfuri ale poligonului i SC rezultatul
reuniunii acestor coduri (operaia OR inclusiv): SC = c1| c2 || cn. Dac
SC = 0, atunci poligonul este sigur vizibil (Fig. 4.14 (a)).
Rejecie sigur. Dac toate vrfurile unui poligon se afl ntr-unul din
semiplanele invizibile (x < x
min
; x > x
max
; y < y
min
; y > y
max
.), atunci tot
poligonul este sigur invizibil. Pentru efectuarea testului de rejecie sigur
se calculeaz intersecia codurilor de vizibilitate (operaia AND):
PC = c1 & c2 && cn. Dac PC are valoare diferit de 0, atunci
poligonul este sigur invizibil deoarece toate punctele se afl n semiplanul
invizibil corespunztor unui bit diferit de 0 din codul PC (Fig. 4.14 (b)).
Dac nu este ndeplinit nici condiia de acceptare sigur, nici condiia de rejecie sigur, atunci
decuparea se calculeaz prin intersecia laturilor poligonului cu dreptele care mrginesc regiunea de
decupare (Fig. 4.14 (c)).
Dreapta (infinit) corespunztoare unei laturi a regiunii de decupare mparte planul n dou semiplane:
semiplanul (regiunea) vizibil, care se afl de aceeai parte a dreptei ca i regiunea de decupare, i
semiplanul invizibil, care se afl de partea opus fa de regiunea de decupare. De exemplu, pentru latura
x = xmin, semiplanul x < xmin, este invizibil iar semiplanul x xmin este vizibil.
n algoritmul de decupare Sutherland-Hodgman, decuparea unui poligon fa de o regiune dat se
efectueaz ntr-un numr de pai egal cu numrul de laturi ale regiunii de decupare. n fiecare pas se
decupeaz poligonul (iniial sau provenit dintr-un pas anterior) cu o latur a regiunii de decupare: se
elimin acea poriune din poligon care se afl n semiplanul invizibil corespunztor laturii i se reine
numai poriunea vizibil.
(a) Acceptare sigur
SC = 0000
1010
0010
Rejecie sigur
PC = 0010
0010
1010
0110
Decupare prin intersecie
SC = 1111, PC = 0000
1000
0100
0010
0001
Poligonul se reprezint printr-o list ordonat de vrfuri V1V2Vn, i fiecare pereche de dou vrfuri
consecutive (Vi V i+1), pentru i < n, i (VnV1) reprezint o latur a poligonului ca un segment de dreapt
orientat (vector).
n fiecare pas de decupare se pornete de la un poligon dat printr-o list ordonat de vrfuri i se creeaz
lista vrfurilor poligonului rezultat prin decupare relativ la dreapta suport a unei laturi a regiunii de
decupare. Iniial, lista vrfurilor poligonului rezultat este considerat vid. Un segment orientat ViVj se
poate afla ntr-una din patru situaii posibile fa de o latur de decupare (Fig. 4.15).
(a) Dac ambele vrfuri se afl n semiplanul vizibil corespunztor laturii de decupare, atunci
se adaug n list vrful Vj (Fig. 4.15 (a)).
(b) Dac ambele vrfuri se afl n semiplanul invizibil, atunci nu se adaug nici un vrf n list
(Fig. 4.15 (b)).
(c) Dac primul vrf al segmentului (Vi) se afl n semiplanul vizibil, iar al doilea (Vj) se afl
n semiplanul invizibil (segmentul este orientat de la semiplanul vizibil ctre semiplanul
invizibil), atunci se calculeaz intersecia I dintre segment i dreapta de decupare i se
adaug intersecia I n list (Fig. 4.15(c)).
(d) Dac primul vrf al segmentului (Vi) se afl n semiplanul invizibil, iar al doilea (Vj) se
afl n semiplanul vizibil (segmentul este orientat de la semiplanul invizibil ctre
semiplanul vizibil), atunci se calculeaz intersecia I dintre segment i dreapta de decupare
n lista vrfurilor se adaug intersecia I i apoi vrful Vj (Fig. 4.15 (d)).
n primul pas, poligonul iniial V1V2Vn se decupeaz relativ la latura x = xmin prin parcurgerea n
ordine a tuturor segmentelor orientate ale poligonului (Fig. 4.16(a)). Poligonul rezultat se decupeaz
relativ la urmtoarea latur a regiunii de decupare (Fig. 4.16 (b)). Dup parcurgerea unui numr de pai
egal cu numrul de laturi ale regiunii de decupare se obine poligonul complet decupat (Fig. 4.16(d)).
Fig. 4.14 Teste de vizibilitate pentru decuparea n plan.
Semiplanul
vizibil
V
i
V
j
Semiplanul
invizibil
(a) V
i
vizibil,
V
j
vizibil
Se adaug V
j

Semiplanul
vizibil
V
i
V
j
Semiplanul
invizibil
(b) V
i
invizibil,
V
j
invizibil
Nu se adaug
nici un vrf
Semiplanul
vizibil
V
i
V
j
Semiplanul
invizibil
(d) V
i
invizibil,
V
j
vizibil
Se adaug I, V
j
I
Semiplanul
vizibil
V
i
V
j
Semiplanul
invizibil
(c) V
i
vizibil,
V
j
invizibil
Se adaug I
I
Fig. 4.15 Intersecia dintre o latur a poligonului i
o dreapt de decupare.
Semiplanul
vizibil
V4
y = y
min
Semiplan
invizibil
I
4
Semiplan
vizibil
V
3
V
1
I
1
I
2
Poligonul I
2
V
3
I
3
I
4
V
1
decupat
n semiplanul y y
min
I
1
I
2
I
3
I
6
I
5
y = y
max
Semiplan
invizibil
I
4
Semiplan
vizibil
I
5
V
1
I
1
I
2
Poligonul I
2
I
5
I
6
I
3
I
4
V
1
decupat
n semiplanul y y
min
I
1
I
2
I
3
I
6
I
8
I
7
Fig. 4.16 (c), (d) Decuparea relativ la laturile orizontale ale regiunii de decupare
n algoritmul Sutherland-Hodgman.
Poligonul rezultat este: I
5
I
6
I
3
I
7
I
8
I
1
I
2
x = x
min
Semiplan
invizibil
Semiplan
vizibil
V
3
V
2
V
1
I
1
I
2
Poligonul V
1
V
2
V
3
V
4
decupat
n semiplanul x x
min
x = x
min
Semiplan
vizibil
V
4
Semiplan
invizibil
V
3
V
1
I
1
I
2
Poligonul I
1
I
2
V
3
V
4
V
1
decupat
n semiplanul x x
max
I
4
I
3
Fig. 4.16 (a), (b) Decuparea relativ la laturile verticale ale regiunii de decupare
n algoritmul Sutherland-Hodgman.
n Fig.4.16 este ilustrat algoritmul de decupare Sutherland-Hodgman al unui poligon convex relativ la o
regiune de decupare rectangular, dar acest algoritm poate fi folosit n cazul general, al decuprii oricrui
tip de poligon (convex, concav sau cu guri) relativ la o regiune de decupare oarecare.
Decuparea (n plan sau n spaiu) poate fi executat n orice operaie care necesit construirea de
poligoare sau obiecte tridimensionale noi prin calcul, pornind de la obiecte de baz, care sunt intersectate
cu alte obiecte sau suprafee.
n generarea imaginilor bidimensionale, decuparea, ca operaie component a secvenei de transformri
de vizualizare, se efectueaz relativ la fereastra de vizualizare, care este o regiune rectangular.
Poligoanele sau liniile rezultate, limitate la dimensiunea ferestrei, sunt transformate n sistemul de
referin al porii de afiare i redate pe display. Dac nu se efectueaz decuparea poligoanelor la limitele
ferestrei, coordonatele vrfurilor n sistemul de referin al porii de afiare depesc limitele porii, iar
rezultatul conversiei de rastru este incorect.
Se poate efectua o decupare a poligoanelor i liniilor i n poarta de afiare, prin testul individual al
coordonatelor fiecrui pixel i rejectarea acelora care nu se ncadreaz n limitele porii de afiare. Acesta
este ns un procedeu deosebit de costisitor ca timp de execuie i nu se pune problema utilizrii lui n
grafica interactiv i n realitatea virtual.
Decuparea suprafeelor relativ la
volumul de vizualizare
Algoritmii de decupare a obiectelor n spaiul tridimensional pot fi considerai ca o extensie a
algoritmilor de decupare din plan, prin nlocuirea regiunii de decupare plane cu un volum de decupare i
efectuarea calculelor de intersecie a unei suprafee n spaiu cu planele volumului de decupare.
Decuparea la volumul de vizualizare este un caz particular al decuprii spaiale, n care volumul de
decupare este volumul de vizualizare (trunchiul de piramid de vizualizare) definit n sistemul de referin
de observare.
n continuare se analizeaz modul de execuie a decuprii pentru sistemul de vizualizare definit n
sectiunea precedent (Fig. 4.5) i se va evidenia de ce decuparea se execut cel mai eficient n sistemul
de referin normalizat, afirmaie care nu a fost nc motivat.
Volumul de decupare se definete prin ase plane n sistemul de referin de observare, ale cror ecuaii
sunt date de relaiile 4.9.
Fiecare plan mparte spaiul tridimensional n dou semispaii, semispaiul vizibil, aflat de aceeai parte a
planului ca i volumul de decupare, i semispaiul invizibil, n partea opus a volumului. Decuparea unei
suprafee n raport cu acest plan se efectueaz asemntor cu decuparea unui poligon fa de o latur de
decupare: fiecare latur orientat introduce zero, unul sau dou vrfuri n lista se vrfuri a suprafeei
rezultate, n funcie de orientare i de intersecia ei cu planul. Un vrf este vizibil n raport cu un plan dac
se afl n semispaiul vizibil determinat de planul dat. De exemplu, un vrf este vizibil n raport cu planul
d hz = y
V V
, dac yV hzV/d (Fig. 4.17 (a)).
n mod asemntor, decuparea relativ la celelate plane ale volumului de decupare necesit testele:
f z ; d z ; z
d
g
x ; z
d
g
x ; z
d
h
y
V V V V V V V V
(4.21)
Aceste teste implic operaii asupra coordonatelor vrfurilor, operaii care n form matriceal nseamn
nmulirea cu matricea MN1, component a matricei de normalizare. Aa cum se poate observa n Fig.
4.17(b), matricea MN1 transform sistemul de referin de observare ntr-un sistem de referin Oxyz,
n care volumul de vizualizare (deci volumul de decupare) este un trunchi de piramid regulat cu unghiul
de la vrful piramidei de 90. Relaiile 4.21 de testare a vizibilitii unui punct n sistemul de referin de
observare sunt echivalente cu urmtoarele relaii n sistemul Oxyz:
x z; x z; y z; y z; z f; z d (4.22)
Dac s-ar executa decuparea n sistemul de referin intermediar Oxyz, atunci toate punctele din
sistemul de referin de observare se transform mai nti cu matricea MN1, pentru trecerea n sistemul
Oxyz, apoi se execut decuparea, iar dup decupare, vrfurile vizibile se transform cu matricea MN2,
pentru trecere n sistemul de referin normalizat i proiecie n fereastra de vizualizare (Fig. 4.17(c)).
Aplicarea separat a dou transformri, mai nti prin matricea MN1 i apoi prin matricea MN2 este
costisitoarte i nenecesar, dat fiind c decuparea se poate face direct n sistemul normalizat (Fig. 4.17
(c)).
y
V
= hz
V
/d
y
V
z
V
y
V
= hz
V
/d
z
V
= d z
V
= f
y

= z

= d z

= f
1
1
1
1
]
1

1 0 0 0
0 1 0 0
0 0 d h 0
0 0 0 d g
N1
M
z
N
y
N
z
N
= 1 z
N
= 0
y
N
= 1
y
N
= 1
(a) (b)
1
1
1
1
]
1

0 1 0 0
d) - (f fd - ) d - f ( f 0 0
0 0 1 0
0 0 0 1
N2
M
(c)
(a) Volumul de decupare
n sist. ref. de observare
(b) Volumul de decupare
n sist. Oxyz
(c) Volumul de decupare
n sist. ref. normalizat
Fig. 4.17 Volumul de decupare n sistemul de vizualizare.
(proiecie n planul x = 0)
n sistemul de referin normalizat volumul de decupare este un paralelipiped dreptunghic cu suprafeele
paralele cu planele sistemului de coordonate. Testele de vizibilitate ale unui punct n raport cu planele
volumului de decupare sunt:
xN 1; xN 1; yN 1; yN 1; zN 1; zN 0; (4.23)
Aceste teste se pot efectua direct n coordonatele omogene n sistemul normalizat, fr s mai fie necesar
mprirea cu wN:
XN wN ; XN wN ;
YN wN ; YN wN ; (4.24)
ZN wN ; ZN 0;
Codul de vizibilitate C al unui vrf n coordonate normalizate omogene se exprim pe 6 bii i
fiecare bit se poziioneaz n funcie de rezultatul unuia din testele din relaia 4.24:
b
0
= semn(X
N
w
N
)
b
1
= semn(w
N
X
N
)
b
2
= semn(Y
N
w
N
)
b
3
= semn(w
N
Y
N
)
b
4
= semn(Z
N
w
N
)
b
5
= semn(Z
N
)
Spaiul omogen normalizat se mparte n 27 de regiuni dup poziia lor fa de planele care
definesc volumul canonic de vizualizare. n interiorul volumului canonic, toate punctele au codul de
vizibilitate cu toi biii egali cu 0 (C = 000000). n toate celelalte regiuni, codul de vizibilitate este diferit
de 0, avnd unul sau mai muli bii egali cu 1.
Algoritmul Sutherland-Hodgman de decupare n spaiu se desfoar n mod asemntor cu
algoritmul de decupare n plan. Pentru o suprafa dat prin vrfurile ei n spaiu, decuparea relativ la un
volumul dat prin ecuaiile planelor sale se efectueaz n modul urmtor:
(1) Se calculeaz codurile de vizibilitate ale vrfurilor suprafeei.
(2) Se efectueaz testele de acceptare i rejecie sigur. Pentru suprafeele care nu ndeplinesc
nici unul din aceste teste se continu cu decuparea prin intersecia cu volumul de decupare.
(3) Decuparea prin intersecie a unei suprafee se efectueaz ntr-un numr de pai egal cu
numrul de plane ale volumului de decupare. n fiecare pas se obine o nou suprafa, din
care a fost eliminat poriunea invizibil n raport cu planul de decupare respectiv.
Dup efectuarea decuprii, se calculeaz coordonatele xN, yN, zN ale vrfurilor suprafeelor vizibile
rezultate (prin mprirea cu wN), iar toate celelalte vrfuri (ale suprafeelor invizibile) sunt ignorate. Acest
lucru nseamn c operaia de mprire omogen se execut pentru un numr strict necesar de vrfuri,
ceea ce reprezint un ctig n viteza de execuie.
Se pune problema dac nu ar fi mai simplu s fie efectuat decuparea n plan, deci dup calculul
proieciilor suprafeelor, dat fiind c algoritmul de decupare n plan este mai simplu. Acest lucru ar
nsemna ca toate suprafeele s fie proiectate pe planul de vizualizare, dup care s se efectueze decuparea
relativ la fereastra de vizualizare. Aceast soluie este ns inacceptabil, datorit faptului c n fereastra
se proiece se proiecteaz att punctele (vrfuri ale suprafeelor) aflate n volumul de vizualizare, ct i
cele aflate ntr-un volum simetric cu acesta fa de planul zV = 0, care se afl n spatele observatorului.
Tratarea tuturor acestor suprafee proiectate n fereastra de vizualizare dar invizibile, consum un timp de
execuie n mod inutil. De aceea, decuparea obiectelor la volumul de vizualizare nu se poate executa
corect i eficient dect n spaiul tridimensional, i anume n coordonate normalizate omogene.
Eliminarea obiectelor aflate n
exteriorul
volumului de vizualizare
Se poate detalia modul de execuie a decuprii relativ la volumul de vizualizare. Algoritmul de baz se
refer la decuparea unei suprafee n spaiu, dat ca o succesiune de vrfuri i, implicit, o succesiune de
segmente de dreapt orientate (laturile suprafeei), relativ la un volum de decupare, care este volumul
canonic n coordonate omogene normalizate.
Decuparea punctelor n spaiu este un simplu test de vizibilitate (ecuaiile 4.24), iar decuparea unei linii
este un caz particular (cu n = 2) al algoritmului de decupare a unei suprafee.
Decuparea unui obiect tridimensional, modelat ca o colecie de fee (suprafee plane) se reduce la
decuparea fiecrei fee n parte, iar obiectul rezultat este compus din toate feele sale vizibile i prile
rezultate prin decupare.
O cretere a eficienei n operaia de decupare se poate obine folosind teste de rejecie i de acceptare
sigur nu numai pentru fiecare suprafa n parte, dar i pentru un obiect tridimensional n ntregime.
Procedeul de calcul al reuniunii (SC) i al interseciei (PC) codurilor de vizibilitate ale unui obiect
tridimensional depinde de modul de reprezentare al acestuia. Pentru obiectele tridimensionale modelate
prin fee date ca list de indeci la vrfuri se calculeaz direct valorile SC i PC ale celor N vrfuri ale
obiectului. Pentru obiecte reprezentate prin fee separate, se pot colecta codurile de vizibilitate ale feelor
componente i calcula reunuinea SC i intersecia PC. Testul de acceptare sau rejecie sigur (Culling)
a unui obiect tridimensional este prezentat n pseudocod asemntor limbajului C astfel:
int Culling(){
PC = 0x3F;
SC = 0;
for (i=0; i<N; i++){
SC = SC | Ci;
PC = PC & Ci;
}
if (PC) {
Obiect sigur invizibi, va fi rejectat;
return 0;
}
else if (SC){
Obiect sigur vizibil n ntregime;
Nu se va mai testa fiecare suprafa;
return 1;
}
else {
Se va decupa fiecare suprafa;
return 1;
}
}
Ce anume se execut n fiecare din situaii depinde, evident, de modul de organizare al programului i de
biblioteca grafic folosit. n orice caz, dac obiectul este sigur invizibil, atunci se abandoneaz toate
operaiile referitoare la acest obiect i se trece la obiectul urmtor.
Selecia obiectelor, adic identificarea obiectelor potenial vizibile pentru redarea imaginii acestora i
eliminarea obiectelor sigur invizibile (culling), este o resurs puternic de cretere a eficienei de redare a
scenelor virtuale. n scenele virtuale de dimensiuni mari, care conin un numr mare de obiecte, n fiecare
cadru de imagine sunt vizibile i deci trebuie s fie prelucrate un numr mult mai mic obiecte dect
numrul total de obiecte ale scenei. De aceea, identificarea ct mai devreme posibil a obiectelor sigur
invizibile i eliminarea lor conduce la reducerea substanial a timpului de redare a scenei. n redarea
scenelor complexe, acest procedeu se implementeaz mai eficient dect modul simplu descris mai sus
prin definirea volumului de delimitare a obiectelor.
Volumul de delimitare
Volumul de delimitare (bounding box) al unui obiect sau al unui grup de obiecte (ierarhie de obiecte) este
un volum definit ct mai simplu, care include toate vrfurile obiectelor i are dimensiuni minime. Se
folosesc ca volume de delimitare paralelipipede dreptunghice sau sfere.
Fiind dat un obiect cu un volum de delimitare, testul de eliminare (culling) se efectueaz asupra
volumului de delimitare: se calculeaz intersecia codurilor de vizibilitate ale vrfurilor volumului de
delimitare i, dac este diferit de zero, atunci volumul de delimitare i implicit, ntregul obiect este
invizibil i abandonat.
Aceast modalitate de reprezentare i prelucrare a obiectelor este aproape unanim adoptat n realitatea
virtual, datorit execuiei eficiente a testului: decizia de eliminare a unui obiect se poate lua prin
considerarea unui numr de opt vrfuri, n locul unui numr foarte mare de vrfuri ct are un obiect n
mod obinuit.
Volumul de delimitare al unui obiect se definete n sistemul de referin local (de modelare) al obiectului,
ca un paralelipiped dreptunghic cu muchiile paralele cu axele de coordonate. Un astfel de paralelipiped se
poate specifica prin coordonatele a dou vrfuri opuse (xmin, ymin, zmin) i (xmax, ymax, zmax). Vrfurile lui sunt
transformate din sistemul de referin local n alte sisteme de referin (universal, de observare, etc.), la
fel ca i vrfurile obiectului. Calculul codurilor de vizibilitate i testul de eliminare se poate efectua n
sistemul de referin de observare sau n alt sistem de referin (sistemul normalizat) dac biblioteca
grafic permite accesul la coordonatele n acest sistem.
n Fig. 4.18 sunt reprezentate trei obiecte n poziii diferite fa de volumul de vizualizare. Volumul de
delimitare al primului obiect este complet exterior fa de volumul de vizualizare i obiectul
corespunztor (ceainic teapot) este ignorat pentru punctul de observare dat. Cel de-al doilea obiect
(icosaedru) este complet vizibil, volumul su de delimitare fiind inclus n volumul de vizualizare. Pentru
cel de-al treilea obiect (sfer reprezentat wireframe), volumul de delimitare intersecteaz volumul de
vizualizare i trebuie s fie executat decuparea suprafeelor sale relativ la volumul de vizualizare.
z
V
x
V
y
V
O
V
Fig. 4.18 Eliminarea obiectelor (culling) pe baza volumului de delimitare
(bounding box).
n scenele virtuale modelate ierarhic se construiesc volume de delimitare la fiecare nivel de ierarhie i
obiectele sau grupurile de obiecte sunt selectate pe baza testului de eliminare efectuat asupra volumului
de delimitare corespunztor.
Detecia coliziunii
Detecia coliziunii este un aspect important n modelarea mediului virtual, prin faptul c simuleaz un
aspect realist al mediului: obiectele reale nu pot trece unele prin altele; atunci cnd un obiect se atinge de
un altul exist un rspuns de coliziune: deformarea obiectelor, schimbarea traiectoriei de deplasare,
explozia, etc. La interaciunea dintre utilizator i obiectele virtuale se pot produce fore, vibraii, i alte
reacii tactile care sunt prelucrate n sistem.
Detecia coliziunii se poate calcula aproximativ, folosind volumele de delimitate, sau exact, prin
considerarea tuturor punctelor obiectelor. Dat fiind c volumul de delimitare depeste n multe puncte
suprafaa de frontier a obiectului, calculul aproximativ al coliziunii introduce coliziuni false ntre
obiecte: nu obiectele s-au atins ci volumele lor de delimitare.
Generarea exact a coliziunii se calculeaz ca a doua etap dup calculul aproximativ al coliziunii. Dac
dou obiecte au volumele de delimitare disjuncte, atunci ele sigur nu se ating. Dac dou obiecte au
volume de delimitare care se ating sau interptrund, atunci se calculeaz coliziunea exact prin
considerarea tuturor punctelor obiectelor
5
Transformarea de rastru
Transformarea de rastru (rasterization) este o conversie de la reprezentarea
prin coordonatele vrfurilor a unui segment sau a unui poligon (primitiv geometric),
la reprezentarea prin mulimea corespunztoare de pixeli care se afieaz pe display.
Transformarea de rastru se mai numete 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 implic trecerea de la spaiul bidimensional continuu
(poarta de afiare definit n planul x
S
= 0 al sistemului de referin ecran 3D) la
spaiul discret al imaginii (Fig. 5.1)
(b)
x
S
y
S
(a)
x
i
y
i
x
k
x
k
+1
y
k
+1
y
k
x
k

y
k

Spaiul imagine este un tablou bidimensional de locaii discrete numite pixeli,
fiecare pixel avnd o adres care corespunde poziiei n imagine a acesteia.
Dimensiunea imaginii este specificat prin numrul de pixeli pe orizontal (M),
respectiv pe vertical (N), care pot fi afiai n zona de ecran atribuit porii de afiare.
Dimensiunea maxim a imaginii depinde de rezoluia display-ului folosit.
Un pixel ocup n poarta de afiare o zon ptrat de dimensiune 1 x 1 a crui
adres este dat de coordonata colului stnga-jos. De exemplu, pixelul de adres
(x
k
, y
k
) din spaiul imagine corespunde unui ptrat din poarta de afiare cu colurile de
coordonate (x
k
, y
k
) (x
k
+1, y
k
) (x
k
+1, y
k
+1) (x
k
, y
k
+1), unde x
k
i y
k
sunt numere ntregi.
n mod simplificat se consider c imaginea pe ecran a pixelilor este format din zone
ptrate adiacente, dar, n realitate, imaginea pe ecran a unui pixel este o zon circular,
iar aceste cercuri nu sunt adiacente ci se ntreptrund.
Un pixel din spaiul imagine se reprezint prin culoarea lui, care se
memoreaz ntr-un buffer de imagine. Adresa pixelului n spaiul imagine determin
adresa n bufferul de imagine n care se memoreaz culoarea acestuia.
Din coordonatele x i y ale vrfurilor primitivelor geometrice n poarta de
afiare se calculeaz ecuaiile segmentelor de dreapt (laturile), iar mulimea de pixeli
generat n spaiul imagine trebuie s aproximeze ct mai bine segmentele de dreapt
sau interiorul poligoanele delimitat prin laturile sale (Fig.5.1).
Transformarea de rastru a segmentelor sau poligoanelor calculeaz adresa
fiecrui pixel din mulimea de pixeli prin care se aproximeaz primitiva geometric
dat i nscrie la adresa corespunztoare din bufferul de imagine intensitatea de
culoare a pixelului respectiv.
Culoarea pixelului poate fi o culoare constant, rezultat din atributul de
culoare al primitivei geometrice sau din condiii de umbrire constant (poligonal), i
atunci aceast culoare se nscrie la toate adresele pixelilor care aparin primitivei
geometrice n bufferul de imagine. n cazul umbririi Gouraud, culoarea fiecrui pixel
se calculeaz prin interpolare, concomitent cu calculul adresei pixelilor n
transformarea de rastru.
Concomitent cu transformarea de rastru, se poate executa operaia de
eliminare a suprafeelor ascunse, folosind coordonata z
S
(adncimea) vrfurilor
primitivelor geometrice calculate n sistemul de referin ecran 3D (algoritmul de tip
buffer de adncime (Z-buffer)).
n cele mai multe din sistemele grafice actuale, transformarea de rastru,
umbrirea i eliminarea suprafeelor ascunse se execut intercorelat, ntr-o singur
scanare (baleiere) a primitivei geometrice. La sistemele evoluate se adaug la acestea
i operaiile de netezire a liniilor (anti-aliasing) i de texturare.
nainte de descrierea operaiilor de generare a primitivelor geometrice, se va
descrie modul n care sunt reprezentate i redate culorile n grafica pe calculator.
Fig. 5.1 (a) Spaiul bidimensional continuu al porii de afiare
(b) Spaiul bidimensional discret al imaginii
Reprezentarea culorilor n sistemele
grafice
Imaginea care se obine pe display este compus dintr-un anumit numr de
pixeli, dat de rezoluia display-ului. Fiecare pixel are o poziie pe ecran, dat de adresa
lui n poarta de afiare, i o culoare care poate fi reprezentat n mai multe modele:
modelul RGB, modelul HSV, modelul HLS, i altele. Dintre aceste modele, n grafic
se folosete cel mai frecvent modelul RGB.
Modelul RGB
n modelul RGB, culoarea este reprezentat printr-un triplet de culori primare,
rou (red) verde (green), albastru (blue). Utilizarea preponderent a modelului RGB
n grafic se datoreaz n primul rnd faptului c monitoarele color folosesc acest
model de producere a culorii. Culoarea este produs pe ecranul unui monitor prin
excitarea a trei puncte adiacente de substan fosforescent de culori rou, verde i,
respectiv, albastru. Punctele fosforescente fiind apropiate, ochiul percepe tripletul de
puncte ca un singur punct a crui culoare este suma celor trei componente.
Spaiul de reprezentare a tuturor culorilor n modelul RGB este un cub ntr-un
sistem de coordonate cu axele notate Red, Green, Blue (Fig. 5.2).
Orice culoare n modelul RGB se exprim printr-un triplet (r,g,b) i i
corespunde un punct n spaiul RGB al crui vector C este:
C = rR+gG+bG
(5.1)
unde R, G, B sunt versorii axelor Red, Green, Blue. n acest model culoarea negru
este reprezentat prin tripletul (0,0,0), iar culoarea alb este reprezentat prin tripletul
(1,1,1).
n sistemele grafice se mai folosete o variant a modelului RGB, modelul
RGBA, unde cea de-a patra component () indic transparena suprafeei. Valoarea 1
Red
White
Yellow
Green
Blue
Magenta
Cyan
Black
Fig. 5.2 Spaiul culorilor n modelul RGB
a acestei componente (=1) nseamn suprafa opac, iar valoarea minim (=0)
nseamn suprafa complet transparent. Dac transparena unei suprafee este
diferit de zero, atunci culoarea care se atribuie pixelilor acestei suprafee se modific
n funcie de culoarea existent n bufferul de imagine n poziiile corespunztoare.
Culoarea rezultat a unui pixel este C= f(,C,C
P
), unde:
C(r,g,b) este culoarea suprafeei
este transparena suprafeei, cu valori ntre 0 i 1
C
P
(r
P
,g
P
,g
P
) este culoarea precedent a pixelului, aflat n bufferul de
imagine
C(r,g,b) este noua culoare a pixelului, rezultat prin aplicarea unei
funcii f fiecrei componente de culoare
Bibliotecile grafice permit definirea mai multor funcii f de combinare liniar
ntre culoarea transparent cu culoarea de fond.
Modelul HSV
Modelul HSV reprezint o transformare neliniar a spaiului RGB, prin care
culorile sunt specificate prin componentele: nuan (hue), saturaie (saturation) i
valoare (value). Modelul HSV este folosit n definirea mai intuitiv a culorilor
(perceptual), dect selecia unor culori primare. De exemplu, sarcina de a modifica o
culoare astfel nct s fie mai luminos, mai palid, mai galben, etc, se
realizeaz mult mai simplu n modelul HSV dect n modelul RGB.
Spaiul culorilor n modelul HSV este o piramid hexagonal ntr-un sistem de
coordonate polare HVS (Fig. 5.3)
Definiiile parametrilor H, S, V sunt legate de modul n care este perceput
culoarea:
Nuana (hue) este acea calitate prin care ochiul distinge o familie de culori
de alt familie de culori, de exmplu rou de galben, verde de albastru, etc.
V
S
H
Cyan
Green
Red
Yellow
White
Black
Blue
Magenta
Fig. 5.3 Spaiul culorilor n modelul HSV.
Saturaia (saturation), numit i cromicitate (chroma) este calitatea culorii
prin care se distinge o culoare puternic de o culoare slab. Se mai poate
defini ca intensitatea culorii sau distana fa de nuana gri.
Valoare (value) este calitatea prin care se distinge o culoare luminoas de
o culoare ntunecat.
n modelul HVS, variaia parametrului H (ntre 0 i 360) corespunde seleciei
culorii. Scderea parametrului S (desaturarea culorii) nseamn adugarea de alb.
Scderea parametrului V (devaluarea culorii) nseamn adugare de negru. Conversia
din spaiul RGB n spaiul HSV se nelege mai uor ntr-o interpretare geometric:
hexagonul din reprezentarea HVS se obine prin proiectarea cubului RGB pe un plan
normal la diagonala principal, pe direcia diagonalei principale. Corespondena dintre
vrfurile hexagonului de baz HSV i vrfurile cubului RGB este:
RGB HSV
100 red 0,1,1 (H este msurat n grade)
110 yellow 60,1,1
010 green 120,1,1
011 cyan 180,1,1
001 blue 240,1,1
101 magenta 300,1,1
Pentru aceei definiie a unei culori (de exemplu, prin tripletul rgb) este
posibil ca monitoare diferite s genereze culori diferite, datorit caracteristicilor
constructive diferite ale monitoarelor. n general, ntre componenta de culoare
transmis unui monitor i intensitatea produs de ecranul monitorului exist o relaie
neliniar de forma:
( ) ( ) ( )
b g r '
i m
'
i m
'
i m
B K = B ; G K = G ; R K = R

(5.2)
unde ia valori ntre 2.3 i 2.8.
Linerizarea relaiei ntre valorile componentelor culorii produse prin program
i intensitile generate pe ecran se numete corecie gama (gamma corection).
Corecia gama se realizeaz aplicnd o transformare care, compus cu transformarea
5.3 s asigure o relaie liniar ntre culoarea (R
i
, G
i
, B
i
) generat prin program i
culoarea (R
m
, G
m
, B
m
) generat pe ecranul monitorului. Acest transformare este:
( ) ( ) ( )
b g r
1
i
'
i
1
i
'
i
1
i
'
i
B k = B ; G k = G ; R k = R

(5.3)
Corecia gama se poate impelementa printr-o tabel de cutare (look-up table)
ncorporat n controlerul grafic, care transform valorile R
i
, G
i
, B
i
citite din bufferul
de imagine n valorile corespunztoare
'
i
'
i
'
i
B , G , R transmise monitorului. Lipsa
coreciei gama sau o corecie gama calculat eronat, produce imagini incorecte.
Generarea segmentelor de dreapt
n orice bibliotec grafic se gsete o funcie care poate fi apelat pentru
generarea unui segment de dreapt. De exemplu funcia line() din biblioteca
compilatorului Borland C, sau funcia LineTo() din interfaa Win32API, traseaz o
linie n ferestra de afiare a programului.
Se consider un segment de dreapt AB dat prin capetele lui (x
A
,y
A
), (x
B
,y
B
)
n sistemul de coordonate poarta de afiare (Fig. 5.4). Ecuaia dreptei care trece prin
aceste puncte este y = ax+b, unde a = (y
B
y
A
)/(x
B
x
A
), b = y
A
ax
A
n acelai sistem de referin, adresa unui pixel este dat de coordonatele
colului lui stnga-jos, deci pixelul de adres (x
k
,y
k
) este un ptrat cu colurile
(x
k
,y
k
), (x
k
+1,y
k
), (x
k
+1,y
k
+1), (x
k
,y
k
+1), unde x
k
i y
k
sunt numere ntregi.
Dac x
1
x
2
, atunci se calculeaz secvena de puncte pe dreapt:
(x
1
= x
A
, y
1
= ax
1
+b),
(x
2
= x
1
+1, y
2
= ax
2
+b),.(x
i
, y
i
= ax
i
+b).
Fiecrui punct pe dreapt i se asociaz un pixel a crui adres n sistemul de
referin imagine se aproximeaz prin trunchierea sau rotunjirea coordonatelor
punctului n sistemul de referin de afiare:
x
i
= (int)x
i
sau x
i
= (int)(x
i
+0.5)
y
i
= (int)y
i
sau y
i


= (int)(y
i
+0.5)
n acest mod se obine transformarea n spaiul imagine a unui segment de
dreapt, reprezentat prin mulimea pixelilor care aproximeaz segmentul de dreapt
dat.
Aplicarea direct a formulei de calcul a punctelor de pe dreapt are
dezavantajul c necesit mai multe operaii (adunare, nmulire) n numere flotante
pentru fiecare pixel, operaii care au timp de execuie ridicat. Un alt dezavantaj al
acestei metode este c genereaz segmente de dreapt ntrerupte dac a > 1 (Fig. 5.
4(b)).
Fig. 5.4 Generarea segmentelor de dreapt
prin aplicarea direct a relaiilor de calcul.
(a) a = 0.5
(b) a=2
x x
y y
A
B
A
B
nlturarea acestor inconveniente se face prin utilizarea algoritmilor
incrementali n care se evit repetarea operaiilor de nmulire n virgul flotant,
folosind trecerea prin incrementare de la un punct la urmtorul. Pentru obinerea
segmentelor de dreapt fr ntrerupri se trateaz separat cazurile abs(a) 1 i
abs(a)>1.
Dac abs(a) 1 i x
A
x
B
, se ncepe generarea din punctul x
1
= x
A
,
y
1
= y
A
i la fiecare pas se incrementez x cu 1, deci se iau punctele de pe dreapt care
au: x
1
=x
A
, x
2
=x
1
+1, x
i
,x
i+1
=x
i
+1,.. Dat fiind c y
i
= ax
i
+b, rezult c
y
i+1
= ax
i+1
+b = a(x
i
+1)+b, deci y
i+1
= y
i
+a. Deci, pentru trecerea de la
un punct la urmtorul, x se incrementeaz cu 1, iar y se incrementeaz cu valoarea
pantei. Punctului de pe dreapt de coordonate (x
i
, y
i
), i corespunde un pixel a crui
adres n spaiul imagine se calculeaz prin trunchiere sau rotunjire.
Dac abs(a) 1 i x
A
> x
B
, se ncepe generarea din punctul x
1
= x
B
,
y
1
= y
B
i restul calculelor se continu la fel ca n cazul precedent.
Dac abs(a) >1 i x
A
x
B
, se ncepe generarea segmentului din
punctul x
1
= x
A
, y
1
= y
A
i la fiecare pas se incrementeaz y cu 1, deci se calculeaz
punctele care au: y
1
=y
A
, y
2
=y
1
+1,.y
i
, y
i+1
= y
i
+1, Deoarece x
i
=(y
i
-
b)/a, rezult c x
i+1
=(y
i+1
-b)a = x
i
+1/a. Deci, pentru trecerea de la un
punct la urmtorul, y se incrementeaz cu 1, iar x se incrementeaz cu inversul pantei
dreptei.
Dac abs(a) > 1 i x
A
> x
B
, se ncepe generarea din punctul x
1
= x
B
,
y
1
= y
B
, i restul calculelor se continu la fel ca n cazul precedent.
Algoritmul incremental de generare a primitivelor geometrice are mai multe
variante de implementare, n funcie de situaia n care este aplicat. Pentru segmente
de dreapt, se adapteaz algoritmul incremental astfel nct s se genereze segmente
fr ntreruperi, folosind numai operaii cu numere ntregi. Aceast variant este
cunoscut sub numele de algoritmul Bresenham. Pentru generarea poligoanelor,
varianta de algoritm incremental este algoritmul de baleiere pe linii (scan-line).
Algoritmul Bresenham se bazeaz pe metoda incremental, dar este optimizat
astfel nct folosete numai operaii cu numere ntregi. Datorit acestei proprieti, el
poate fi implementat hardware i, n majoritatea cazurilor, operaiile de generare a
segmentelor de dreapt din acceleratoarele grafice se bazeaz pe o implementare
hardware a algoritmului Bresenham. Descrierea detaliat a algoritmului Bresenham se
poate gsi n bibliografie [Mold96].
Indiferent de algoritmul de conversie folosit pentru generarea liniilor, trecerea
de la spaiul bidimensional continuu, n care poziia punctelor este reprezentat prin
numere reale, la reprezentarea n spaiul discret al imaginii, este o aproximare prin
eantionare, care produce erori de reprezentare. Din cauza acestei aproximri, orice
linie dreapt (cu excepia celor orizontale sau verticale) apare zimat (jagged), ca o
scar de segmente de dreapt succesive, aa cum se poate observa n orice imagine
generat pe un display sau reprodus pe imprimant, inclusiv n textul de fa.
Imaginea de scar este cu att mai pregnant cu ct rezoluia display-ului (numrul de
pixeli pe orizontal i pe vertical) este mai mic. Dac rezoluia crete, aspectul
nedorit de scar este atenuat, dar nu este eliminat. Netezirea liniilor se poate obine
prin diferite metode de filtrare, metode cunoscute sub numele de filtrare anti-aliasing.
Generarea poligoanelor
Metoda cea mai frecvent folosit pentru generarea mulimii pixelilor prin care
se aproximeaz o suprafa poligonal este metoda de baleiere pe linii a poligonului
(algoritmul scan-line). Principiul de baz al acestei metode pentru un poligon convex
este prezentat n Fig. 5.5.
Se consider poligonul ABCDE, care reprezint proiecia n planul z
S
=0
al sistemului de referin ecran 3D, a unei suprafee ABCDE din spaiul tridimensional
universal. Poligonul este baleiat cu o linie orizontal care ia valori succesive, y
1
,
y
2
,y
i
, y
i+1
.., unde y
1
este valoarea coordonatei y minim a vrfurilor
poligonului, iar y
i+1
= y
i
+1. Pentru fiecare poziie y
i
a liniei de baleiere, se
calculeaz interseciile x
i,1
, x
i,2
cu dou din laturile poligonului. Pixelii a cror
adrese sunt cuprinse n intervalul (x
i,1
,y
i
), (x
i,2
,y
i
), aparin poligonului i sunt
prelucrai n mod corespunztor. Pentru algoritmul simplu de generare a poligoanelor,
culoarea poligonului (cunoscut ca atribut a feei corespunztoare a obiectului) este
nscris n bufferul de imagine la toate adresele cuprinse n intervalul respectiv. n
algoritmii n care se combin generarea cu eliminarea suprafeelor ascunse sau
umbrire, se prelucreaz toi pixelii corespunztori acestui interval.
Fie urmtoarele ecuaii ale laturilor stnga i dreapta cu care se intersecteaz
dreapta y = y
i
:
x = m
1
y + n
1

x = m
2
y + n
2
(5.4)
Pentru situaia din Fig.5.5, intersecia dreptei y = y
i
are loc cu laturile AB
i BC, pentru care coeficienii din ecuaiile de mai sus au valorile:
m
1
= (x
A
x
B
)/(y
A
y
B
), n
1
= x
B
m
1
y
B
m
2
= (x
C
x
B
)/(y
C
y
B
), n
2
= x
C
m
2
y
C
(5.5)
Fig. 5.5 Principiul baleierii pe linii a poligoanelor (scan-line)
x
y
x
i,1
y
i+1
=y
i
+1
y
i
x
i,2
x
i+1,2
x
i+1,1
B
A
C
D
E
y
1
M
i,2
M
i+1, 2
M
i,1
M
i+1,1
Interseciile corespunztoare sunt: x
i,1
= m
1
y
i
+n
1
, x
i,2
= m
2
y
i
+n
2
.
Coordonatele interseciilor liniei urmtoare de baleiere y = y
i+1
, unde
y
i+1
= y
i
+1, se pot calcula din coordonatele precedente folosind coeficienii m
1
i m
2
ai laturilor intersectate:
x
i+1,1
= x
i,1
+ m
1

x
i+1,2
= x
i,2
+ m
2
(5.6)
Secvena de pixeli ai cror adrese sunt cuprinse n intervalul (x
i+1,1
, y
i+1
),
(x
i+1,2
, y
i+1
) aparin poligonului pe linia de baleiere y = y
i+1
i sunt tratai
corespunztor.
Acesta este principiul de baz al baleierii pe linii (scan-line). Cazurile particulare,
cnd se schimb latura cu care are loc intersecia (la colurile poligonului), sau cnd
exist laturi orizontale, se trateaz separat.
Algoritmul de baleiere pe linie se poate implementa i pentru poligoane
concave. n acest caz, o linie de baleiere poate interesecta mai multe perechi de laturi,
rezultnd mai multe segmente de interecie i deci mai multe secvene de pixeli care
aparin poligonului (Fig. 5.6(a)). n general, ns, poligoanele concave sau cu guri se
trateaz pe mai multe nivele. Acceleratoarele grafice implementeaz hardware
automate de generare a unor suprafee convexe simple (triunghiuri sau trapeze).
Descompunerea unui poligon convex n mai multe triunghiuri este o operaie simpl
care, de cele mai multe ori, este preluat de biblioteca grafic, care pune la dispoziie
funcii de generare a poligoanelor convexe cu un numr oarecare de laturi.
Descompunerea poligoanelor concave n poligoane convexe este tratat la nivelul
programului de aplicaie. Aceast ierarhizare n prelucrarea poligoanelor este precizat
n seciunea urmtoare pentru biblioteca OpenGL.
Ca i n cazul liniilor, muchiile poligoanelor generate prezint aspectul de
scar de segmente, datorit trecerii la spaiul discret al imaginii. Algoritmii de filtrare
pentru netezirea muchiilor poligonului (algoritmi de anti-aliasing) se execut, n
general, concomitent cu algoritmul de generare scan-line a poligonului.
Fig. 5.6 Generarea poligoanelor concave:
generare direct prin baleiere pe linii;
transformare n mulime de triunghiuri (triangularizare).
x
i,1
x
i,3
x
i,4
x
i,2
(a)
(b)
Eliminarea suprafeelor ascunse
Reprezentarea pe display a tuturor suprafeelor obiectelor proiectate n fereastra de vizualizare produce o
imagine nerealist deoarece este posibil ca o suprafa care se afl n spatele altei suprafee s fie vizibil
pe ecran. Acest situaie provine din transformarea de proiecie din spaiul tridimensional n spaiul
bidimensional (planul de vizualizare). n general, orice proiecie nseamn o reducere a dimensionalitii
spaiului de reprezentare i, prin acesta, se pierd o parte din proprietile formelor. Datorit proieciei,
suprafee distincte, aflate la distane diferite n spaiu, sunt proiectate n aceeai regiune pe display i sunt
reprezentate suprapus. Pentru obinerea unor imagini corecte, care s reflecte relaia spaial dintre
obiecte, se prelucreaz suplimentar suprafeele proiectate ale obiectelor.
Prelucrarea suprafeelor din punct de vedere al poziiei relative ntre ele, prelucrare cunoscut sub numele
de eliminarea suprafeelor ascunse (hidden surface removal) se poate efectua n dou moduri:
(a) Eliminarea suprafeelor ascunse n spaiul obiect, prin compararea adncimii relative a
suprafeelor obiectelor n sistemul de referin de observare sau n sistemul de referin
normalizat.
(b) Eliminarea suprafeelor ascunse n spaiul imagine, prin compararea adncimii pixelilor
imaginii rezultai din generarea (conversia de rastru) a tuturor suprafeelor obiectelor, prin
algoritmul cunoscut sub numele de algoritm de tip buffer de adncime (depth buffer, Z-
buffer).
n momentul actual, eliminarea suprafeelor ascunse prin algoritmul Z-buffer este aproape universal
folosit n grafic, datorit calitilor remarcabile ale acestei abordri, care permite implementri
hardware eficiente i este independent de modul de reprezentare a obiectelor scenei. Ali algoritmi de
eliminare a suprafeelor ascunse se mai folosesc doar n aplicaii grafice foarte specializate, care nu
beneficiaz de mecanismul de Z-buffer.
Compararea adncimilor
Pentru eliminarea suprafeelor ascunse se compar adncimea (distana fa de punctul de observare) a
tuturor suprafeelor sau a pixelilor rezultai prin conversia de rastru.
Un punct P este ascuns de o suprafa S, dac adncimea punctului este mai mare dect adncimea
interseciei I a dreaptei care unete punctul P cu centrul de proiecie (se consider centrul de proiecie
identic cu originea sistemului de referin de observare OV , Fig. 5.7(a)), deci dac OVP > OVI.
O suprafa A este ascuns de alt suprafa S dac toate punctele suprafeei A sunt ascunse de suprafaa
S (Fig. 5.7(b)). Dac o suprafa ascunde S suprafaa A, atunci se consider c adncimea suprafeei S
este mai mic dect cea a suprafeei ascunse A.
Compararea adncimilor a dou puncte n sistemul de referin de observare este destul de complicat,
deoarece comparaia are sens numai dac cele dou puncte se afl pe aceeai linie de proiecie (Fig. 5.7).
Aceast operaie este mai simpl n sistemul de referin ecran 3D. n acest sistem, zS = zN, iar zN este
definit de relaia 4.10 astfel:

,
_


V
N S
z
d
1
d f
f
z z
Fig. 5.7 (a) Suprafaa S ascunde punctul P.
(b) Suprafaa A ascunde suprafaa B.
O
V
I
S
P
O
V
S
A
(a)
(b)
Acest relaie transform, de exemplu, un cub n sistemul de referin de observare, ntr-un trunchi de
piramid n sistemul ecran 3D (Fig. 5.8).
Proiecia perspectiv din sistemul de referin de observare se transform n proiecie paralel n sistemul
de referin ecran 3D. Deoarece zV = 0 se transform n zS = , liniile de proiecie n sistemul ecran 3D
sunt linii paralele ndreptate ctre . Adncimea unui punct P1(x1,y1,z1) n sistemul de referin de
observare, care este dat de distana
2
1
2
1
2
1 1 V
z + y + x = P O
, se transform n coordonata zS a
punctului n sistemul de referin ecran 3D.
Testul de adncime din sistemul de referin de observare, pentru a determina dac un punct P
1
este mai
aproape de centrul de proiecie (care este, n general, acelai cu punctul de observare) dect punctul P
2
,
necesit ca cele dou puncte s se afle pe aceeai linie de proiecie. n sistemul ecran 3D, toate punctele
care au aceleai coordonate (x
S
, y
S
) n planul de proiecie se afl pe acelai proiector, o dreapt paralel
cu axa zS, deci se poate efectua testul de adncime prin comparaia coordonatelor zS ale punctelor.

Se poate trage concluzia c operaiile care implic testarea sau compararea adncimilor se execut mai
simplu n sistemul de referin ecran 3D. Acest lucru este utilizat att n algoritmii de eliminare a
suprafeelor ascunse n spaiul obiect ct i n algoritmii n spaiul imagine.
Eliminarea suprafeelor ascunse n
spaiul obiect
x
V
Direcia de
observare
y
V
-z
V
z
S
x
S
y
S

Fig. 5.8 Transformarea unui cub i a liniilor de proiecie
din sistemul de referin de observare n sistemul de referin ecran 3D.
z
V
Unul din cei mai cunoscui algoritmi de eliminare a suprafeelor ascunse n spaiul obiect este algoritmul
propus de Newell, cunoscut i sub numele de algoritmul pictorului, datorit analogiei cu modul n care un
pictor creeaz un tablou. n acest algoritm, se sorteaz suprafeele n ordinea descresctoare a adncimii i
se redau n aceast ordine pe display. Eliminarea suprafeelor ascunse se obine prin suprapunerea noii
suprafee (mai apropiat) peste suprafeele mai deprtate, deja desenate. Lista ordonat de suprafee
(numit list de display) se creeaz n sistemul de referin de observare sau n sistemul de referin ecran
3D, dup operaia de decupare.
Ordonarea suprafeelor dup adncime este o operaie complicat, mai ales dac dou suprafee se
intersecteaz ntre ele, situaie n care nu se poate decide care suprafa este mai apropiat, dect prin
divizarea uneia din ele de-a lungul liniei de intersecie.

Un alt algoritm de eliminare a suprafeelor ascunse n spaiul obiect este algoritmul cu subdivizarea
recursiv a poligoanelor (algoritmul Weiler-Atherton). Spre deosebire de algoritmul pictorului, n care
intersectarea suprafeelor proiectate se efectueaz prin supranscrierea suprafeelor mai apropiate peste
cele mai deprtate, n algoritmul Weiler-Atherton se execut o operaie de decupare n sistemul de
referin normalizat ntre toate suprafeele obiectelor i se rein numai suprafeele nvintoare, adic
cele mai apropiate. Lista acestora (lista de display) nu mai conine suprafee care se pot suprapune pe
ecran i nu mai trebuie s fie ordonat. Ca i n algoritmul pictorului, operaiile de creare a listei de
display necesit un timp de execuie foarte mare, care depinde de numrul de suprafee care se
prelucreaz. Acest lucru limiteaz drastic posibilitatea de utilizare a algoritmilor n spaiul obiect.
Eliminarea suprafeelor ascunse n
spaiul imagine: Algoritmul Z-buffer
Dezvoltat de Catmull (1975), algoritmul Z-buffer introduce o metod simpl de eliminare a suprafeelor
ascunse, n care se efectueaz comparaia ntre adncimea zS a fiecrui pixel (x, y) al poligoanelor
generate i se selecteaz pixelul cu adncimea minim (cel mai apropiat).
Aceast selecie se implementeaz cel mai convenabil prin folosirea unui buffer de adncime (Z-buffer)
care memoreaz adncimea tuturor pixelilor generai n spaiul de imagine, a cror culoare este memorat
n bufferul de imagine. n orice moment, la fiecare adres (x, y) n Z-buffer, este memorat adncimea
celui mai apropiat pixel de adres (x, y) rezultat n transformarea de rastru a poligoanelor. Adncimea
unui nou pixel generat este comparat cu adncimea pixelului cu aceeai adres din Z-buffer i noul pixel
nlocuiete pixelul anterior numai dac adncimea lui este mai mic. nlocuirea pixelului anterior cu un
pixel nou generat se realizeaz prin nscrierea culorii noului pixel n bufferul de imagine la adresa (x, y) i
nscrierea adncimii lui la aceeai adres (x, y) n Z-buffer.
Comparaia ntre adncimile punctelor n sistemul de referin ecran 3D are avantajul c poate fi efectuat
prin comparaia coordonatelor z
S
, dat fiind c toate punctele cu aceleai coordonate (x, y) se afl pe
aceeai linie de proiecie paralel cu axa z
S
.(Fig. 5.8). Dar aceast simplitate de calcul are, totui, un
inconvenient, i anume acela c adncimile din sistemul de referin de observare nu se transform liniar
n sistemul de referin ecran 3D. Intervale egale n zV nu se transform n intervale egale n z
S
, ceea ce se
poate observa i din relaiile de transformare 4.10. Cu ct z
V
se apropie de planul de vizibilitate deprtat
(far), z
S
se apropie mai rapid de 1. Obiectelele sunt comprimate n funcie de coordonata lor zV, i acest
lucru are consecine asupra preciziei n comparaia adncimilor.
Algoritmul Z-buffer se execut concomitent cu transformarea de rastru a poligoanelor. Fiecare poligon
este descris prin lista vrfurilor sale reprezentate n sistemul de referin ecran 3D. Adncimea pixelilor
poligonului se calculeaz prin interpolare pornind de la adncimea vrfurilor acestuia.
Interpolarea pentru calculul adncimii pixelilor se efectueaz n dou etape: o interpolare de-a lungul
laturilor poligonului, prin care se obine adncimea pixelilor de pe conturul poligonului, i o interpolare
de-a lungul fiecrei liniei de baleiere, prin care se obine adncimea tuturor pixelilor interiori. Algoritmul
de generare a poligoanelor prin baleiere pe linii (scan-line) se transform astfel ntr-un algoritm combinat
de baleiere i Z-buffer (scan-line Z-buffer).
Se reia algoritmul de generare a poligoanelor prin baleiere pe linii din paragraful 5.3 i Fig.5.5. Prin
proiecia suprafeei ABCDE din spaiu n planul x
S
= 0 se obine poligonul ABCDE
(Fig. 5.9). Liniile de baleiere ale acestui poligon sunt dreptele de ecuaii y = y1, y = y2,.y = yi, y = yi+1,
Dreapta y = yi interescteaz laturile AB i BC n punctele Mi,1 (yi, zi,1) i Mi,2 (yi, zi,2).
z
y
z
i,1
y
i+1
=y
i
+1
y
i
z
i,2
z
i+1,2
z
i+1,1
B
A
C
D
E
y
B
M
i,1
M
i,2
M
i+1,1
M
i+1,2
Ecuaiile laturilor AB i BC se pot scrie similar cu relaiile 5.4:
z = m
1z
y+n
1z

z = m
2z
y+n
2z
(5.7)
unde: m
1z
= (z
A
z
B
)/(y
A
y
B
), n
1z
= y
B
m
1z
z
B
m
2z
= (z
C
z
B
)/(y
C
y
B
), n
2z
= y
C
m
1z
z
C
(5.8)
Interseciile dreptelor AB i BC cu dreapta y = y
i
au coordonatele
z
i,1
= m
1z
y
i
+n
1z
i z
i,2
= m
2z
y
i
+n
2z
. Coordonatele punctelor de intersecie ale
dreptei y = y
i+1
= y
i
+1, se pot calcula din coordonatele interseciilor precedente
folosind coeficienii m
1z
i m
2z
ai laturilor intersectate:
z
i+1,1
= z
i,1
+ m
1z

z
i+1,2
= z
i,2
+ m
2z
(5.9)
Pentru fiecare linie de baleiere se calculeaz coordonatele interseciilor cu laturile
poligonului prin incrementarea valorilor precedente cu coeficienii dai de relaiile
(5.8).
Cele dou operaii de baleiere, pentru calculul adresei i al adncimii pixelilor de
pe conturul unei suprafeei ABCDE, se execut concomitent prin intersecia suprafeei
cu planele de ecuaii y = y
1
, y = y
2
,. y
i
, y
i+1
, Laturile AB i BC sunt
intersectate de planul y = y
i
n punctele M
i,1
i M
i,2
. Interseciile (x
i,1
, y
i
), (x
i,2
,
y
i
) se calculeaz n planul z
S
= 0, prin intersecia dreptei y = y
i
cu proieciile
AB i BC ale laturilor AB i BC n planul z
S
= 0. Interseciile (z
i,1
, y
i
), (z
i,2
,
y
i
) se calculeaz n planul x
S
= 0, prin intersecia dreptei y = y
i
cu proieciile AB
i BC ale laturilor AB i BC n planul x
S
= 0.
Adresele pixelilor se obin prin rotunjirea (sau trunchierea) coordonatelor punctelor de intersecie (x
i,1
,
y
i
), (x
i,2
, y
i
); valorile z
i,1
i z
i,2
reprezint adncimea acestor pixeli, care se afl pe conturul
poligonului.
Pentru calculul adncimii pixelilor interiori (a celor ce nu se afl pe conturul poligonului), se efectueaz o
interpolare pe fiecare linie de baleiere.
n planul y = y
i
, relaia dintre coordonatele x i z ale dreptei M
i,1
M
i,2
este:
z = m
ix
x+n
ix
(5.10)
unde: m
ix
= (x
i,2
x
i,1
)/(z
i,2
z
i,1
), n
ix
= z
i,1
m
ix
x
i,1
Fig. 5.9 Baleierea poligonului n planul yz.
x
z
x
i,1
x
i,2
z
i,2
z
i,1
M
i,1
M
i,2
Un punct pe aceast dreapt are coordonatele xi,j, zi,j = xi,j mix + nix. Pe segmentul de dreapt Mi,1Mi,2 se
calculeaz puncte succesive prin incrementarea cu 1 a coordonatei x i calculul prin incrementare cu
panta m
ix
a coordonatei z:
x
i,j+1
= x
i,j
+1; z
i,j+1
= z
i,j
+ m
ix
(5.11)
Valoarea z
i,j
reprezint adncimea pixelului a crui adres se obine prin rotunjirea sau trunchierea
coordonatelor punctului (x
i,j
, y
i
).
Toate aceste operaii se execut pentru fiecare fa a obiectelor tridimensionale n sistemul de coordonate
ecran 3D, i pentru fiecare pixel se actualizeaz n mod corespunztor culoarea n bufferul de imagine i
adncimea n bufferul de adncime. Exprimate n pseudocod asemntor limbajului C, operaiile
combinate de conversie de baleiere i Z-buffer (funcia Scanline) arat astfel:
void Scanline(){
for (toate valorile (x,y)){
image_buffer[x][y] = culoare_stergere;
Z_buffer[x][y] = max_z; /* initializare Z-
buffer */
}
for (fiecare poligon){
calculul y
min
, y
max
ale poligonului;
for (y
i
= y
min
; y
i
<= y
max
;y
i
++){
calcul x
i,1
, x
i,2
calcul z
i,1
, z
i,2
for (x=x
i,1
;x<x
i,2
;x++){
calcul z;
if(z < Z_buffer[x][y]){
Z_buffer[x][y] = z;
image_buffer[x][y] = culoare;
}
}
}
}
}
Cel mai important avantaj al algoritmului Z-buffer este simplitatea implementrii lui, iar dezavantajul
principal l constitue memoria suplimentar necesar pentru implementarea bufferului de adncime.
Dimensiunea fiecrei locaii (fiecare locaie corespunznd unui pixel din imagine) este dat de precizia de
reprezentare a adncimii z. Datorit compresiei pe care o introduce transformarea de la sistemul de
referin de observare la sistemele de referin normalizat i ecran 3D (relaia 4.10), este posibil ca dou
valori zV distincte s fie transformate n valori zS identice. n mod obinuit, se folosesc 20 sau 32 de bii
pentru reprezentarea adncimii unui pixel, ceea ce nseamn c Z-bufferul poate deveni mai mare dect
bufferul de imagine, construit n mod obinuit cu 24 de bii/pixel.
n realizrile mai vechi ale sistemelor grafice, bufferul de adncime era implementat n memoria
principal. n momentul actual, sunt disponibile terminale grafice care au Z-bufferul realizat ca o
memorie dedicat, i aceasta reprezint cea mai bun soluie.
Un alt avantaj al Z-bufferului l reprezint independena de forma de reprezentare a obiectelor.
Descrierea dat mai sus se refer la utilizarea Z-bufferului n redarea obiectelor modelate prin suprafee
Fig. 5.10 Interpolarea adncimilor pe linia de baleiere y = y
i
.
poligonale, dar aceasta nu este o restricie, deoarece se poate calcula adncimea z pentru orice tip de
suprafa, iar mecanismul de comparaie a adncimilor este acelai.

Eliminarea suprafeelor orientate invers
Algoritmii de eliminare a suprafeelor ascunse prezentai mai sus se ocup de
compararea suprafeelor provenind de la oricte obiecte diferite, pentru care trebuie s
fie calculate adncimile i sortate (n spaiul obiect) sau comparate (n spaiul imagine)
pentru a decide care suprafa ascunde o alt suprafa.
Exist ns i o situaie de ascundere ntre suprafee care se poate rezolva mult
mai simplu, i anume ascunderea reciproc ntre feele unui obiect opac.
n modelarea obiectelor tridimensionale, feele componente sunt reprezentate orientat n spaiu, astfel
nct normalele tuturor feelor unui obiect s fie ndreptate ctre aceeai regiune a spaiului (spre
interiorul sau spre exteriorul obiectului).
Dac un obiect opac ale crui normale la fee sunt ndreptate spre exterior, este
privit dintr-un punct de observare, feele ale cror normale sunt orientate ctre punctul
de observare ascund (mascheaz) feele ale cror normale sunt orientate n direcie
invers.
Orientarea consistent a feelor unui obiect permite selecia numai a acelor fee ale obiectului care sunt
orientate ctre punctul de observare. Aceast operaie de selecie (numit eliminarea feelor orientate
invers - din spate - backface elimination) se efectueaz n sistemul de referin de observare (Fig. 5.11).
Pentru testul de vizibilitate al feelor n funcie de orientare se calculeaz produsul scalar dintre normala
la suprafa i un vector dintr-un punct al feei spre punctul de observare. Dac normalele la feele
obiectului sunt ndreptate ctre exterior (sens pozitiv, invers acelor de ceas) i unghiul dintre cei doi
vectori este mai mic de 90, atunci suprafaa este vizibil.
Produsul scalar a doi vectori, N i V este:
cos = N V N V
unde |V| i |N| sunt modulele celor doi vectori, iar este unghiul dintre ei. Se poate scrie deci:
Fig. 5.11 Selecia feelor n funcie de orientare
Normala la suprafa
Normala la suprafa
Normala la suprafa
Punctul de
observare

Invizibil
Vizibil
Vizibil
< 90
> 90
< 90
VN > 0 dac < 90
VN = 0 dac = 90
VN < 0 dac > 90
De aici rezult condiia de vizibilitate a unei fee: pentru ca o fa s fie vizibil, produsul scalar
dintre normala acesteia i un vector dintr-un punct al feei spre punctul de observare trebuie s fie pozitiv:
NV >0
(5.12)
Dac se consider normala la suprafa orientat ctre interiorul obiectului (n sens negativ, n
direcia acelor de ceas), atunci condiia de vizibilitate a unei feei este ca produsul scalar dintre normal i
un vector dintr-un punct al feei spre punctul de observare trebuie s fie negativ.
Eliminarea feelor orientate invers se execut n sistemul de referin de observare; orice fa care
este invizibil este ignorat pentru operaiile ulterioare de redare. Acest test este foarte important
deoarece, n medie, jumtate din feele unui obiect tridimensional sunt orientate invers fa de punctul de
observare i pot fi eliminate din calcul.
Dac obiectul are fee transparente, atunci nu se pot elimina feele n funcie de orientare i toate
feele obiectului trebuie s fie luate n considerare i prelucrate corespunztor. Pentru o fa dat prin
succesiunea vrfurilor sale V1,V2, .Vn, normala se calculeaz ca produs vectorial a vectorilor care
reprezint dou laturi succesive (Fig. 5.12 (a)).
N = (V2 V1) x (V3 V2)
Dac (xm, ym, zm) reprezint coordonatele vrfului Vm , , iar i, j, k sunt versorii axelor x,y,z atunci normala
N are expresia:
2 3 2 3 2 3
1 2 1 2 1 2 2 3 1 2
z z y y x x
z z y y x x ) V V ( ) V V (


k j i
N
Se dezvolt determinantul dup prima linie, i rezult:
N = ((y2 y1) (z3 z2) (y3 y2) (z2 z1)) i +
((x3 x2) (z2 z1) (x2 x1) (z3 z2)) j + (5.13)
((x2 x1) (y3 y2) (x3 x2) (y2 y1)) k
Dac ordinea de parcurgere a vrfurilor feei se inverseaz, deci se consider faa Vn,V2V1, atunci
normala se calculeaz prin produsul N=(V2V3)x(V1 V2) care are semnul inversat (Fig. 5.12 (b)), ceea
ce se regsete n formula de calcul a produsului vectorial.
Rezult c sensul vectorului normal la o fa este dat de ordinea de parcurgere a vrfurilor feei. Dac n
sistemul de referin local (de modelare) feele unui obiect sunt definite (prin ordinea vrfurilor) astfel
nct toate normalele s fie ndreptate spre aceeai regiune a spaiului (spre exteriorul obiectului), aceast
orientare se pstreaz dup transformarea de instaniere i observare i n sistemul de referin de
observare obiectele vor avea normalele orientate consistent (toate orientate ctre exterior). Aceast
V
1
V
3
V
2
V
5
V
4
N
(a)
V
1
V
3
V
2
V
5
V
4
N
(b)
Fig. 5.12 Calculul normalei la o suprafa.
condiie este suficient pentru calculul vizibilitii fiecrei fee prin produs scalar al normalei cu vectorul
de direcie de la un punct al feei ctre punctul de observare.
Eliminarea suprafeelor orientate invers ale obiectelor opace trebuie s fie efectuat n orice sistem de
vizualizare, deoarece este un test care se execut eficient i elimin n medie jumtate din suprafeele
obiectelor din scen.
Dac scena este compus dintr-un singur obiect convex opac, eliminarea
feelor orientate invers este suficient pentru a rezolva problema ascunderii feelor
invizibile. Dac, ns, obiectul este concav, este posibil ca o fa orientat direct (ctre
punctul de observare) s fie parial mascat de o fa orientat invers i atunci
eliminarea suprafeelor orientate invers nu mai este suficient, fiind necesar unul din
algoritmii de eliminare a suprafeelor ascunse care se bazeaz pe calculul adncimii.
La fel, dac n scen exist mai mult de un obiect, pe lng eliminarea suprafeelor
orientate invers, este necesar eliminarea suprafeelor ascunse.
Anti-aliasing
Se poate observa uor c liniile afiate pe display apar ca o secven de puncte
care dau un aspect zimat (n trepte de scar), aspect cunoscut sub numele de aliasing.
n text se va pstra termenul original de aliasing, dat fiind c traducerile sunt mai puin
sugestive.
Cauza fundamental a aliasing-ului n grafica pe calculator este crearea
imaginilor prin eantionare n domeniul spaiului i, pentru imaginile animate, i n
domeniul timp. Pentru generarea unei imagini, pasul final l constitue calculul
intensitii pixelilor, care reprezint trecerea de la intensitatea I(x,y) definit n
spaiul bidimensional continuu, la intensitatea fiecrui pixel, n spaiul imagine discret.
Aceast trecere este echivalent cu eantionarea spaiului bidimensional continuu cu o
gril de puncte de eantionare, considerate, de exemplu, n centrul fiecrui pixel
Cea mai familiar manifestare a aliasing-ului l constitue aspectul de asperitate
(jagged) al liniilor sau al muchiilor poligoanelor. De asemenea, suprafeele nguste pot
apare ntrerupte, n funcie de orientarea lor. Un alt efect al aliasing-ului l constitue
apariia i dispariia obiectelor mici, care ocup o suprafa mai mic dect suprafaa
unui pixel i care sunt redate sau nu n funcie de intersecia cu grila de eantionare.
Aceste efecte sunt mai suprtoare n secvenele de imagini n micare.
Muchiile n form de scar sau suprafeele ntrerupte dau o senzaie de micare
necontrolat a acestora (crowl), care este intolerabil n multe aplicaii de realitate
virtual, de exemplu n simulatoarele de zbor.
Tehnicile de prelucrare a imaginii pentru atenuarea efectelor de aliasing sunt
cunoscute sub numele de anti-aliasing. Toi algoritmii folosii pentru diminuarea
efectului de aliasing necesit resurse de memorie i de calcul considerabile i, cu ct
se admit aproximri mai grosiere, cu att scade calitatea imaginii datorit zgomotului
de spectru transpus. n seciunea 7 este prezentat o modalitate de netezire a muchiilor
poligoanelor implementat n biblioteca grafic OpenGL.
Texturarea
Aplicarea texturilor este o tehnic important de cretere a realismului
scenelor virtuale, prin care se genereaz imagini ale obiectelor tridimensionale mult
mai interesante i mult mai complexe. Prin texturare se moduleaz culoarea
suprafeelor obiectelor folosind o imagine repetitiv (textura), obinndu-se un efect
asemntor aceleia de aplicare (lipire) a unui desen pe o suprafa.
n decursul dezvoltrii tehnicilor de texturare, au fost propuse i alte
modaliti de creare a impresiei de texturare, de exemplu prin perturbaia normalelor
suprafeelor, sau prin variaii ale iluminrii mediului ambiant al obiectelor. n
momentul actual, metoda cea mai larg rspndit, cu numeroase implementri
hardware n sistemele grafice, este prin modularea culorii suprafeelor obiectelor
folosind imagini de texturare. Texturile care moduleaz culoarea suprafeelor mresc
informaia vizual prezentat prin sugerarea materialului suprafeei. De exemplu, prin
aplicarea repetat a imaginii unei crmizi (obinut, de cele mai multe ori prin
scanarea unei fotografii a unui perete real), un singur dreptunghi capt aspectul unui
perete ntreg (Fig. 5.13(a)). Desenarea unui astfel de perete folosind cte un poligon
pentru fiecare crmid este extrem de ineficient i imaginea obinut este nerealist,
deoarece fiecare crmid este prea neted i regulat. De asemenea, prin texturare se
poate aplica pe o suprafa o imagine care este practic imposibil s fie generat prin
suprafee poligonale (Fig. 5.13(b)).
Pentru texturarea obiectelor prin modularea culorii suprafeelor trebuie s se
defineasc urmtoarele caracteristici:
Modul de aplicare a texturii pe suprafaa unui obiect.
Modul de diminuare (eliminare) a efectelor de aliasing care apar n
aplicarea texturilor (filtrarea texturilor).
Aplicaia texturilor
(a) (b)
Fig. 5.13 Suprafee texturate prin aplicarea unei texturi bidimensionale
Aplicaia texturii (texture mapping) asigur redarea corect a poligoanelor,
atunci cnd li se atribuie o textur. De exemplu, atunci cnd un perete texturat este
observat n perspectiv, crmizile mai deprtate se vd mai mici dect cele apropiate.
Texturile pot fi definite ca imagini bidimensionale, care se aplic suprafeelor
obiectelor, sau ca un cmp tridimensional, i atunci culoarea obiectului se determin
prin intersecia suprafeelor sale cu acest cmp tridimensional al texturii. Texturile
tridimensionale sunt mai rar implementate n sistemele grafice, de aceea n continuare
vor fi prezentate numai texturile bidimensionale.
Textura bidimensional este o imagine definit ntr-un spaiu bidimensional
(numit spaiul texturii) T(s, t), n intervalul [0,1] pe ambele axe de coordonate s i t.
Textura este alctuit din elementele componente discrete care sunt dreptunghiuri (sau
ptrate) numite texeli. Fiecare imagine de textur este definit prin rezoluia ei, dat ca
numr de texeli pe cele dou coordonate. De exemplu, se folosesc imagini de textur
de 256 x 256 texeli, 512 x 1024, 1024 x 1024, etc.
Aplicaia texturii bidimensionale unui obiect const din parametrizarea
suprafeelor, urmat de transformarea obiectului n sistemul de referin ecran 3D (Fig.
5.14). Prin parametrizarea suprafeelor se asociaz un punct de coordonate (s, t) n
spaiul texturii fiecrui vrf al obiectului modelat (reprezentat n sistemul de referin
de modelare). Transformarea complet de aplicaie a texturii mai necesit, dup
parametrizarea suprafeelor, toate transformrile geometrice obinuite, de la sistemul
de referin model (spaiul obiect) la sistemul de referin ecran 3D.
Dac se compun cele dou transformri (parametrizarea suprafeei i
transformarea n spaiul ecran 3D) se obine o transformare de aplicaie a texturii
(texture mapping), care transform puncte din spaiul texturii n spaiul ecran 3D. n
Fig. 5.15 (a), textura este o tabl de ah, definit n spaiul texturii. Aceast textur
este aplicat unor suprafee prin definirea coordonatelor fiecrui vrf al suprafeei n
planul texturii, iar prin transformarea n spaiul ecran 3D i transformarea de rastru, se
obine imaginea suprafeelor texturate (Fig. 5.15 (b1, b2, c)).
Transformarea de parametrizare amplaseaz imaginea texturii pe un obiect
prin asocierea unui punct (s, t) n spaiul texturii (parametrul de texturare), fiecrui
punct (x
m
, y
m
, z
m
) al obiectului. Modul cum poate fi colat o suprafa plan (textura)
pe un obiect tridimensional nu are o soluie unic i nu poate fi realizat dect admind
diferite tipuri de erori i distorsiuni. n implementrile practice au fost adoptate mai
multe tehnici specifice aplicaiilor. De exemplu, se poate atribui cte o textur fiecrei
fee a unui obiect (aa cum este n Fig. 5.13), unui grup de fee ale obiectului, sau se
poate proiecta aceeai textur pe toate feele obiectului.
s
t
(a)
1.0
1.0
(b1) (b2)
(c)
Spaiul texturii
T(s,t)
Spaiul obiect
(x
m
, z
m
, y
m
)
Spaiul ecran 3D
(x
S
, y
S
)
Parametrizarea
suprafeelor
Proiecie
Fig. 5.14 Operaiile de aplicaie a texturilor bidimensionale.
Pentru aplicaia texturii pe o suprafa plan, se definesc coordonatele (s, t) n
spaiul texturii pentru fiecare vrf al suprafeei. Aceste coordonate sunt calculate o
singur dat, la modelarea obiectului, i sunt memorate mpreun cu coordonatele
vrfului i cu normala n vrf. Dac 0 s, t 1, atunci imaginea texturii apare (n
ntregime sau parial) pe suprafaa texturat. De exemplu, n Fig. 5.15, prima suprafa
texturat, are coodonatele vrfurilor n spaiul texturii (0.0, 0.0), (0.5, 0.0) (0.5, 1.0),
(0.0, 1.0), i imaginile din Fig 5.15(b1) i (b2) se obin prin dou transformri de
modelare diferite (amplasare n spaiul universal). Cea de a doua suprafa are
coordonatele vrfurilor n spaiul texturii (0.5, 1.0), (1.0, 0.0), (1.0, 1.0), (0.5, 0.5) i
imaginea din Fig. 5.15(c) pentru un anumit punct de observare.
Dac coordonatele vrfurilor suprafeei n spaiul texturii depesc ptratul cu
latur egal cu 1 n care este definit imaginea de textur, atunci se poate ca textura s
se repete pe suprafaa texturat. De exemplu, n imaginea din Fig. 5.13(a), faa
vertical a cubului are coordonatele de textur ale vrfurilor (0.0, 0.0), (4.0, 0.0), (4.0,
4.0), (0.0, 4.0). Textura (format din dou crmizi) se repet de patru ori pe
suprafa (se vd opt crmizi).
Adresa texelilor corespunztori pixelilor unei primitive geometrice (obinui
prin transformarea de rastru), se calculeaz printr-o transformare invers
transformrii de aplicaie a texturii. Un pixel, definit ca un ptrat n spaiul ecran 3D,
este transformat n spaiul model obiect printr-o transformare invers transformrii
model-ecran 3D, i apoi este transformat n spaiul texturii, printr-o transformare
invers transformrii de parametrizare. Deoarece transformarea invers transformrii
model-ecran 3D nu este linear, unui pixel din imagine i corespunde o suprafa n
spaiul texturii care, n general, este un patrulater. Culoarea texelului corespunztor
acestui patrulater este atribuit pixelului.
Calculul texelilor n spaiul texturii corespunztori pixelilor primitivelor
geometrice este un proces de eantionare i este posibil s apar un zgomot de spectru
transpus (aliasiang), atunci cnd frecvena de eantionare este mai mic dect dublul
frecvenei spaiale maxime a texturii. De aceea trebuie s fie folosite tehnici de anti-
aliasing, adic filtrarea texturilor. Aceste aspecte sunt prezentate n paragraful urmtor.
Fig. 5.15 Transformarea de aplicaie a texturilor.
(a) Spaiul texturii. (b1), (b2), (c) Suprafee texturate n spaiul ecran 3D.

Filtrarea texturilor
Fenomenul de aliasing care apare n texturare are cauza n eantionarea
imaginii de textur. Transformarea din spaiul ecran 3D n spaiul texturii
bidimensionale genereaz o suprafa n form de patrulater corespunztoare fiecrui
pixel, care este numit pre-imaginea pixelului. Pentru simplificarea prezentrii se
presupune c pre-imaginea pixelului este un ptrat n spaiul texturii (Fig. 5.16).
Dac nu se efectueaz
filtrarea texturii, atunci se
atribuie pixelului culoarea
texelului cel mai apropiat de
centrul pre-imaginii acestuia. Probelemele de aliasing care apar n aceast situaie sunt
foarte grave, mai ales pentru imaginile suprafeelor privite n perspectiv, n care
variaz mult dimensiunea pre-imaginii pixelilor.
Pre-imaginea unui pixel n planul texturii depinde de poziia suprafeei fa de
punctul i direcia de observare. Se presupune o suprafa ptrat cu parametrii texturii
(0,0), (1,0), (1,1), (0,1), perpendicular pe direcia de observare, la o distan D astfel
c imaginea ei pe ecran este un ptrat de N x N pixeli. Se mai presupune, de
asemenea, c textura folosit are rezoluia de N x N texeli. n aceast situaie, aria pre-
imaginii unui pixel n spaiul texturii este egal un aria unui texel (Fig. 5.17).
Fig. 5.16 Pre-imaginea unui pixel n spaiul texturii.
Poligon Textur
Pixel
Pre-imagine
pixel
Poligon
Textur
Pixel
Pre-imagine
pixel
Dac suprafaa se apropie de punctul de observare, la distan D/2, atunci
imaginea suprafeei pe ecran este de 2N x 2N pixeli i imaginea celor 2N x 2N pixeli
acoper N x N texeli, deci aria imaginii unui pixel este acum din aria unui texel
(Fig. 5.18). Cu ct suprafaa se apropie mai mult, cu att scade dimensiunea pre-
imaginii pixelului n planul texturii i, deci crete frecvena de eantionare (inversul
dimensiunii pre-imaginii pixelului) a texturii. n aceast situaie nu apare zgomot de
aliasing, dar imaginea nu devine mai bun, chiar dac se efectueaz filtrarea prin
medierea ponderat a culorilor texelilor acoperii de pre-imaginea pixelului. Aceast
situaie se datoreaz faptului c textura nu este o imagine continu, ci este reprezentat
prin elemente discrete (texelii) i se observ discontinuitile de trecere de la un texel
la altul.
Dac suprafaa se deprteaz de punctul de observare, de exemplu la distana
2D, atunci suprafaa are dimensiunea de (N/2) x (N/2) pixeli pe ecran este i imaginea
acestora acoper N x N texeli, deci aria pre-imaginii unui pixel este de patru ori mai
mare dect aria unui texel (Fig. 5.19).
Cu ct suprafaa se deprteaz mai mult, cu att crete dimensiunea pre-
imaginii pixelului n planul texturii i, deci, scade frecvena de eantionare a texturii
Fig. 5.17 Pre-imaginea unui pixel cu arie egal cu aria texelului
Fig. 5.18 Pre-imaginea unui pixel cu arie mai mic dect aria texelului
Poligon
Textur
Pixel
Pre-imagine
pixel
Poligon
Textur
Pixel
Pre-imagine
pixel
Fig. 5.19 Pre-imaginea unui pixel cu aria mai mare dect aria unui texel.
(inversul dimensiunii pre-imaginii pixelului). n aceast situaie apare zgomot de
aliasing, dac nu se efectueaz filtarea imaginii texturii. Filtrarea se execut ntr-o
fereastr Fourier pe dimensiunea pre-imaginii unui pixel n planul texturii, i se
efectueaz prin medierea ponderat a intensitilor tuturor texelilor acoperii de pre-
imaginea pixelului.
Prefiltrarea texturilor. Procedeul de filtrare a texturii poate fi accelerat
datorit faptului c imaginea care se filtreaz (textura) este cunoscut i se pot construi
imagini prefiltrate ale acesteia. n loc s se efectueze medierea pe suprafaa mai multor
texeli atunci cnd pre-imaginea pixelului acoper un nunr mare de texeli, se poate
folosi o imagine de textur prefiltrat, cu rezoluie mai sczut, n care culoarea
fiecrui nou texel reprezint media culorilor texelilor din textura original.
O tehnic elegant de prefiltrare a texturilor, care are o mare popularitate i
numeroase implementri hardware n acceleratoarele grafice, este tehnica numit
mip-map, dezvoltat de Wiliams n 1983. n loc s fie folosit o singur imagine de
textur, n tehnica mip-map se folosete o succesiune de imagini ale aceleiai texturi,
toate derivate din imaginea original, prin medierea culorilor i reducerea rezoluiei.
Fiecare imagine din succesiune are o rezoluie egal cu jumtatera rezoluiei imaginii
precedente i fiecare texel este media a patru texeli din imaginea precedent..
Termenul mip provine din expresia multum in parvo (multe lucruri ntr-un spaiu
restrns). Parametrul L este parametrul de selecie a nivelului de filtrare a texturii.
Nivelul L = 0 reprezint imaginea original a texturii (imaginea nefiltrat) cu rezoluia
maxim. n general, n tehnica mip-map se folosesc rezoluii egale pe cele dou
coordonate s i t, cu valoare o putere a lui 2, iar imaginile prefiltrate au rezoluii care
scad prin njumtire pn la valoarea 1 x 1 (Fig. 5.20).
Prin selecia nivelului de filtrare a texturii (L), se alege imaginea cu rezoluia
cea mai potrivit pentru dimensiunea pre-imaginii pixelului. Pentru evitarea
discontinuitilor ntre imagini la rezoluii diferite, se pot combina dou nivele de
filtrare prin interpolare liniar. Selecia corect a nivelului L este important. Dac L
este prea mare, imaginea apare estompat; dac L este prea mic, atunci se observ
Fig. 5.20 Textur mip-map
L = 0 L = 2 L = 1 L = 3 L = 4
zgomotul de aliasing. Nivelul L se alege astfel ca aria pre-imaginii pixelului s fie ct
mai apropiat de aria texelului.
Detaliile de execuie ale prefiltrrii folosind texturi mip-map depind de
implementarea specific, hardware sau software. n seciunea urmtoare sunt
prezentate funciile bibliotecii OpenGL prin care se pot programa aplicaii grafice
folosind texturarea suprafeelor.
6
Biblioteca grafic OpenGL
Pentru programarea aplicaiilor grafice complexe necesare n crearea i
redarea scenelor virtuale, se pot utiliza n momentul de fa mai multe biblioteci i
interfee grafice, precum i sisteme de dezvoltare de programe (toolkit-uri), care
permit proiectantului s reutilizeze un numr mare de funcii grafice deja
implementate i s-i concentreze eforturile asupra aplicaiei nsi. Dat fiind c
majoritatea acestor biblioteci sunt foarte iefine sau accesibile gratis prin Internet i pot
fi folosite ntr-un numr mare de platforme hardware i software, cunoaterea i
utilizarea lor este deosebit de important i util.
Dintre bibliotecile grafice existente, biblioteca OpenGL, scris n limbajul C,
este una dintre cele mai utilizate, datorit faptului c implementeaz un numr mare de
funcii grafice de baz pentru crearea apliciilor grafice interactive, asigurnd o
interfa independent de platforma hardware.
Introdus n anul 1992, biblioteca OpenGL a devenit n momentul de fa cea
mai intens folosit interfa grafic pentru o mare varietate de platforme hardware i
pentru o mare varietate de aplicaii grafice 2D i 3D, de la proiectare asistat de
calculator (CAD), la animaie, imagistic medical i realitate virtual. Datorit
suportului oferit prin specificaiile unui consoriu specializat (OpenGL Architecture
Review Board) i a numrului mare de implementri existente, n momentul de fa
OpenGL este n mod real singurul standard grafic multiplatform. Calitile de
maturitate, stabilitate, portabilitate i fiabilitate se adaug la cele de compatibilitate
ntre versiunile existente i de uurin de utilizare datorit unei bune structurri i a
documentaiei care se gsete cu uurin. Au fost publicate numeroase cri, exemple
de cod i alte informaii ieftine sau accesibile liber pe reeaua internet. Una din
adresele internet care se pot folosi pentru astfel de informaii este
www.opengl.org.
Aplicaiile OpenGL pot rula pe platforme foarte variate, ncepnd cu PC, staii
de lucru i pn la supecalculatoare, sub cele mai cunoscute sisteme de operare:
Linux, Unix, Windows NT, Windows 95, Mac OS. De asemenea se integreaz n orice
sistem de administrare a ferestrelor (windowing), incluznd Win32, X/Windows, i
Presentation Manager. Funiile OpenGL sunt apelabile din limbajele Ada, C, C++ i
Java. Ca rezultat, aplicaiile scrise pentru OpenGL pot fi adaptate pentru orice sistem
disponibil al utilizatorilor. Din consoriul de arhitectur OpenGL fac parte
reprezentani de la firmele Compaq, Evens-Sutherland, Hewlett-Packard, IBM, Intel,
Intergraph, Microsoft i Silcon Graphics. Pentru scrierea aplicaiilor folosind interfaa
OpenGL de ctre utilizatori finali nu este necesar obinerea unei licene.
Implementrile bibliotecii OpenGL difer de la un sistem grafic la altul,
dezvoltatorii sistemelor avnd astfel posibilitatea de optimiza costul i performaele
acestora. Funciile OpenGL, care sunt aceleai ca interfa de apel, pot fi executate de
hardware specializat, pot fi executate ca rutine soft de procesorul unitii centrale
CPU, sau pot fi implementate ca o combinaie de rutine software i hardare
specializat. Aceast flexibilitate de implementare a permis realizarea unei game
variate de acceleratoarele grafice OpenGL, de la simple plci de redare grafic, pn
la implemetarea complet a pipeline-ului grafic, inclusiv, funciile de Z-buffer,
antialising, cea, texturare. Exist acceleratoare grafice OpenGL de la plci cu pre
sczut pentru calculatoare PC, pn la sisteme grafice ale staiilor de lucru puternice i
multiprocesoare.
n lucrarea de fa sunt prezentate aspectele cele mai importante ale
programrii aplicaiilor grafice folosind biblioteca OpenGL, cu intenia de a asigura un
minim de cunotine de pornire a experienei de programare. De asemenea, sunt
descrise programele folosite pentru exemplificarea aspectelor teoretice de modelare i
generare a imaginilor (prezentate n seciunile 2, 3, 4 i 5). Prezentarea complet a
tuturor funciilor bibliotecii OpenGL nu este nici posibil, nici necesar. Numai ghidul
de programare OpenGL (OpenGL Programming Guide, [Woo97]) conine peste 600
de pagini, la care se adaug manualele de referin i multe altele. Dar, odat nelese
principiile de organizare a interfeei, restul detaliilor de implementare se pot parcurge
cu uurin din orice material disponibil sau help on-line.
Folosind biblioteca OpenGL, un programator n domeniul graficii se poate
concentra asupra aplicaiei dorite i nu mai trebuie s fie preocupat de detaliile de
implementare a diferitelor funcii standard. Programatorul nu este obligat s scrie
algoritmul de generare a liniilor sau a suprafeelor, nu trebuie s calculeze decuparea
obiectelor la volumul de vizualizare, etc, toate acestea fiind deja implementate n
funciile bibliotecii i, cel mai probabil, mult mai eficient i adaptat platformei
hardware dect le-ar putea realiza el nsui.
n redarea obiectelor tridimensionale, biblioteca OpenGL folosete un numr
redus de primitive geometrice (puncte, linii, poligoane), iar modele complexe ale
obiectelor i scenelor tridimensionale se pot dezvolta particularizat pentru fiecare
aplicaie, pe baza acestor primitive.
Dat fiind c OpenGL prevede un set puternic, dar de nivel sczut, de comenzi
de redare a obiectelor, mai sunt folosite i alte biblioteci de nivel mai nalt care
utilizeaz aceste comenzi i preiau o parte din sarcinile de programare grafic. Astfel
de biblioteci sunt:
Biblioteca de funcii utilitare GLU (OpenGL Utility Library) permite
definirea sistemelor de vizualizare, redarea suprafeelor curbe i alte
funcii grafice.
Pentru fiecare sistem Windows exist o extensie a bibliotecii OpenGL
care asigur interfaa cu sistemul respectiv: pentru Microsoft Windows,
extensia WGL, pentru sisteme care folosesc sistemul X Window, extensia
GLX, pentru sisteme IMB OS/2, extensia PGL.
Biblioteca de dezvoltare GLUT (OpenGL Utility Toolkit) este un sistem
de dezvoltare independent de sistemul Windows, care ascunde dificultile
interfeelor de aplicaii Windows, punnd la dispoziie funcii pentru
crearea i iniializarea ferestrelor, funcii pentru prelucrarea evenimentelor
de intrare i pentru execuia programelor grafice bazate pe biblioteca
OpenGL.
n orice aplicaie OpenGL trebuie s fie incluse fiierele header gl.h i
glu.h sau glut.h (dac este utilizat biblioteca GLUT). Toate funciile bibliotecii
OpenGL ncep cu prefixul gl, funciile GLU ncep cu prefixul glu, iar funciile
GLUT ncep cu prefixul glut.
Dezvoltarea programelor grafice
folosind utilitarul GLUT
Biblioteca grafic OpenGL conine funcii de redare a primitivelor geometrice
independente de sistemul de operare, de orice sistem Windows sau de platforma
hardware. Ea nu conine nici o funcie pentru a crea sau administra ferestre de afiare
pe display (windows) i nici funcii de citire a evenimentelor de intrare (mouse sau
tastatur). Pentru crearea i administarea ferestrelor de afiare i a evenimentelor de
intrare se pot aborda mai multe soluii: utilizarea direct a interfeei Windows (Win32
API), folosirea compilatoarelor sub Windows, care conin funcii de acces la ferestre i
evenimente sau folosirea altor instrumente (utilitare) care nglobeaz interfaa
OpenGL n sistemul de operare respectiv.
Un astfel de utilitar este GLUT, care se compileaz i instaleaz pentru fiecare
tip de sistem Windows. Header-ul glut.h trebuie s fie inclus n fiierele aplicaiei,
iar biblioteca glut.lib trebuie legat (linkat) cu programul de aplicaie. n
lucrarea de fa s-a folosit versiunea glut3.6, care poate fi preluat din internet
(www.sgi.com/pub/opengl/GLUT).
Sub GLUT, orice aplicaie se structureaz folosind mai multe funcii
callback. O funcie callback este o funcie care aparine programului aplicaiei
i este apelat de un alt program, n acest caz sistemul de operare, la apariia anumitor
evenimente. n GLUT sunt predefinite cteva tipuri de funcii callback; acestea sunt
scrise n aplicaie i pointerii lor sunt transmii la nregistrare sistemului Windows,
care le apeleaz (prin pointerul primit) n momentele necesare ale execuiei.
Funcii de control ale ferestrei de
afiare
Sunt disponibile cinci funcii pentru controlul ferestrei de afiare a
programului. Aici trebuie s fie precizate diferitele semnificaii ale termenului
suprautilizat fereastr. n general, n programare se folosete termenul ferestr
(window) pentru orice zon de afiare controlat pe display; ferestrele sunt gestionate
de sistemul de operare (n cazul sistemului Microsoft Windows (95, NT) ) sau de
subsistemul grafic X Window care se execut sub sistemele de operare de tip Unix.
n aplicaiile de grafic tridimensional termenul de fereastr de vizualizare
(view plane window) se refer la regiunea rectangular care reprezint intersecia
dintre planul de vizualizare i volumul de vizualizare i n care sunt proiectate toate
obiectele vizibile ale scenei. Fereastra de vizualizare se afieaz ntr-o poart de
afiare (viewport) care se definete prin transformarea fereastr-poart. Poarta de
afiare grafic se amplaseaz ntr-o fereastr de afiare (window) i legtura dintre
poarta de afiare i fereastra de afiare este realizat diferit, n funcie de modul de
programare folosit (interfa Windows sau toolkit).
n progrmele dezvoltate sub GLUT, corelarea dintre poarta de afiare i
fereastra Window este asigurat de urmtoarele funcii:
void glutInit(int* argc, char** argv);
Aceast funcie iniializeaz GLUT folosind argumentele din linia de
comand; ea trebuie s fie apelat naintea oricror alte funcii GLUT sau OpenGL.
void glutInitDisplayMode(unsigned int mode);
Specific caracteristicile de afiare a culorilor i a bufferului de adncime i
numrul de buffere de imagine. Parametrul mode se obine prin SAU logic ntre
valorile fiecrei opiuni. De exemplu,
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH)
iniializeaz afiarea culorilor n modul RGB, cu dou buffere de imagine i buffer de
adncime. Alte valori ale parametrului mode sunt: GLUT_SINGLE (un singur buffer
de imagine), GLUT_RGBA (modelul RGBA al culorii), GLUT_STENCIL (validare
buffer ablon) GLUT_ACCUM (validare buffer de acumulare).
void glutInitWindowPosition(int x, int y);
Specific locaia iniial pe ecran a colului stnga sus al ferestrei de afiare.
void glutInitWindowSize(int width, int heigth);
Definete dimensiunea iniial a ferestrei de afiare n numr de pixeli pe
lime (width) i nlime (heigth) .
int glutCreateWindow(char* string);
Creeaz fereastra n care se afieaz contextul de redare (poarta) OpenGL i
returneaz identificatorul ferestrei. Aceast fereastr este afiat numai dup apelul
funciei glutMainLoop().
Funcii callback.
Funciile callback se definesc n program i se nregistreaz n sistem prin
intermediul unor funcii GLUT. Ele sunt apelate de sistemul de operare atunci cnd
este necesar, n funcie de evenimentele aprute.
glutDisplayFunc(void(*Display)(void));
Aceast funcie nregistreaz funcia callback Display n care se calculeaz
i se afieaz imaginea. Argumentul funciei este un pointer la o funcie fr
argumente care nu returneaz nici o valoare. Funcia Display (a aplicaiei) este
apelat oridecte ori este necesar desenarea ferestrei: la iniializare, la modificarea
dimensiunilor ferestrei, sau la apelul explicit al funciei gluPostRedisplay().
glutReshapeFunc(void(*Reshape)(int w, int h));
nregistreaz funcia callback Reshape care este apelat oridecte ori se
modific dimensiunea ferestrei de afiare. Argumentul este un pointer la funcia cu
numele Reshape cu dou argumente de tip ntreg i care nu returneaz nici o valoare.
n aceast funcie, programul de aplicaie trebuie s refac transformarea fereastr-
poart, dat fiind c fereastra de afiare i-a modificat dimensiunile.
glutKeyboardFunc(void(*Keyboard)(unsigned int key,
int x, int y);
nregistreaz funcia callback Keyboard care este apelat atunci cnd se
acioneaz o tast. Parametrul key este codul tastei, iar x i y sunt coordonatele
(relativ la fereastra de afiare) a mouse-ului n momentul acionrii tastei.
glutMouseFunc(void(*MouseFunc)(unsigned int button,
int state, int x, int y);
nregistreaz funcia callback MouseFunc care este apelat atunci cnd este
apsat sau eliberat un buton al mouse-ului. Parametrul button este codul butonului
(poate avea una din constantele GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON
sau GLUT_RIGHT_BUTTON) . Parametrul state indic apsarea (GLUT_DOWN) sau
eliberarea (GLUT_UP) al unui buton al mouse-ului. Parametrii x i y sunt coordonatele
relativ la fereastra de afiare a mouse-ului n momentul evenimentului.
Funcii de execuie GLUT
Execuia unui program folosind toolkit-ul GLUT se lanseaz prin apelul
funciei glutMainLoop(), dup ce au fost efectuate toate iniializrile i
nregistrrile funciilor callback. Aceast bucl de execuie poate fi oprit prin
nchiderea ferestrei aplicaiei. n cursul execuiei sunt apelate funciile callback n
momentele apariiei diferitelor evenimente. n cursul execuiei se mai poate executa un
proces atunci cnd nu apare nici un eveniment (atunci cnd coada de evenimente este
vid). Acest proces execut funcia callback IdleFunc nregistrat prin apelul
funciei glutIdleFunc(void(*IdleFunc)(void)); Aceast funcie este
folosit n animaie.
Generarea obiectelor tridimensionale
Multe programe folosesc modele simple de obiecte tridimensionale pentru a
ilustra diferite aspecte ale prelucrrilor grafice. GLUT conine cteva funcii care
permit redarea unor astfel de obiecte tridimensionale n modul wireframe sau cu
suprafee pline (filled). Fiecare obiect este reprezentat ntr-un sistem de referin local,
iar dimensiunea lui poate fi transmis ca argument al funciei respective. Poziionarea
i orientarea obiectelor n scen se face n programul de aplicaie. Exemple de astfel
de funcii sunt:
void glutWireCube(GLdouble size);
void glutSolidCube(GLdouble size);
void glutWireSphere(GLdouble radius, GLint slices,
GLint stacks);
void glutSolidSphere(GLdouble radius, GLint slices,
GLint stacks);
Programele GLUT au un mod specific de organizare, care provine din felul n
care sunt definite i apelate funciile callback. Acest mod va fi prezentat la primul
exemplu de program OpenGL-GLUT i va fi reluat apoi cu mici modificri i n alte
exemple.
Caracteristicile bibliotecii OpenGL
n fiierul header ale bibliotecii OpenGL (gl.h) sunt definite mai multe
constante simbolice care reprezint diferite stri, variabile sau valori de selecie a
opiunilor OpenGL. Aceste constante sunt toate scrise cu majuscule i sunt precedate
de prefixul GL_. De exemplu, constantele simbolice care definesc valorile TRUE i
FALSE i cele care selecteaz tipul unei primitive grafice sunt:
/* Boolean */
#define GL_TRUE 1
#define GL_FALSE 0
/* BeginMode */
#define GL_POINTS 0x0000
#define GL_LINES 0x0001
#define GL_LINE_LOOP 0x0002
#define GL_LINE_STRIP 0x0003
#define GL_TRIANGLES 0x0004
#define GL_TRIANGLE_STRIP 0x0005
#define GL_TRIANGLE_FAN 0x0006
#define GL_QUADS 0x0007
#define GL_QUAD_STRIP 0x0008
#define GL_POLYGON 0x0009
De asemenea, biblioteca OpenGL definete propriile tipuri de date, cele mai
multe corespunznd tipurilor de date fundamentale ale limbajului C .De exemplu, n
gl.h sunt definite urmtoarele tipuri:
typedef unsigned int GLenum;
typedef unsigned char GLboolean;
typedef signed char GLbyte;
typedef unsigned char GLubyte;
typedef short GLshort;
typedef int GLint;
typedef int GLsizei;
typedef unsigned int GLuint;
typedef float GLfloat;
typedef float GLclampf;
typedef double GLdouble;
typedef double GLclampd;
typedef void GLvoid;
Pentru a nelege funcionarea comenzilor OpenGL, se descriu n continuare
cele mai importante dintre caracteristicile OpenGL.
Poarta de afiare OpenGL
Poarta de afiare mai este numit context de redare (rendering context), i este
asociat unei ferestre din sistemul Windws. Dac se programeaz folosind biblioteca
GLUT, corelarea dintre fereastra Windows i portul OpenGL este asigurat de funcii
ale acestei biblioteci. Dac nu se folosete GLUT, atunci funciile bibliotecilor de
extensie XGL, WGL sau PGL permit atribuirea unui context de afiare Windows
pentru contextul de redare OpenGL i accesul la contextul de afiare Windows (device
context). Funcia OpenGL care definete transformarea fereastr-poart este:
void glViewport(GLint x, GLint y,
GLsizei width, GLsizei height);
unde x i y specific poziia colului stnga-jos al dreptunghiului porii n fereastra de
afiare (window) i au valorile implicite 0, 0. Parametrii weidth i heigth specific
limea, respectiv nlimea, porii de afiare, dat ca numr de pixeli. Se reamintete
c transformarea ferestr-poart este component a transformrii din sistemul de
referin normalizat n sistemul de referin ecran 3D (seciunea 4.4).
Un pixel este reprezentat n OpenGL printr-un descriptor care definete mai
muli parametri:
numrul de bii/pixel pentru memorarea culorii
numrul de bii/pixel pentru memorarea adncimii
numrul de buffere de imagine
Bufferul de cadru
Bufferul de cadru (frame buffer) conine toate datele care definesc o imagine
i const din mai multe seciuni logice: bufferul de imagine (sau bufferul de culoare),
bufferul de adncime (Z-buffer), bufferul ablon (stencil), bufferul de acumulare
(acumulation).
Bufferul de imagine (color buffer) n OpenGL poate conine una sau mai
multe seciuni, n fiecare fiind memorat culoarea pixelilor din poarta de afiare.
Redarea imaginilor folosind un singur buffer de imagine este folosit pentru imagini
statice, cel mai frecvent n proiectarea grafic (CAD). n generarea interactiv a
imaginilor dinamice, un singur buffer de imagine produce efecte nedorite, care
diminueaz mult calitatea imagii generate.
Orice cadru de imagine ncepe cu tergerea (de fapt, umplerea cu o culoare de
fond) a bufferului de imagine. Dup aceasta sunt generai pe rnd pixelii care aparin
tuturor elementelor imaginii (linii, puncte, suprafee) i intensitile de culoare ale
acestora sunt nscrise n bufferul de imagine. Pentru trecerea la cadrul urmtor, trebuie
din nou ters bufferul de imagine i reluat generarea elementelor componente, pentru
noua imagine. Chiar dac ar fi posibil generarea i nscrierea n buffer a elementelor
imaginii cu o vitez foarte mare (ceea ce este greu de realizat), tot ar exista un interval
de timp n care bufferul este ters i acest lucru este perceput ca o plpire a imaginii.
n grafica interactiv timpul necesar pentru nscrierea datelor n buffer este (n cazul
cel mai fericit) foarte apropiat de intervalul de schimbare a unui cadru a imaginii
(update rate) i, dac acest proces are loc simultan cu extragerea datelor din buffer i
afiarea lor pe display, atunci ecranul va prezenta un timp foarte scurt imaginea
complet a fiecrui cadru, iar cea mai mare parte din timp ecranul va fi ters sau va
conine imagini pariale ale cadrului. Tehnica universal folosit pentru redarea
imaginilor dinamice (care se schimb de la un cadru la altul) este tehnica dublului
buffer de imagine.
n aceast tehnic exist dou buffere de imagine: bufferul din fa (front), din
care este afiat imaginea pe ecran i bufferul din spate (back), n care se nscriu
elementele de imagine generate. Cnd imaginea unui cadru a fost complet generat, ea
poate fi afiat pe ecran printr-o simpl operaie de comutare ntre buffere: bufferul
spate devine buffer fa, i din el urmeaz s fie afiat imagine cadrului curent, iar
bufferul fa devine buffer spate i n el urmeaz s fie generat imaginea noului
cadru. Comutarea ntre bufferele de imagine se poate sincroniza cu cursa de revenire
pe vertical a monitorului i atunci imaginile sunt prezentate continuu, fr s se
observe imagini fragmentate sau plpiri.
n OpenGL comutarea bufferelor este efectuat de funcia SwapBuffers().
Aceast funcie trebuie s fie apelat la terminarea generrii imaginii tuturor
obiectelor vizibile n fiecare cadru.
Modul n care se execut comutarea bufferelor depinde de platforma
hardware. n lipsa unui accelerator grafic, toate operaiile OpenGL sunt executate
software, bufferul spate este o zon din memorie principal, iar bufferul fa este
memoria video din adaptorul grafic. La comutarea bufferelor care se produce la apelul
funciei SwapBuffers(), are loc copierea bufferului back (care este implementat ca
un bitmap independent de dispozitiv - DIB - device independent bitmap), n bufferul
front, care este memoria de ecran a adaptorului grafic.
Definirea i utilizarea bufferelor componente ale unui buffer de cadru
OpenGL este puin mai complex dect modul general de execuie descris mai sus,
deoarece se ofer posibilitatea creerii att a imaginilor cu simplu sau dublu buffer,
monografice i stereografice i selectarea bufferului n care se scrie sau se citete la un
moment dat. Funcia:
void glDrawBuffer(GLenum mode);
stabilete bufferul n care se deseneaz primitivele geometrice. Parametrul mode
poate lua una din valorile: GL_NONE, GL_FRONT_LEFT, GL_FRONT_RIGHT,
GL_BACK_LEFT, GL_BACK_RIGHT, GL_FRONT, GL_BACK, GL_LEFT,
GL_RIGHT, GL_FRONT_AND_BACK. Valoarea implicit este GL_FRONT
pentru imagini cu un singur buffer i GL_BACK pentru imagini cu dublu buffer.
Celelate opiuni se refer la imagini stereoscopice.
Funcia glReadBuffer(GLenum mode) stabilete bufferul curent din
care se citesc pixelii surs n operaii de combinare sau acumulare. Parametrul mode
poate lua una din valorile descrise mai sus. Valoarea implicit este GL_FRONT pentru
imagini monografice cu un singur buffer de culoare sau GL_BACK pentru imagini
monografice cu dou buffere de culoare.
Pentru imaginile stereografice, biblioteca OpenGL pune la dispoziie bufferele
necesare pentru definirea celor dou imagini diferite (stnga, dreapta), pentru simplu
i dublu buffer i funcii pentru selecia ntre acestea. Crearea propriu-zis a imaginilor
stereoscopice este rezolvat la nivelul programului de aplicaie i necesit dispozitive
de afiare adecvate.
Bufferul de adncime (depth buffer) memoreaz adncimea fiecrui pixel i,
prin aceasta, permite eliminarea suprafeelor ascunse. Bufferul de adncime conine
acelai numr de locaii ca i un buffer de imagine, fiecare locaie corespunznd unui
pixel, de o anumit adres.. Valoarea memorat n locaia corespunztoare unui pixel
este distana fa de punctul de observare (adncimea pixelului). La generarea unui
nou pixel cu aceeai adres, se compar adncimea noului pixel cu adncimea
memorat n bufferul de adncime, i noul pixel nlocuiete vechiul pixel (l
ascunde) dac este mai apropiat de punctul de observare. Bufferul de adncime se
mai numete i Z-buffer, de la coordonata z, care reprezint adncimea n sistemul de
referin ecran 3D.
Bufferul ablon (stencil buffer) este un buffer auxiliar care este utilizat pentru
restricionarea desenrii n anumite zone ale porii de afiare. Se pot obine astfel
imagini ncadrate n anumite abloane, ca de exemplu, instrumente de afiare folosite
n simulatoare de antrenament. Bufferul ablon poate fi folosit i pentru redarea
suprafeelor coplanare.
Bufferul de acumulare (accumulation buffer) este folosit pentru crearea
imaginilor antialising prin acumularea intensitilor de culoare a pixelilor rezultai prin
eantionarea imaginii.
Operaiile de baz OpenGL
OpenGL deseneaz primitive geometrice (puncte, linii i poligoane) n diferite
moduri selectabile. Primitivele sunt definite printr-un grup de unul sau mai multe
vrfuri (vertices). Un vrf definete un punct, captul unei linii sau vrful unui
poligon. Fiecare vrf are asociat un set de date:
coordonate,
culoare,
normal,
coordonate de textur.
Aceste date sunt prelucrate independent, n ordine i n acelai mod pentru
toate primitivele geometrice. Singura deosebire care apare este aceea c, dac o linie
sau o suprafa este decupat, atunci grupul de vrfuri care descriau iniial primitiva
respectiv este nlocuit cu un alt grup, n care pot apare vrfuri noi rezultate din
intersecia laturilor cu planele volumului de decupare (volumul canonic) sau unele
vrfuri din cele iniiale pot s dispar.
Comenzile sunt prelucrate n ordinea n care au fost primite n OpenGL, adic
orice comand este complet executat nainte ca s fie executat o nou comand.
OpenGL este o interfa procedural, secvena de comenzi (apeluri de funcii)
prescriu ce operaii s fie executate i nu ce rezultat s-ar dori s fie obinut. Se pot
specifica valori ale matricelor de transformare, tipul proieciei, coeficieni de reflexie,
etc. Datorit naturii procedurale a bibliotecii OpenGL, este important s fie cunoscut
modul n care operaz, pentru a putea s fie folosit cu succes.
Modelul de execuie OpenGL este modelul client-server. O aplicaie (client)
genereaz comenzi care sunt interpretate i executate de ctre OpenGL (server).
Serverul OpenGL poate s fie execut pe un alt calculator dect aplicaia, dar atunci
trebuie s fie definit un protocol de comunicaie client-server, dat fiind c nu exist
comenzi OpenGL pentru astfel de operaii.
Efectul comenzilor OpenGL asupra bufferului de imagine este controlat de
sistemul Windows care aloc zona de afiare a porii (viewport) OpenGL pe ecran.
Figura 6.1 prezint o diagram bloc simplificat a modului n care OpenGL
prelucreaz datele. S-au ignorat pentru nceput aspectele legate de texturare i anti-
alising. Secvena de operaii OpenGL (numit pipeline grafic) se execut asupra
vrfurilor i asupra datelor asociate acestora: coordonate, culoare, normal (i
coordonate de textur, care nu sunt reprezentate n figur). Succesiunea operaiilor
OpenGL urmeaz aproape identic succesiunea generic a operaiilor grafice prezentat
n Fig. 4.1.
Biblioteca OpenGL primete o succesiune de primitive geometrice pe care le
deseneaz, adic le convertete n mulimea de pixeli corespunztoare, nscriind
valorile culorilor acestora ntr-un buffer de imagine. n continuare sunt detaliate
fiecare dintre operaiile grafice prezentate n figur.
Modul n care este executat secvena de operaii pentru redarea primitivelor
grafice depinde de starea bibliotecii OpenGL, stare care este definit prin mai multe
variabile de stare ale acesteia (parametri). Numrul de variabile de stare ale bibliotecii
este destul de mare, descrierea lor ele poate fi gsit n manualul de referin (OpenGL
Reference Manual), iar pe parcursul expunerii vor fi prezentate numai cele mai
importante dintre acestea.
La iniializare, fiecare variabil de stare este setat la o valoare implicit. O
stare o dat setat i menine valoarea neschimbat pn la o nou setare a acesteia.
Variabilele de stare au denumiri sub form de constante simbolice care pot fi folosite
pentru aflarea valorilor acestora. De exemplu, n Fig. 6.1 sunt reprezentate dou
variabile de stare, culoarea curent i normala curent, care au denumirile definite n
gl.h:
#define GL_CURRENT_COLOR 0x0B00
#define GL_CURRENT_NORMAL 0x0B02
Normala
curent
Culoarea
curent
Normal
Culoare
Matricea ModelView
Iluminare i colorare
Vertex
Asamblare primitive
Normalizare (Matricea de proiecie)
Decupare la volumul canonic
mprirea la w; proiecie
Transformarea ferestr-poart
Conversie de rastru
Buffer de imagine
Fig. 6.1 Operaiile grafice OpenGL
Variabilele de stare OpenGL sunt de dou categorii: variabile de tip binar i
variabile definite prin diferite structuri de date.
Variabile de tip binar pot avea una din dou stri: starea activ (enabled) sau
starea inactiv (disabled). Setarea la starea activ se realizeaz prin apelul funciei:
void glEnable(GLenum param);
unde param este numele simbolic al parametrului (variabilei de stare).
Setarea la starea inactiv se realizeaz prin apelul funciei:
void glDisable(GLenum param);
De exemplu, apelul funciei glEnable(GL_DEPTH_TEST) activeaz
testul de adncime i actualizarea corespunztoare a bufferului de adncime (depth
buffer), iar apelul funciei glDisable(GL_DEPTH_TEST)dezactiveaz testul de
adncime.
n orice loc ntr-un program OpenGL, se poate afla valoarea unui parametru
binar prin apelul funciei:
GLboolean glIsEnabled(GLenum param);
care returneaz GL_TRUE dac parametrul param este n starea activ, i
GL_FALSE, dac parametrul param este n starea inactiv.
Valoarea unei variabile de stare care nu este de tip binar se seteaz prin apelul
unei funcii specifice variabilei respective, care are ca argumente valorile necesare
pentru actualizare. De exemplu, variabila de stare culoare curent, denumit
GL_CURRENT_COLOR, se seteaz prin funcia:
void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
la o valoare dat prin trei componente: rou (red), verde (green), albastru (blue).
Fiind o bibliotec dezvoltat n limbajul C, fr posibilitatea de suprancrcare
a funciilor, selecia unei funcii apelate cu diferite tipuri de argumente de apel este
realizat prin modificarea (printr-un sufix) a numelui funciei. De exemplu, funcia de
setare a culorii curente are mai multe variante, dup tipul i numrul argumentelor:
glColor3f(), glColor3ub(), glColor4d(), etc. n continuare, n
aceast lucrare se noteaz generic cu # sufixul dintr-o familie de funcii (de exemplu,
glColor#()).
Valoarea unui parametru (variabil de stare) OpenGL care nu este de tip binar
se poate obine n orice loc n program prin apelul uneia din funciile glGet#():
void glGetBooleanv(GLenum pname, GLboolean* params);
void glGetDoublev(GLenum pname, GLdouble* params);
void glGetFloatv(GLenum pname, GLfloat* params);
void glGetIntegerv(GLenum pname, GLint* params);
unde params este adreasa unde se depun valorile componente ale parametrului
pname. De exemplu, prin instruciunile:
GLfloat color[4];
glGetFloatv(GL_CURRENT_COLOR, color);
se obin cele patru componente ale culorii curente (red, green, blue, alpha) n vectorul
color.
Primitive geometrice
OpenGL execut secvena de operaii grafice asupra fiecrei primitive
geometrice, definit printr-o mulime de vrfuri i tipul acesteia. Coordonatele unui
vrf sunt transmise ctre OpenGL prin apelul unei funcii glVertex#(). Aceasta
are mai multe variante, dup numrul i tipul argumentelor. Iat, de exemplu, numai
cteva din prototipurile funciilor glVertex#():
void glVertex2d(GLdouble x, GLdouble y);
void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
void glVertex4d(GLdouble x, GLdouble y,
GLdouble z, GLdouble w);
Vrfurile pot fi specificate n plan, n spaiu sau n coordonate omogene,
folosind apelul funciei corespunztoare.
O primitiv geometric se definete printr-o mulime de vrfuri (care dau
descrierea geometric a primitivei) i printr-unul din tipurile prestabilite, care indic
topologia, adic modul n care sunt conectate vrfurile ntre ele. Mulimea de vrfuri
este delimitat ntre funciile glBegin() i glEnd(). Aceeai mulime de vrfuri
(v
0
, v
1
, v
2
,.v
n1
) poate fi tratat ca puncte izolate, linii, poligon, etc, n funcie de
tipul primitivei, care este transmis ca argument al funciei glBegin():
void glBegin(GLenum mode);
Valorile argumentului mode i, deci, tipurile de primitive acceptate de
OpenGL sunt prezentate n tabelul de mai jos. n Fig. 6.2 sunt ilustrate aceste primitive
geometrice.
Tabelul 6.1 Tipurile de primitive geometrice
Argument Primitiv geometric
GL_POINTS
Deseneaz n puncte
GL_LINES
Deseneaz segmentele de dreapt izolate (v0,v1), (v2,v3),
.a.m.d. Dac n este impar ultimul vrf este ignorat
GL_LINE_STRIP
Deseneaz linia poligonal format din segmentele (v0,v1),
(v1,v2), .. . (vn2, v n1)
GL_LINE_LOOP
La fel ca primitiva GL_LINE_STRIP, dar se mai desenez
segmentul (vn, v0) care nchide o bucl.
GL_TRIANGLES
Deseneaz o serie de triunghiuri folosind vrfurile (v0,v1,v2),
(v3,v4,v5), .a.m.d. Dac n nu este multiplu de 3, atunci ultimele
1 sau 2 vrfuri sunt ignorate.
GL_TRIANGLE_STRIP
Deseneaz o serie de triunghiuri folosind vrfurile (v0,v1,v2),
(v2,v1,v3),...a.m.d. Ordinea este aleas astfel ca triunghiurile s
aib aceeai orientare, deci s poat forma o suprafa nchis.
GL_TRIANGLE_FAN
Deseneaz triunghiurile (v0,v1,v2), (v0,v2,v3), .a.m.d.
GL_QUADS
Deseneaz o serie de patrulatere (v0,v1,v2,v3), (v4,v5,v6,v7),
.a.m.d. Dac n nu este multiplu de 4, ultimele 1, 2 sau 3
vrfuri sunt ignorate.
GL_QUADS_STRIP
Deseneaz o serie de patrulatere (v0,v1,v3,v2), (v3,v2,v5,v4),
.a.m.d Dac n < 4, nu se desenaz nimic. Dac n este impar,
ultimul vrf este ignorat.
GL_POLYGON
Deseneaz un poligon cu n vrfuri, (v0,v1,vn1). Dac
poligonul nu este convex, rezultatul este impredictibil.
Acest tabel, mpreun cu figura de mai jos (Fig. 6.2) sunt suficiente pentru
nelegerea modului n care OpenGL interpreteaz primitivele geometrice.
v
0
v
5
v
4
v
1
v
3
v
2
GL_POINTS
Fig. 6.2 Primitivele geometrice OpenGL
v
0
v
3
v
4
v
1
v
5
v
2
GL_QUADS
v
7
v
6
v
0
v
2
v
4
v
1
v
5 v
3
GL_QUAD_STRIP
v
6
v
7
v
0
v
5
v
4
v
1
v
3
v
2
GL_POLYGON
v
0
v
5
v
4
v
1
v
3
v
2
GL_LINES
v
0
v
5
v
3
v
2
v
4
v
1
GL_LINE_STRIP
v
0
v
5
v
4
v
1
v
3
v
2
GL_LINE_LOOP
v
0
v
5
v
4
v
1
v
3
GL_TRIANGLE_FAN
v
2
v
0
v
5
v
4
v
1 v
3
v
2
GL_TRIANGLES
v
1
v
5
v
4
v
0
v
3
v
2
GL_TRIANGLE_STRIP
v
2
Primitivele de tip suprafa (triunghiuri, patrulatere, poligoane) pot fi desenate
n modul cadru de srm (wireframe), sau n modul plin (fill), prin setarea variabilei
de stare GL_POLYGON_MODE folosind funcia:
void glPolygonMode(GLenum face, GLenum mode);
unde argumentul mode poate lua una din valorile:
GL_POINT : se deseneaz numai vrfurile primitivei, ca puncte n spaiu,
indiferent de tipul acesteia.
GL_LINE: muchiile poligoanelor se deseneaz ca segmente de dreapt.
GL_FILL: se deseneaz poligonul plin.
Argumentul face se refer la tipul primitivei geometrice (din punct de
vedere al orientrii) creia i se aplic modul de redare mode. Din punct de vedere al
orientrii, OpenGL admite primitive orientate direct (frontface) i primitive
orientate invers (backface). Argumentul face poate lua una din valorile:
GL_FRONT, GL_BACK sau GL_FRONT_AND_BACK, pentru a se specifica
primitive orientate direct, primitive orientate invers i, respectiv ambele tipuri de
primitive.
n mod implicit, sunt considerate orientate direct suprafeele ale cror vrfuri
sunt parcurse n ordinea invers acelor de ceas. Acest setare se poate modifica prin
funcia glFrontFace(GLenum mode), unde mode poate lua valoarea GL_CCW,
pentru orientare n sens invers acelor de ceas (counterclockwise) sau GL_CW, pentru
orientare n sensul acelor de ceasornic (clockwise).
Reprezentarea culorilor n OpenGL
n biblioteca OpenGL sunt definite dou modele de culori: modelul de culori
RGBA i modelul de culori indexate. n modelul RGBA sunt memorate componentele
de culoare R, G, B i transparena A pentru fiecare primitiv geometric sau pixel al
imaginii. n modelul de culori indexate, culoarea primitivelor geometrice sau a
pixelilor este reprezentat printr-un index ntr-o tabel de culori (color map), care are
memorate pentru fiecare intrare (index) componentele corespunztoare R,G,B,A ale
culorii. n modul de culori indexate numrul de culori afiabile simultan este limitat de
dimensiunea tabelei culorilor i, n plus, nu se pot efectua unele dintre prelucrrile
grafice importante (cum sunt umbrirea, antialiasing, ceaa). De aceea, modelul de
culori indexate este folosit n principal n aplicaii de proiectare grafic (CAD) n care
este necesar un numr mic de culori i nu se folosesc umbrirea, ceaa, etc.
n aplicaiile de realitate virtual nu se poate folosi modelul de culori indexate,
de aceea n continuare nu vor mai fi prezentate comenzile sau opiunile care se refer
la acest model i toate descrierile consider numai modelul RGBA.
Culoarea care se atribuie unui pixel dintr-o primitiv geometric depinde de
mai multe condiii, putnd fi o culoare constant a primitivei, o culoare calculat prin
interpolare ntre culorile vrfurilor primitivei, sau o culoare calculat n funcie de
iluminare, anti-aliasing i texturare. Presupunnd pentru moment culoarea constant a
unei primitive, aceasta se obine prin setarea unei variabile de stare a bibliotecii,
variabila de culoare curent (GL_CURRENT_COLOR). Culoarea curent se seteaz
folosind una din funciile glColor#(), care are mai multe variante, n funcie de
tipul i numrul argumentelor. De exemplu, cteva din prototipurile acestei funcii
definite n gl.h sunt:
void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
void glColor3ub(GLubyte red,GLubyte green, GLubyte blue);
void glColor4d(GLdouble red, GLdouble green,
GLdouble blue, GLdouble alpha);
Culoarea se poate specifica prin trei sau patru valori, care corespund
componentelor rou (red), verde (green), albastru (blue), respectiv transparen
(alpha) ca a patra component pentru funciile cu 4 argumente. Fiecare component a
culorii curente este memorat ca un numr n virgul flotant cuprins n intervalul
[0,1]. Valorile argumentelor de tip ntreg fr semn (unsigned int, unsigned char, etc.)
sunt convertite liniar n numere n virgul flotant, astfel nct valoarea 0 este
transformat n 0.0, iar valoarea maxim reprezentabil este transformat n 1.0
(intensitate maxim). Valorile argumentelor de tip ntreg cu semn sunt convertite liniar
n numere n virgul flotant, astfel nct valoarea negativ maxim este transformat
n 1.0, iar valoarea pozitiv maxim este transformat n 1.0 (intensitate maxim).
Valoarea final a culorii unui pixel, rezultat din toate calculele de umbrire,
anti-aliasing, texturare, etc, este memorat n bufferul de imagine, o component fiind
reprezentat printr-un numr n de bii (nu neaprat acelai numr de bii pentru
fiecare component). Deci componentele culorilor pixelilor memorate n bufferul de
imagine sunt numere ntreg n intervalul (0 , 2
n
1), care se obin prin conversia
numerelor n virgul mobil prin care sunt reprezentate i prelucrate culorile
primitivelor geometrice, ale materialelor, etc.
Exemplul 6.1
Secvena de funcii pentru redarea unui poligon n spaiul tridimensional i
imaginea corespunztoare generat de OpenGL arat n felul urmtor:
glColor3f(0.8,0.8,0.8);
glBegin(GL_POLYGON);
glVertex3d(-4,2,-20);
glVertex3d(-1,5,-20);
glVertex3d(5,2.5,-20);
glVertex3d(3,-3,-20);
glVertex3d(-1,-4,-20);
glEnd();
Indentarea instruciunilor cuprinse ntre glBegin() i glEnd() nu este
necesar n limbajul C (C++) n care este scris codul, ea este folosit doar pentru a
marca nceputul i sfritul primitivei geometrice.
n mod implicit, calculul transparenei nu este validat. Apelul funciei
glEnable(GL_BLEND), valideaz combinarea culorilor, prin care culoarea fiecrui
pixel al poligonului este combinat cu culoarea pixelului existent n bufferul de
imagine. Modul n care are loc combinarea se seteaz prin funcia glBlendFunc(),
care selecteaz unul din mai multe moduri de combinare liniar ntre culoarea
primitivei i culoarea existent n buffer. Prin combinarea culorilor se simuleaz
transparena suprafeelor precum i alte tehnici de redare realist a imaginilor (anti-
aliasing, cea). Exemple de transparen obinut prin combinarea culorilor sunt date
n seciunea 7.4.5.1.
Exemplul 6.2
Se poate genera un poligon regulat prin calculul coordonatelor vrfurilor i
folosirea lor ca argumente ale funciilor glVertex#(). De exemplu, calculul i
desenarea n OpenGL a conturului unui octogon n spaiu este urmtoarea:
#define PI 3.141592
int n = 8;
double radius = 10;
glColor3d(0,0,0);
glBegin(GL_LINE_LOOP);
for (int i=0;i<n;i++){
double angle = 2*PI*i/n;
glVertex3d(radius*cos(angle),
radius*sin(angle),-20);
}
glEnd();

Sistemul de vizualizare OpenGL
Sistemul de vizualizare OpenGL definete sistemele de referin,
transformrile geometrice i relaiile (matriceale) de transformare pentru redarea
primitivelor geometrice. Sistemul de vizualizare OpenGL este o particularizare a
sistemului PHIGS, n care centrul sistemului de referin de observare (VRP) coincide
cu centrul de proiecie (PRP).
Sistemele de referin
Sistemul de referin universal definit n OpenGL este un sistem drept, iar
matricea care reprezint un punct (n plan, n spaiul tridimensional sau n coordonate
omogene) este matrice coloan.
Pentru reprezentarea unei matrice 4x4 folosite pentru transformri geometrice
n coordonate omogene, n OpenGL este utilizat convenia coloan major: fiind dat
un numr de 16 valori reale (tip float sau double), n ordinea a
0
, a
1
, a
2
, a
15
,
matricea corespunztoare este:
1
1
1
1
]
1

15 11 7 3
14 10 6 2
13 9 5 1
12 8 4 0
a a a a
a a a a
a a a a
a a a a
A
Aceste convenii sunt aceleai cu conveniile adoptate n lucrarea de fa, deci
matricele de transformri geometrice ale bibliotecii OpenGL sunt identice cu cele
prezentate n seciunile precedente.
Sistemul de referin de observare este un sistem de referin drept, definit ca
localizare i orientare relativ la sistemul de referin universal. n acest sistem de
referin de observare se poate defini o transformare de proiecie paralel ortografic
sau de proiecie perspectiv.
Funciile oferite de OpenGL permit definirea proieciei perspective pe un plan
perpendicular pe axa z a sistemului de referin de observare, cu direcia de observare
spre z (Fig. 6.3). Trunchiul de piramid de vizualizare este orientat spre z
V
i poate
fi definit prin valorile:
znear : distana (dat ca valoare pozitiv) a planului de vizualizare i a
planului de vizibilitate apropiat fa de centrul sistemului de referin de
observare (O
V
)
zfar : distana (dat ca valoare pozitiv) a planului de vizibilitate deprtat
fa de centrul sistemului de referin de observare
left, right: specific coordonatele planelor verticale ale volumului de
vizualizare
top, bottom: specific coordonatele planelor orizontale ale volumului de
vizualizare.
Colul din stnga-jos (D) al ferestrei de vizualizare are coordonatele (left,
bottom, znear) n sistemul de referin de observare, iar colul din dreapta-sus
(B) are coordonatele (right, top, znear) n acelai sistem.
z
V
x
V
y
V
O
V
z
V
= zfar
z
V
= znear
A
B
D
C
Direcia de observare
z
V
Fig. 6.3 Definirea proieciei perspectiv i a volumului de vizualizare n OpenGL.
Funcia OpenGL care definete o astfel de proiecie perspectiv este funcia
glFrustum(), care are prototipul:
void glFrustum(GLdouble left, GLdouble right,
GLdouble bottom, GLdouble top,
GLdouble znear, GLdouble zfar);

Matricea de normalizare calculat n acest caz este o particularizare a
produsului matricelor date de relaiile 4.14, 4.15, 4.16, n care:
n = znear; d = znear; f = zfar;
x
min
= left; x
max
= right; y
min
= bottom; y
max
= top.
Deducerea ei este propus ca un exerciiu pentru cursani.
Transformri geometrice
Aa dup cum s-a mai artat, nu este eficient s se calculeze produsul dintre
matricea de reprezentare a fiecrui punct i matricele de transformri succesive, ci se
calculeaz o matrice de transformare compus, care se poate aplica unuia sau mai
multor obiecte. Pentru calculul matricelor de transformare compuse (prin produs de
matrice) se folosete o matrice de transformare curent i operaii de acumulare n
matricea curent prin postmultiplicare (nmulire la dreapta): se nmulete matricea
curent cu noua matrice (n aceast ordine) i rezultatul nlocuiete coninutul matricei
curente.
Pentru secvena de transformri n ordinea M
1
, M
2
M
n
, aplicate obiectelor,
se iniializeaz matricea curent C cu matricea identitate, dup care se calculeaz
matricea compus prin postmultiplicare n ordine invers celei n care se aplic
matricele componente:
P M ......M M M = MP = P'
M ......M M M = M = C
M ......M M M = CM = C
......M M M = CM = C
. .......... .......... ..........
M M = CM = C
M = CM = C
I = C
1 2 1 - n n
1 2 1 - n n
1 2 1 - n n 1
2 1 - n n 2
1 - n n 1 - n
n n
n aceast transformare, se aplic mai nti matricea M
1
punctului P; punctului
transformat rezultat i se aplic transformarea M
2
, .a.m.d.
Se poate reine deci c matricea compus M se scrie ca produs n ordinea
invers aplicrii transformrilor componente i tot n ordine invers se acumuleaz n
matricea curent.
Acest mod de calcul al matricelor compuse are suport n OpenGL prin mai
multe variabile interne (matrice curente) i funcii prin care acestea pot fi calculate.
Pentru nceput, se consider o matrice curent oarecare C stabilit n OpenGL
printr-o comand corespunztoare (va fi prezentat mai jos).
Matricea curent se poate iniializa cu matricea identitate prin funcia
glLoadIdentity(), sau cu o matrice oarecare, dat prin pointer la un vector de
16 valori consecutive, prin funcia glLoadMatrix#():
glLoadMatrixd(const GLdouble* m);
glLoadMatrixf(const GLfloat* m);
Valorile din vectorul GLdouble* m (respectiv GLfloat* m) sunt
atribuite n ordinea coloan major matricei curente.
Coninutul matricei curente poate fi modificat prin multiplicare (la dreapta) cu
o alt matrice, dat printr-un vector de 16 valori de tip double sau float utiliznd
funcia glMultMatrix#():
glMultMatrixd(const GLdouble* m);
glMultMatrixf(const GLfloat* m);
Matricea curent C este nlocuit cu produsul C M, unde M este matricea
corespunztoare vectorului dat prin pointerul m.
Crearea unei matrice pentru o transformare elementar (translaie, scalare, etc)
i nmulirea ei cu matricea curent se poate face prin apelul unei singure funcii
OpenGL.
Transformarea de translaie cu valorile x, y, z se implementeaz prin apelul
uneia din funciile glTranslated() sau glTranslatef(), dup tipul
argumentelor de apel:
glTranslated(GLdouble x, GLdouble y, GLdouble z);
glTranslatef(GLfloat x, GLfloat y, GLfloat z);
Funcia glTranslate#() creeaz o matrice de translaie T(x,y,z), dat de
relaia 3.2, nmulete la dreapta matricea curent C, iar rezultatul nlocuiete
coninutul matricei curente C, deci: C = C T(x,y,z).
Transformarea de scalare este efectuat de una din funciile glScaled()
sau glScalef():
glScaled(GLdouble x, GLdouble y, GLdouble z);
glScalef(GLfloat x, GLfloat y, GLfloat z);
Funcia glScale#() creaz o matrice de scalare S(x,y,z), i o nmulete cu
matricea curent, rezultatul fiind depus n matricea curent.
Transformarea de rotaie se definete printr-o direcie de rotaie dat prin
vectorul de poziie x,y,z i un unghi angle (specificat n grade). Prototipurile
funciilor de rotaie sunt:
glRotated(GLdouble angle, GLdouble x,
GLdouble y, GLdouble z);
glRotatef(GLfloat angle, GLfloat x,
GLfloat y, GLfloat z);
Rotaiile n raport cu axele de coordonate sunt cazuri particulare ale funciilor
glRotate#(). De exemplu, rotaia cu unghiul angle n raport cu axa x se obine la
apelul funciei glRotated(angle,1,0,0) sau glRotatef(angle,1,0,0).
Transformrile compuse se efectueaz prin acumularea produsului
matricelor componente n matricea curent. De exemplu, transformrile de modelare
din Exemplul 3.3 au fost implementate n OpenGL dup cum urmeaz.
Transformarea M
2
= T(0,8,0) S(2,2,2):
glTranslated(0,-8,0);
glScaled(2,2,2);
Transformarea M
3
= T(8,0,0)R
Z
(/4)S(2,1,2):
glTranslated(8,0,0);
glRotated(45,0,0,1);
glScaled(2,1,2);
Transformarea M
4
= T(8,0,0)R
Z
(/4)S(2,1,2):
glTranslated(-8,0,0);
glRotated(-45,0,0,1);
glScaled(2,1,2);
Stivele matricelor de transformare. Dup cum s-a mai artat, transformarea
unui obiect din sistemul de referin local (de modelare) n sistemul de referin
normalizat este compus din succesiunea transformrilor de modelare(instaniere)M
I
,
de observare M
V
i de normalizare M
N
:
M=M
N
M
V
M
I
Transformarea de instaniere M
I
este, n general, specific fiecrui obiect, deci
se calculeaz pentru fiecare obiect n parte.
Pentru cele mai multe din aplicaiile grafice, n care scena este observat dintr-
un singur punct de observare, matricea de observare M
V
este unic pentru toate
obiectele ntr-un cadru dat, dar se modific la cadrul urmtor (imaginea urmtoare),
dac observatorul i-a schimbat poziia de observare, situaie cea mai probabil n
grafica interactiv.
Matricea de normalizare M
N
este definit de parametrii de proiecie, care, aa
cum s-a prezentat n seciunea precedent, corespund construciei sistemului grafic
(tipul i numrul de proiectoare, unghiul de vizibilitate) deci aceast matrice este o
caracteristic constructiv a sistemului grafic i rmne constant pe toat perioada
desfurrii programului, pentru toate obiectele i pentru toate imaginile generate
(cadrele de imagine). n concluzie, sunt necesare urmtoarele matrice de transformare
n cursul generrii imaginilor succesive, la momentele (cadrele) i, i+1, i+2,
Cadrul i: M=M
N
M
Vi
M
I1
, pentru obiectul 1
M=M
N
M
Vi
M
I2
, pentru obiectul 2
..
M=M
N
M
Vi
M
Ik
, pentru obiectul k

Cadrul i+1: M=M


N
M
Vi+1
M
I1
, pentru obiectul 1
M=M
N
M
Vi+1
M
I2
, pentru obiectul 2
..
M=M
N
M
Vi+1
M
Ik
, pentru obiectul k

Se pune problema care este cea mai eficient organizare a acestor operaii de
transformri succesive. Dac s-ar utiliza o singur matrice curent, secvena
operaiilor de compunere ar trebui s fie efectuat pentru fiecare obiect, n fiecare
cadru de imagine. Este evident c utilizarea unei singure matrice curente de
transformare este ineficient i nejustificat, dat fiind c o matrice este o resurs
extrem de puin costisitoare.
Soluia adoptat n OpenGL este de a se folosi mai multe stive de matrice de
transformare, n care s fie reinute i reutilizate matricele intermediare de
transformare.
Transformrile de modelare i de observare sunt efectuate ntr-o stiv de
matrice, numit stiva matricelor de modelare-vizualizare (modelview matrix stack).
Transformarea de normalizare este prelucrat ntr-o stiv de matrice separat, numit
stiva matricelor de proiecie (projection matrix stack). Mai exist nc o stiv de
matrice pentru operaiile de texturare, numit stiva matricelor de texturare (texture
matrix stack). Separarea matricelor de modelare-vizualizare i de proiecie permite
execuia n paralel a operaiilor din pipeline-ul grafic al acceleratoarelor hardware care
au prevzute resurse pentru astfel de prelucrri.
Fiecare stiv de matrice se comport asemntor cu o stiv obinuit, asupra
creia se opereaz prin funcii de introducere (push) i extragere (pop). Aceste
funcii difer foarte puin fa de funciile push i pop folosite n general n
programare.
n orice moment, una din cele trei stive de matrice este declarat ca stiv
curent i toate operaiile cu matricele de transformare sunt adresate stivei curente.
Setarea unei stive curente se face prin apelul funciei
void glMatrixMode(GLenum mode);
unde argumentul mode poate lua una din constantele simbolice:
GL_MODELVIEW, pentru setarea stivei de modelare-vizualizare ca stiv curent
GL_PROJECTION, pentru setarea stivei de proiecie ca stiv curent
GL_TEXTURE, pentru setarea stivei de texturare ca stiv curent
Matricea din vrful stivei curente este matricea curent C, cu care se
efectueaz toate operaiile cu matrice(glLoadIdentity(), glLoadMatrix#(),
glMultMatrix#(), glTranslate#(), etc).
Funcia:
void glPushMatrix();
adaug o nou matrice n stiva curent, egal cu matricea din vrful acesteia, care
devine noul vrf al stivei (Fig. 6.4). ncrcarea unei noi valori n noua matrice curent
se face prin operaii ulterioare de ncrcare sau acumulare prin postmultiplicare. De
fapt, aceasta este caracteristica cea mai important a stivelor matricelor de
transformri, c operaia push se execut prin dou sau mai multe funcii:
glPushMatrix() creaz o nou poziie n capul stivei, identic cu valoarea
precedent, i n aceast poziie se continu operaiile de compunere a matricelor prin
postmultiplicare.
Funcia:
void glPopMatrix();
elimin matricea din vrful stivei curente, iar matricea precedent acesteia devine
noua matrice curent. Aceast funcie nu salveaz matricea eliminat (deci ea nu este
extras, ca n operaiile pop obinuite), iar dac aceast matrice ar mai fi necesar,
ea trebuie s fie copiat n alt zon de memorie, nainte de apelul funciei
glPopMatrix().
Funcia glPushMatrix() se apeleaz atunci cnd o matrice aflat n capul
stivei trebuie s fie salvat pentru a fi utilizat ulterior. Funcia glPopMatrix() se
apeleaz atunci cnd operaiile de compunere a matricelor trebuie s continue cu o
matrice aflat sub capul stivei.
La iniializarea bibliotecii OpenGL, fiecare stiv de matrice conine o matrice
care este vrful stivei respective.
Se poate prezenta acum un program OpenGL simplu, folosind utilitarul GLUT,
care exemplific folosirea stivelor matricelor de transformri geometrice.
Exemplul 6.3
Se reia ca exemplu de utilizare a stivelor matricelor de transformare
programul din exemplul 4.2, n care se genereaz imaginea unei scene obinut prin
instanierea a patru obiecte.
Matricea de normalizare i proiecie se calculeaz o singur dat i se
introduce n vrful stivei matricelor de proiecie. Pentru aceasta, se seteaz ca stiv
curent stiva matricelor de proiecie i se iniializeaz matricea din vrful acestei stive
cu matricea identitate:
C=M

C=M

glPushMatrix()
M

C=M

T
C=M

glTranslate#() glPopMatrix()
Fig. 6.4 Operaii cu stiva matricelor de transformare
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
Valoarea matricei de normalizare se seteaz folosind funcia glFrustum(),
descris mai sus. Funcia glFrustum() creeaz matricea de normalizare
corespunztoare argumentelor de apel, o nmulete cu matricea curent (care are
valoarea de matrice identitate), i depune rezultatul n matricea curent, care este
matricea din vrful stivel matricelor de proiecie. n acest exemplu se apeleaz:
glFrustum(1, 1,1, 1, 1, 40);
Matricele de transformare de modelare i observare se compun n stiva
matricelor de modelare-vizualizare. Sistemul de referin de observare are centrul n
punctul (xv,zv,yv) i este rotit cu un unghi gama n raport cu axa z. Paii de calcul
a matricelor sunt urmtorii:
(1) Mai nti se seteaz ca stiv curent stiva de modelare-vizualizare i se
iniilalizeaz matricea din vrful acesteia cu matricea identitate:
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
(2) Se creez n stiva curent matricea de transformare de observare
M
V
= R
Z
(gama)T(xv, yv, zv):
glRotated(-gama, 0,0,1);
glTranslated(-xv,-zv,-zv);
(3) Primul obiect are matricea de instaniere M
I1
= I, deci matricea curent
(care conine matricea de vizualizare) se aplic coordonatelor vrfurilor
cubului din sistemul de referin de modelare. Funcia Cube() transmite
aceste vrfuri ctre OpenGL:
Cube();
(4) Dac s-ar construi n acest moment matricea de transformare pentru
obiectul al doilea, prin multiplicarea matricei curente cu matricele
componente de instaniere din M
2
= T(0,8,0) S(2,2,2), atunci matricea de
observare, s-ar pierde i pentru urmtorul obiect ar trebui calculat din
nou. De aceea, se reine n stiv matricea de observare prin apelul funciei
glPushMatrix(), care creaz o nou matrice n vrful stivei, cu
aceeai valoare (egal cu M
V
). Matricea de instaniere M
2
se compune cu
matricea de observare n aceast nou matrice curent, se apeleaz funcia
Cube(), dup care matricea din vrful stivei (M
V
M
2
) nu mai este
necesar. Prin apelul funciei glPopMatrix(), aceast matrice este
eliminat i, n aceli timp, se regsete n vrful stivei matricea de
observare M
V
, care va putea fi folosit pentru obiectele urmtoare.
Funciile apelate n acest pas sunt:
glPushMatrix();
glTranslated(0,-8,0);
glScaled(2,2,2);
Cube();
glPopMatrix();
(5) Pentru celelalte obiecte se repet operaiile de la punctul 4.
Programul urmtor, care conine cele explicate mai sus, este un exemplu tipic
de program grafic folosind biblioteca OpenGL i utilitarul GLUT. n acest program se
poate urmri iniializarea bibliotecii GLUT, definirea funciilor callback i modul
de utilizare a stivelor de transformri geometrice. Unele funcii nou introduse n
program sunt explicate n comentarii.

#include <gl/glut.h>
// Initializari
void Init(){
glClearColor(1.0,1.0,1.0,0.0); // culoare de stergere
glEnable(GL_DEPTH_TEST); // validare Z-buffer
}
// Redare cub
void Cube(){
glColor3f(0.8,0.8,0.8);
glBegin(GL_POLYGON);
glVertex3d(-1,-1, 1);
glVertex3d( 1,-1, 1);
glVertex3d( 1, 1, 1);
glVertex3d(-1, 1, 1);
glEnd();
glColor3f(0,0,0);
glBegin(GL_LINE_LOOP);
glVertex3d(-1,-1,-1);
glVertex3d( 1,-1,-1);
glVertex3d( 1, 1,-1);
glVertex3d(-1, 1,-1);
glEnd();
glBegin(GL_LINE_LOOP);
glVertex3d(-1,-1,-1);
glVertex3d( 1,-1,-1);
glVertex3d( 1,-1, 1);
glVertex3d(-1,-1, 1);
glEnd();
glBegin(GL_LINE_LOOP);
glVertex3d(-1,1,-1);
glVertex3d( 1,1,-1);
glVertex3d( 1,1, 1);
glVertex3d(-1,1, 1);
glEnd();
glBegin(GL_LINE_LOOP);
glVertex3d(-1,-1,-1);
glVertex3d(-1, 1,-1);
glVertex3d(-1, 1, 1);
glVertex3d(-1,-1, 1);
glEnd();
glBegin(GL_LINE_LOOP);
glVertex3d(1,-1,-1);
glVertex3d(1, 1,-1);
glVertex3d(1, 1, 1);
glVertex3d(1,-1, 1);
glEnd();
}
// Generare axe de coordonate
void Axes(double x,double y, double z){
glColor3f(0,0,0);
glBegin(GL_LINES);
glVertex3d(0,0,0);
glVertex3d(x,0,0);
glVertex3d(0,0,0);
glVertex3d(0,y,0);
glVertex3d(0,0,0);
glVertex3d(0,0,z);
glEnd();
// Texte x, y, z
glColor3ub(0, 0, 0);
glRasterPos3f(1.1*x, 0.0, 0.0);
glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, 'x');
glRasterPos3f(0.0, 1.1*y, 0.0);
glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, 'y');
glRasterPos3f(0.0, 0.0, 1.1*z);
glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, 'z');
// SAGETI
..
}
// Functia callback apelata la schimbarea dim. ferestrei
void Reshape(int w, int h){
h = (h == 0) ? 1 : h;
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-(GLfloat)w/(GLfloat)h,
(GLfloat)w/(GLfloat)h, -1, 1, 1, 40);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
static double xv = 2, yv = 2, zv = 20;
static double gama = 0;
// Functia callback de generare imagine
void Display(){
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotated(-gama, 0,0,1);
glTranslated(-2,-2,-20);
// transf. de obs.: C = RZ(30)T(2,2,20)
Axes(16,8,16);
Cube(); // primul obiect
glPushMatrix(); // al doilea obiect
glTranslated(0,-8,0);
glScaled(2,2,2);
// C = RZ(30)T(2,2,20)T(0,8,0)S(2,2,2)
Cube();
glPopMatrix(); // C = RZ(30)T(2,2,20)
glPushMatrix(); // al treilea obiect
glTranslated(8,0,0);
glRotated(45,0,0,1);
glScaled(2,1,2);
// C = RZ(30)T(2,2,20)T(8,0,0)RZ(45)S(2,2,2)
Cube();
glPopMatrix(); // C = RZ(30)T(2,2,20)
glPushMatrix(); // al patrulea obiect
glTranslated(-8,0,0);
glRotated(-45,0,0,1);
glScaled(2,1,2);
//C = RZ(30)T(2,2,20)T(8,0,0)RZ(45)S(2,1,2)
Cube();
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
int main(int argc, char** argv){
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB
| GLUT_DEPTH );
glutInitWindowSize(500,500);
glutInitWindowPosition(100,100);
glutCreateWindow("Transformari grafice");
Init();
glutDisplayFunc(Display);
glutReshapeFunc(Reshape);
glutMainLoop();
return 0;
}
n funcia local de iniializare Init() se seteaz culoarea de tergere a
bufferului de imagine folosind funcia glClearColor(). Aceast culoare de tergere
este memorat ntr-o variabil de stare i este folosit pentru tergerea bufferului de
imagine atunci cnd se apeleaz funcia glClear(). De asemenea, se valideaz
testul de adncime, pentru eliminarea suprafeelor ascunse.
Funcia cea mai important a programului este funcia Display() n care
se execut toate operaiile de generare a unei imagini: tergerea bufferului de imagine,
(funcia glClear() ), crearea matricelor de transformare n stiva matricelor de
modelare-vizualizare, generarea imaginii a patru obiecte aplicnd transformarea
corespunztoare modelului cub (funcia Cube()). La sfritul operaiilor de generare
a imaginii, se comut bufferul de imagine prin apelul funciei
glutSwapBuffers(). Valorea matricei curente n fiecare pas de execuie este
scris n comentarii. Indentrile instruciunilor nu sunt necesare, dar permit urmrirea
mai uoar a operaiilor cu stivele de matrice. Funcia callback Display este apelat
de sistemul de operare ori de cte ori este necesar redesenarea ferestrei de afiare.
O form foarte simplificat de desenare a unui obiect tridimensional format
din mai multe fee, fiecare fa format din mai multe vrfuri, este dat n funcia
Cube(). Ctre OpenGL se transmit primitive geometrice compuse din vrfurile
fiecrei fee date n coordonate n sistemul de referin local (de modelare). Dac se
urmrete diagrama de execuie a operaiilor n OpenGL din Fig. 6.1, se vede c
asupra vrfurilor unei primitive se aplic transformarea din matricea curent din stiva
de modelare-vizualizare. De aceea este posibil ca, pentru fiecare instaniere, s fie
transmise aceleai coordonate (ale modelului), care sunt transformate (instaniere i
observare) n sistemul de referin de observare. n exemplul dat, prima fa se
deseneaz ca un poligon plin de culoare gri, iar celelate ca muchii de culoare neagr,
pentru o mai bun percepere a imaginii desenate alb-negru.
Secvena de operaii continu cu asamblarea primitivelor geometrice, folosind
informaiile topologice transmise de funcia glBegin() i vrfurile primitivei
transformate n sistemul de referin de observare, normalizarea, folosind matricea din
vrful stivei matricelor de proiecie, decuparea, mprirea omogen, proiecia,
transformarea fereastr poart i conversia de rastru pentru nscrierea valorilor
corespunztoare a pixelilor primitivei geometrice.
Funcia de redare a axelor de coordonate Axes() genereaz axele de
coordonate i numele lor, printr-un caracter afiat folosind funcia:
glutBitmapCharacter(). Partea de desenare a sgeilor axelor nu este
prezentat dar se poate completa cu uurin.
Funcia callback de redimensionare Reshape() primete la apelul ei de
ctre sistem dimensiunile w i h ale ferestrei de afiare. n aceast funcie se seteaz
dimensiunea porii egal cu dimensiunea ferestrei de afiare i cu colul stnga-jos n
punctul de coordonate (0,0) al ferestrei, prin apelul funciei glViewport(). Tot n
aceast funcie callback este definit transformarea de normalizare i proiecie
perspectiv (glFrustum()) astfel nct scalarea dintre fereastra de vizualizare i
poarta de afiare (care a fost setat egal cu fereastra de afiare) s fie uniform, adic
raportul dintre dimensiunile pe orizontal i vertical ale ferestrei de vizualizare s fie
egal cu raportul dintre dimensiunile pe orizontal i vertical ale porii de afiare.
Funcia de definire a proieciei perspectiv i a volumului de vizualizare,
glFrustum(), opereaz asupra stivei matricelor de proiecie. Funcia Reshape()
este apelat att la lansarea programului aplicaiei ct i la orice modificare a
dimensiunilor ferestrei.
n funcia main() a programului aplicaiei sunt apelate funciile GLUT de
iniializare a ferestrei de afiare, sunt nregistrate funciile callback necesare i apoi se
intr n execuia programului la apelul funciei glutMainLoop().
Imaginile din figurile 4.7 a,b,c,d,e,f s-au obinut prin modificarea
corespunztoare a valorilor variabilelor xv, yv, zv, gama i recompilarea
programului.

Stivele matricelor de transformare sunt deosebit de utile pentru redarea
scenelor i a obiectelor modelate ierarhic, n care scena sau fiecare obiect este compus
din mai multe subobiecte, pe mai multe nivele de ierarhie. Fiecare obiect component
este definit printr-o matrice de localizare relativ la obiectul cruia i aparine (obiect
printe), i instanierea acestuia se obine prin compunerea matricei de localizare
proprii cu matricea de localizare a obiectului printe. Reprezentarea i redarea
scenelor modelate ierarhic este tratat n seciunea 6, dar n exemplul urmtor se va
prezenta un scurt program de aplicaie care folosete compunerea mai multor
transformri de modelare.
Exemplul 6.4
Programul descrie construirea unui sistem solar foarte simplificat, cu soarele,
dou planete i un satelit al uneia dintre planete. Sferele care reprezint aceste corpuri
sunt redate folosind funcii ale bibliotecii GLUT, gluSolidSphere() i
gluWireSphere() care primesc ca argumente dimensiunea, numrul de paralele i
numrul de meridiane ale sferei.
Se consider c soarele se afl n centrul sistemului de referin universal i c
planetele execut o micare de rotaie n jurul soarelui n planul z = 0, la distane
diferite. Satelitul execut o micare de rotaie n jurul unei planete, de asemenea n
planul z = 0. Sistemul de referin de observare are axele paralele cu axele sistemului
universal i centrul pe axa z pozitiv, la o valoare convenabil aleas pentru a avea
obiectele n cmpul de vizibilitate.
Poziia centrului unei planete depinde de raza de rotaie r
P
n jurul soarelui i
de unghiul de rotaie (dat de variabila
P
care variaz ntre 0 i 360) i are
coordonatele ) 0 , sin r , cos r ( C
P P P P P
. Se poate observa uor c aceaste coordonate
se obin printr-o translaie cu T(r
P
,0,0), urmat de o rotaie cu R
Z
(
P
), deci matricea de
instaniere a unei planete este M
P
= R
Z
(
P
)T(r
P
,0,0).
Transformarea de instaniere a satelitului se calculeaz relativ la sistemul de
referin local al planetei sale. La fel ca i pentru o planet, poziia centrulului
satelitului depinde de raza de rotaie (r
S
) a acestuia i unghiul de rotaie (
S
) i are
coordonatele n sistemul de referin local al planetei ) 0 , sin r , cos r ( C
S S S S S
.
Rezult c matricea de instaniere a satelitului relativ la sistemul de referin al
planetei sale este M
S
= R
Z
(
S
)T(r
S
,0,0). Programul de reprezentare a acestui sistem
solar este urmtorul:
#include <gl/glut.h>
#define rp1 1.8
#define rp2 1.2
#define rs1 0.6
static int rop1 = 20, rop2 = 40, ros1 = 20;
static float zpos = 5;
void Init(){
glClearColor(1.0,1.0,1.0,0.0);
glEnable(GL_DEPTH_TEST);
}
void Axes(double x,double y, double z){
// aceeai funcie ca n exemplul precedent
}
void Keyboard(unsigned char key, int x, int y){
switch (key){
case 'Z':
zpos = zpos+0.1;
glutPostRedisplay();
break;
case 'z':
zpos = zpos-0.1;
glutPostRedisplay();
break;
case 'P':
rop1 = (rop1+10)%360;
rop2 = (rop2+10)%360;
glutPostRedisplay();
break;
case 'p':
rop1 = (rop1-10)%360;
rop2 = (rop2-10)%360;
glutPostRedisplay();
break;
case 'S':
ros1 = (ros1+10)%360;
glutPostRedisplay();
break;
case 's':
ros1 = (ros1-10)%360;
glutPostRedisplay();
break;
}
}
void Display(void){
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(-1,-1,-zpos); //transf.de obs.
Axes(3,1.5,2.5);
glColor3f(0.4,0.4,0.4);
glutSolidSphere(0.6, 16, 16); // soare
glColor3f(0,0,0);
glPushMatrix();
glRotatef(rop1, 0,0,1);
glTranslatef(rp1,0,0);
glutWireSphere(0.25, 8, 8); // planeta 1
Axes(1,0.8,1.8);
glRotatef(ros1, 0,0,1);
glTranslatef(rs1,0,0);
glutSolidSphere(0.1, 8, 8); // satelit 1
Axes(0.5,0.5,1);
glPopMatrix();
glRotatef(rop2, 0,0,1);
glTranslatef(rp2,0,0);
glutWireSphere(0.2, 8, 8); // planeta 2
Axes(0.5,1.1,2.5);
glPopMatrix();
glutSwapBuffers();
}
void Reshape(int w, int h){
h = (h == 0) ? 1 : h;
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0,(GLfloat)w/(GLfloat)h, 1, 40.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main(int argc, char** argv){
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB
| GLUT_DEPTH );
glutInitWindowSize(500,500);
glutInitWindowPosition(100,100);
glutCreateWindow("Sistem Solar");
Init();
glutDisplayFunc(Display);
glutReshapeFunc(Reshape);
glutKeyboardFunc(Keyboard);
glutMainLoop();
return 0;
}
Imaginile obinute la execuia acestui program sunt prezentate n Fig. 4.5. n
funcia Init() se valideaz funcionarea algoritmului de Z-buffer, pentru ascunderea
suprafeelor ascunse n funcie de adncime (coordonata z n sistemul de referin
normalizat) prin funcia glEnable(GL_DEPTH_TEST). Valoarea cu care este
ters bufferul de adncime la nceputul fiecrui cadru (la execuia funciei
glClear()) are implicit valoarea maxim a coordonatei z a volumului canonic n
sistemul de referin normalizat (1.0).
n funcia Reshape() este utilizat o alt funcie de definire a proieciei
perspectiv, funcia gluPerspective() din biblioteca GLU, care este o versiune
simplificat a funciei glFrustum(). Prototipul acestei funcii este:
void gluPerspective(GLdouble fovy, GLdouble aspect,
GLdouble zNear, GLdouble zFar);
unde fovy este unghiul de vizibilitate pe vertical (n grade); aspect este raportul
w/h a dimensiunilor pe orizontal i vertical a ferestrei de afiare; zNear i zFar
sunt valorile absolute ale distanelor planelor de vizibilitate apropiat, respectiv
deprtat.

(a) rop1=0; rop2 = 0;ros1 = 0;
Funcia callback Keyboard() este apelat la acionarea unei taste. n acest
exemplu simplu sunt tratate cteva taste. Tasta z scade iar tasta Z crete valoarea
coordonatei z
V
a observatorului. Tastele p i P scad, respectiv, cresc unghiul de
rotaie al planetelor. Tastele s i S scad, respectiv, cresc unghiul de rotaie al
satelitului. Se obine o micare interactiv (foarte simplificat, e adevrat, dar
intuitiv) a planetelor i satelitului.
Funcia callback Display() se execut la fiecare redesenare care are loc la
modificarea dimensiunilor ferestrei de afiare i prin apelul funciei
glutPostRedisplay(), la modificarea poziiei de observare (zpos) sau a uneia
dintre valorile unghiurilor rop1, rop2 sau ros1.
Pstrarea matricei identitate n stiva de modelare-vizualizare, astfel nct s
poat fi folosit pentru o nou secven de compunere se realizeaz prin perechea de
funcii glPushMatrix() i glPopMatrix() cea mai exterioar din funcia
Display(). Matricea de transformare de observare construit n matricea curent
este reinut n stiv prin cea-a de-a doua funcie glPushMatrix(). Matricea de
instaniere pentru prima planet necesit introducerea mai nti a rotaiei i apoi a
translaiei i ea se aplic acesteia. Matricea de instaniere a satelitului se construiete
prin compunerea matricei sale de instaniere cu matricea de instaniere a planetei
respective. Dup instniere satelitului, matricea de instaniere a acestuia nu mai este
(b) rop1 = 20; rop2 = 40; ros1 = 20;
Fig. 6.5 Dou imagini ale sistemului solar,
pentru dou poziii diferite ale planetelor i satelitului.
necesar, funcia glPopMatrix()o elimin din stiv i vrful stivei conine acum
matricea de transformare de observare, care poate fi folosit pentru compunerea
matricei pentru cea de-a doua planet. n Fig. 4.5 sunt prezentate dou imagini captate
din fereastra de afiare a programului pentru diferite valori ale poziiilor planetelor i
satelitului. Imaginea nefiind color, s-a considerat c reprezentarea wireframe pentru
planete este mai sugestiv. Pentru fiecare obiect s-au desenat i axele de coordonate
ale sistemul de referin local.
Este interesant de precizat faptul c, n marea majoritate a aplicaiilor grafice,
fiecare imagine (cadru, frame) se genereaz independent de imaginile precedente.
Pentru fiecare cadru se calculeaz poziia de observare i poziia obiectelor n scen
(dac aceasta variaz, aa cum este situaia n exemplul sistemului solar) i imaginea
se genereaz pornind de fiecare dat de la aceste informaii. Trecerea de la o imagine
la urmtoarea prin acumularea unor valori (de micare sau de poziie) nu aduce nici un
beneficiu semnificativ ca vitez de execuie i poate produce erori de poziionare la
execuie un timp ndelungat. Chiar modificarea cu o valoare extrem de mic a poziiei
primitivelor geometrice redate pe display necesit tergerea imaginii precedente i
construirea uneia noi prin reluarea ntregii succesiuni a operaiilor grafice, deoarece
este foarte complicat (practic imposibil) de a se calcula ce pri ale ecranului rmn
neschimbate i ce pri se modific i cum se modific.
Decuparea suprafeelor i eliminarea
obiectelor aflate n exteriorul volumului
de vizualizare
n OpenGL decuparea primitivelor geometrice la volumul de vizualizare este
efectuat n mod automatizat, fr nici o intervenie din partea programatorului.
Volumul de vizualizare se definete o dat cu definirea proieciei perspectiv (folosind
una din funciile glFrustum() sau gluPerspective()) sau a proieciei
paralele (folosind funcia glOrtho()). Dac se urmrete diagrama de execuie din
Fig. 6.1, se poate observa c, dup ce vrfurile au fost transformate prin nmulire cu
matricea curent a stivei de modelare-vizualizare, se recompun primitivele
geometrice, dup care se aplic transformarea de normalizare i decuparea. n cursul
transformrii de modelare-vizualizare, vrfurile au fost tratate individual (transformat
fiecare n parte), dar pentru decupare este necesar s fie recompuse n primitive,
deoarece decuparea se efectueaz prin parcurgere n ordine a laturilor poligoanelor.
Fiind o bibliotec de funcii de nivel sczut, care se ocup de redarea unor
primitive geometrice, OpenGL nu prevede nici o facilitate pentru eliminarea obiectelor
care sunt n exteriorul volumului de vizualizare (culling). Este sarcina programatorului
s defineasc volumele de delimitare, s le transforme din sistemul local n sistemul
de referin de observare i s le utilizeze pentru eliminarea obiectelor aflate complet
n exteriorul volumului de vizualizare (obiecte invizibile).
Diferite sisteme de dezvoltare a aplicaiilor grafice (cum sunt sistemele
Sense8 i Performer) ofer suport pentru definirea i utilizarea volumelor de
delimitare i eliminare a obiectelor invizibile.
Eliminarea suprafeelor ascunse
n OpenGL este implementat algoritmul Z-buffer de eliminare a suprafeelor
ascunse. Numrul de bii/pixeli ai bufferului de adncime se stabilete la definirea
formatului pixelului. Implicit, se seteaz bufferul de adncime cu 32 bii/pixel. Dac
se folosete utilitarul GLUT, atunci funcia de iniializare a modului de afiare trebuie
s conin opiunea GLUT_DEPTH:
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH)
La iniializarea bibliotecii OpenGL testul de adncime este invalidat. Pentru
validarea lui se apeleaz funcia glEnable(GL_DEPTH_TEST), iar la nceputul
fiecrui cadru de imagine trebuie s fie ters i bufferul de adncime, o dat cu
tergerea bufferului de imagine, ceea ce se obine prin introducerea opiunii
GL_DEPTH_BUFFER_BIT n apelul funciei glClear():
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Valoarea cu care se terge bufferul de adncime este implicit valoarea
maxim 1, iar testul care se efectueaz implicit este de nscriere a noului pixel dac are
adncimea mai mic dect valoarea din buffer (GL_LESS). n OpenGL mai exist
posibilitatea de a defini alt valoare de tergere a bufferului de adncime (prin funcia
glClearDepth(GLclampd depth)), ca i stabilirea testului de comparaie,
prin funcia
void glDepthFunc(GLenum func);
unde func poate fi una din mai multe constante simbolice admise (GL_NEVER,
GL_LESS, GL_EQUAL, GL_LEQUAL, GL_GREATER, GL_NOTEQUAL,
GL_GEQUAL, GL_ALWAYS) .
Selecia suprafeelor n funcie de
orientare
OpenGL ofer suport direct pentru selecia primitivelor geometrice n funcie
de orientarea lor. O primitiv geometric este de categoria cu orientare direct (spre
fa - frontface) dac sensul de parcurgere al acesteia (ordinea vrfurilor date prin
funciile glVertex#() cuprinse n blocul glBegin(),glEnd()), este aceeai cu
ordinea stabilit prin funcia glFrontFace() (n sensul acelor de ceas sau n sens
invers acelor de ceas). Alftel, primitiva are orientare invers (spre spate - backface).
Prin funcia glCullFace(GLenum type) se selecteaz care tip de suprafee
trebuie s fie eliminate: dac argumentul type are valoare GL_BACK sunt eliminate
primitivele cu orientare invers; dac are valoarea GL_FRONT sunt eliminate
primitivele cu orientare direct. Testul de orientare i eliminarea primitivelor se
execut numai dac a fost validat acest test, prin apelul funciei
glEnable(GL_CULL_FACE).
n segmentul de cod care urmeaz, cele dou poligoane sunt cu orientare
direct (front) deoarece vrfurile lor sunt date n sensul invers acelor de ceas, aa cum
este setarea implicit a sensului de parcurgere direct n OpenGL. Primul poligon este
desenat, deoarece este activ opiunea de eliminare a primitivelor cu orientare invers,
iar al doilea nu este desenat, deoarece este activ opiunea de eliminare a primitivelor
cu orientare direct.
void Display(){
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glEnable(GL_CULL_FACE);// valideaz selectia
glCullFace(GL_BACK); // se elimina primitive inverse
glColor3f(0.5,0.5,0.5);
glBegin(GL_POLYGON); //orientat direct, se deseneaza
glVertex3d(3,3,-10);
glVertex3d(4,3,-10);
glVertex3d(4,4,-10);
glVertex3d(3,4,-10);
glEnd();
glCullFace(GL_FRONT); // se elimina primitive directe
glBegin(GL_POLYGON);//orientat direct, nu se deseneaza
glVertex3d(1,1,-10);
glVertex3d(2,1,-10);
glVertex3d(2,2,-10);
glVertex3d(1,2,-10);
glEnd();
}
Liste de display OpenGL
O list de display este un grup de comenzi OpenGL care sunt memorate
pentru a fi utilizate ulterior. Atunci cnd este apelat o list de display, comenzile pe
care le conine sunt executate n ordinea n care ele au fost memorate. Listele de
display pot mbunti performanele de execuie atunci cnd se redeseneaz aceleai
forme geometrice de mai multe ori.
Definirea unei liste de display ncepe cu apelul funciei glNewList() i se
termin la apelul funciei glEndList(). Prototipul funcia glNewList este:
void glNewList(GLuint list, GLenum mode);
Parametrul list este un indice care identific lista de display i este folosit la
apelul acesteia. Parametrul mode poate lua una din constantele simbolice
GL_COMPILE sau GL_COMPILE_AND_EXECUTE. Modul GL_COMPILE are ca
efect compunerea listei de displaz. Modul GL_COMPILE_END_EXECUTE are ca
efect compunerea listei i execuia ei imediat.
O list de display cu indicele list este executat la apelul funciei:
void glCallList(GLuint list);
Ca exemplu de utilizare a unei liste de display se reiau comenzile de desenare
a unui octogon din Exemplul 6.2.
#include <math.h>
#include <gl\glut.h>
#define PI 3.141592
void DispList1(){
glNewList(1,GL_COMPILE);
int n = 8;
double radius = 10;
glColor3d(0,0,0);
glBegin(GL_LINE_LOOP);
for (int i=0;i<n;i++){
double angle = 2*PI*i/n;
glVertex3d(radius*cos(angle),
radius*sin(angle),-40);
}
glEnd();
glEndList();
}
void Init(){
glClearColor(1.0,1.0,1.0,1.0);
DispList1();
}
void Display(){
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glCallList(1);
glutSwapBuffers();
}
Funciile Reshape() i main() ale programului sunt cele prezentate n
programele precedente. Funcia DisplayList() apelat la iniializare creaz lista
de display cu indicele 1 care conine calculul coordonatelor octogonului i OpenGL de
desenare a acestuia. n funcia Display() este apelat funcia glCallList(1),
care redeseneaz octogonul la fiecare apel.
Avantajul listelor de display este semnificativ atunci cnd, pentru generarea
unei imagini, se folosesc funcii de calcul combinate cu comenzi OpenGL: calculele se
execut o singur dat, la crearea listei, iar comenzile OpenGL rezultate se execut la
fiecare apel al listei.
O astfel de situaie este prezent i n exemplul de mai sus i apare frecvent n
operaiile de iluminare, umbrire i texturare a obiectelor.
Texturarea n OpenGL
Biblioteca OpenGL permite texturarea obiectelor, oferind suport pentru un
numr foarte mare de posibiliti de definire, aplicare i filtrare a texturilor. n lucrare
vor fi prezentate numai o parte dintre aceste posibiliti, ca exemplificare a modului de
implementare a texturrii i ca baz de pornire n crearea aplicaiilor grafice. Celelate
aspecte, mai de detaliu, se pot urmri n manualul de referin al bibliotecii, precum i
n numeroasele exemple care sunt disponibile n OpenGL i GLUT. .
Se pot defini texturi unidimensionale sau bidimensionale, cu rezoluii (numr
de texeli) care se specific la crearea imaginii texturii. Fiecare texel const din una,
dou, trei sau patru componente, reprezentnd valori de modulare sau cvadruple
RGBA. Texturarea poate fi validat sau invalidat prin apelul funciei glEnable(),
respectiv glDisable(), cu argument una din constantele simbolice
GLTEXTURE_1D sau GL_TEXTURE_2D, pentru texturi unidimensionale sau
bidimensionale.
Definirea texturilor
n OpenGL se pot defini mai multe texturi (n general, la iniializarea
programului) i fiecare suprafa se textureaz folosind una dintre acestea. Fiecare
textur (obiect textur - texture object) are un nume unic n program i este definit
printr-un set de date care permit aplicarea acesteia suprafeelor: adresa imaginii
texturii, funcia texturii (modulare, nlocuire, combinare), i proprietile texturii
(filtrri, mod de repetare, etc).
Posibilitatea de a manevra mai multe texturi n timpul execuiei, fr s fie
necesar ncrcarea sau generarea imaginii texturii de fiecare dat, mbuntete
performanele de texturare. Deoarece OpenGL este o interfa de programare scris n
limbajul C, obiectele textur sunt definite prin date i funcii separate, care trebuie s
fie specificate ntr-o anumit ordine:
(a) Generarea numelor texturilor.
(b) Crearea obiectelor textur i conectarea lor (bind) la numele texturilor.
(c) Activarea unei texturi, pentru aplicarea acesteia primitivelor geometrice
care urmeaz.
Numele texturii. Numele texturilor sunt numere ntregi fr semn (de tipul
GLuint) care sunt memorate ntr-un vector transmis ca argument funciei:
void glGenTextures(GLsizei n, GLuint *textureNames);
Aceast funcie creeaz un vector de n nume de texturi, unice n program, pe
care le memoreaz n vectorul textureNames. Numele create nu sunt neaprat
numere succesive. Funcia glGenTextures() creeaz numai numele texturilor i
le marcheaz ca utilizate, dar obiectele textur se creeaz numai la conectarea (bind)
acestora.
Crearea texturilor. Funcia glBindTexture() se folosete att pentru
crearea ct i pentru utilizarea unei texturi. Prototipul ei este:
void glBindTexture(GLenum target, GLuint texName);
Parametrul target poate avea ca valoare una din constantele simbolice
GL_TEXTURE_1D sau GL_TEXTURE_2D, pentru texturi unidimensionale, respectiv
bidimensionale. Argumentul texName este numele unei texturi, generat de funcia
glGenTextures() i memorat n vectorul de nume ale texturilor.
Atunci cnd este apelat prima oar pentru un nume de textur, funcia
glBindTexture() creeaz un nou obiect textur, cu toate datele referitoare la
imaginea i proprietile texturii implicite. Dup apelul funciei
glBindTexture(), textura cu numele dat ca argument devine textur curent i
toate operaiile ulterioare, att pentru definirea unor proprieti ale texturii, ct i
pentru aplicaia texturii, folosesc textura curent. Textura curent se schimb prin
apelul unei noi funcii glBindTexture().
Crearea imaginii de textur. Imaginea texturii este un tablou unidimensional
sau bidimensional de texeli, fiecare texel avnd una, dou, trei sau patru componente.
Semnificaia componentelor texelilor se stabilete la crearea imaginii texturii prin
definirea formatului intern al imaginii printr-un argument al uneia din funciile
glTexImage1D(), glTexImage2D().
Texturile unidimensionale au o utilizare restrns. Ele sunt folosite pentru
texturarea n benzi, pentru care variaia culorii are o singur direcie. n continuare se
vor prezenta texturile bidimensionale, care sunt cel mai frecvent folosite. Funcia
glTexImage2D() are urmtorul prototip:
void glTexImage2D(GLenum target,GLint level,
GLint internalFormat,GLsizei width,
GLsizei height,GLint border,
GLenum format,GLenum type,const GLvoid *pixels);
Parametrul target specific crearea unei imagini de textur bidimensional
(prin constanta simbolic GL_TEXTURE_2D) sau o interogare a capacitii de
memorare a unei imagini de textur (prin constanta simbolic
GL_PROXY_TEXTURE_2D).
Parametrul level indic nivelul imaginii ntr-o succesiune de imagini
prefiltrate de tipul mip-map. Nivelul 0 reprezint imaginea original, cu rezoluia
maxim. Celelate nivele se pot crea automat din imaginea original (prin funcia
gluBuild2DMipmaps()) sau pot fi create din tablouri de texeli, cu acelai format
ca imaginea de nivel 0 a texturii.
Parametrul internalFormat indic tipul componentelor texelilor texturii,
ca intensitate, luminan sau R, G, B, A. Valoarea argumentului internalFormat
poate fi un ntreg ntre 1 i 4 sau una dintre treizeci i dou de constante simbolice,
dintre care cele mai frecvent folosite sunt: GL_LUMINANCE,
GL_LUMINANCE_ALPHA, GL_RGB, GL_RGBA. Aceste constante corespund
valorilor 1, 2, 3, 4 ale argumentului. Aceste componente ale texelilor sunt combinate
cu componentele culorii proprii (nainte de texturare) a pixelului pentru a crea
culoarea final a pixelului. Modul de combinare depinde de funcia de texturare,
descris imediat mai jos.
Parametrii width i height dau dimensiunea imaginii texturii, n numr de
texeli, pe orizontal i pe vertical.
Parametrul border reprezint limea borderului imaginii de textur. Aceast
caracteristic permite alipirea mai multor poriuni de imagini ntr-o singur imagine de
textur, iar borderul este folosit n operaiile de filtrare, n care sunt necesari texeli
vecini texelului curent, pentru medierea culorilor acestora. Devizarea unei imagini de
textur n mai multe pri este impus n anumite implementri ale bibliotecii
OpenGL, atunci cnd texturarea este implementat hardware i imaginea de textur se
ncarc ntr-o memorie rapid din acceleratorul grafic. Dac imaginea texturii este
prea mare pentru a fi stocat n ntregime n memoria de textur, atunci se poate
mpri n mai multe pri, care sunt ncrcate i folosite succesiv. n aceast situaie
borderul permite filtrarea corect la graniele prilor componente ale imaginii.
Parametrii format i type se refer la formatul i tipul datelor imaginii
de textur. Parametrul format poate fi una din constantele simbolice
GL_COLOR_INDEX, GL_RGB, GL_RGBA, GL_RED, GL_GREEN, GL_BLUE,
GL_ALPHA, GL_LUMINANCE, GL_LUMINANCE_ALPHA. Parametrul type poate
fi GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT,
GL_INT, GL_UNSIGNED_INT, GL_FLOAT sau GL_BITMAP.
Ultimul parametru, pixels, conine datele imaginii de texturii.
La apelul funciei glTexImage2D(), se creeaz imaginea texturii curente
(cea conectat prin funcia glBindTexture()) , n formatul specificat.
Funcii de texturare. Modul n care se calculeaz culoarea unui pixel (sau
fragment de pixel) se stabilete prin apelul uneia din funciile glTexEnv#():
void glTexEnvf(GLenum target,GLenum pname,GLfloat param);
void glTexEnvi(GLenum target,GLenum pname,GLfloat param);
unde argumentele au urmtoarea semnificaie:
target specific mediul (environment) de aplicare a texturii; trebuie s
fie constanta simbolic GL_TEXTURE_ENV.
pname este numele simbolic al unui paramentru de mediu de texturare;
trebuie s aib valoarea GL_TEXTURE_ENV_MODE.
param specific funcia de texturare printr-o constant simbolic care
poate lua una din valorile GL_MODULATE, GL_DECAL, or
GL_BLEND.
Funciile de texturare stabilesc modul de calcul al culorii rezultate a pixelilor
pe baza culorii texelilor din imaginea de textur i a culorii pixelilor primitivei
geometrice (care se obin din culoarea curect sau din calcule de umbrire). n general,
n modul GL_DECAL, culoarea final atribuit unui pixel este culoarea texturii; n
modul GL_MODULATE, se folosete culoarea texturii pentru modularea culorii
fragmentului (pixelului); n modul GL_BLEND se combin culoarea texturii cu
culoarea fragmentului. Aceast modalitate general de atribuire a culorii depinde i de
formatul intern al texturii, care se stabilete la crearea imaginii de textur.
Atribuirea coordonatelor de texturare. Coordonatele vrfurilor primitivelor
geometrice n planul texturii (coordonatele de texturare) se transmit prin funciile
glTexCoord#(), care pot primi 1, 2, 3 sau 4 argumente de diferite tipuri, rezultnd
un numr mare de posibiliti de apel. O parte dintre acestea sunt:
void glTexCoord1f(GLfloat s);
void glTexCoord2f(GLfloat s,GLfloat t);
void glTexCoord3f(GLfloat s,GLfloat t,GLfloat r);
void glTexCoord4f(GLfloat s,GLfloat t,GLfloat r,
GLfloat q);
void glTexCoord1f(GLdouble s);
void glTexCoord2f(GLdouble s,GLdouble t);
void glTexCoord3f(GLdouble s,GLdouble t,GLdouble r);
void glTexCoord4f(GLdouble s,GLdouble t,GLdouble r,
GLdouble q);
Coordonatele de texturare pot avea 1, 2 sau 3 pentru texturi unidimensionale,
bidimensionale sau tridimensionale. n spaiul texturii coordonatele sunt notate s, t,
r, corspunztor coordonatelor x, y, z n spaiul obiect. Cea de-a patra component,
q, este componenta de scal n reprezentarea texturii ntr-un sistem de coordonate
omogen, asemntor sistemului de coordonate omogen folosit pentru reprezentarea
punctelor n spaiu. Aceast coordonat este folosit dac sunt necesare transformri
ale texturi n coordonate omogene. n versiunea folosit n momentul de fa a
bibliotecii OpenGL (Versiunea 1.1), nu este nc implementat texturarea spaial i
coordonata r nu este folosit, fiind prevzut ca rezerv pentru utilizare ulterioar.
Dac valorile coordonatelor de texturare n vrfurile primitivelor grafice sunt
cuprinse n intervalul [0,1], atunci textura este aplicat o singur dat pe suprafaa
respectiv. Dac aceste valori depesc intervalul [0,1], atunci textura poate fi repetat
pe suprafa sau limitat la intervalul [0,1]. Proprietatea unei texturi de a fi repetat
sau limitat se stabilete prin apelul uneia din funciile:
void glTexParameterf(GLenum target,GLenum pname,
GLfloat param);
void glTexParameteri(GLenum target,GLenum pname,
GLint param);
n aceste funcii, parametrul target reprezint tipul texturii i poate lua una
din constantele simbolice GL_TEXTURE_1D sau GL_TEXTURE_2D. Parametrul
pname specific numele simbolic al unei proprieti a texturii. i poate lua una din
constantele: GL_TEXTURE_MIN_FILTER, GL_TEXTURE_MAX_FILTER,
GL_TEXTURE_WRAP_S, GL_TEXTURE_WRAP_T. Primele dou valori se
refer la opiunile de filtrare ale texturii i vor fi prezentate n paragraful urmtor.
Urmtoarele valori, seteaz proprietatea de repetare a texturii pentru coordonata s,
respectiv t. n acest caz, parametrul param poate fi GL_REPEAT, pentru repetarea
texturii, sau GL_CLAMP, pentru limitarea texturii la intervalul [0,1].
Mai multe aspecte privind definirea i folosirea texturilor n OpenGL vor fi
detaliate n exemplele care urmeaz.
Exemplul 6.5
n acest exemplu este prezentat programul prin care se aplic texturi n tabl
de ah unor suprafee n spaiu. Imaginea pe care o genereaz este o variant a celei
din Fig. 5.15.
#include <GL/glut.h>
#define imageWidth 64
#define imageHeight 64
static GLubyte image4[imageHeight][imageWidth][4];
static GLubyte image8[imageHeight][imageWidth][4];
static GLuint texName[2];
void Makeimages(){
int c;
for (int i=0;i<imageHeight;i++){
for (int j=0;j<imageWidth;j++){
c = (((i&0x4)==0)^((j&0x4)==0)) *255;
image4[i][j][0] = (GLubyte) c;
image4[i][j][1] = (GLubyte) c;
image4[i][j][2] = (GLubyte) c;
image4[i][j][3] = (GLubyte) 255;
c = (((i&0x8)==0)^((j&0x8)==0)) *255;
image8[i][j][0] = (GLubyte) c;
image8[i][j][1] = (GLubyte) c;
image8[i][j][2] = (GLubyte) c;
image8[i][j][3] = (GLubyte) 255;
}
}
}
void Init(void){
glClearColor(0.6, 0.6, 0.6, 1.0);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_FLAT);
/* TEXTURARE */
Makeimages();
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glGenTextures(2, texName); // se creaza doua texturi
/* Definirea primei texturi */
glBindTexture(GL_TEXTURE_2D,texName[0]);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,imageWidth,
imageHeight,0,GL_RGBA,GL_UNSIGNED_BYTE,image4);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,
GL_DECAL);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,
GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,
GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,
GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,
GL_NEAREST);
/* Definirea celui de-a doua texturi */
glBindTexture(GL_TEXTURE_2D, texName[1]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageWidth,
imageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE,image8);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,
GL_DECAL);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,
GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,
GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,
GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,
GL_NEAREST);
glEnable(GL_TEXTURE_2D);
}
void Display(){
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D, texName[1]);
glPushMatrix();
glTranslated(-2.0,0.0,-8);
glBegin(GL_QUADS);
glTexCoord2f(0.0,0.0);glVertex3f(-0.5,-1.0,0.0);
glTexCoord2f(0.5,0.0);glVertex3f( 0.5,-1.0,0.0);
glTexCoord2f(0.5,1.0);glVertex3f( 0.5, 1.0,0.0);
glTexCoord2f(0.0,1.0);glVertex3f(-0.5, 1.0,0.0);
glEnd();
glPopMatrix();
glPushMatrix();
glTranslated(0.0,0.0,-8);
glRotated(-70,1.0,0.0,0.0);
glBegin(GL_QUADS);
glTexCoord2f(0.0,0.0);glVertex3f(-0.5,-1.0,0.0);
glTexCoord2f(0.5,0.0);glVertex3f( 0.5,-1.0,0.0);
glTexCoord2f(0.5,1.0);glVertex3f( 0.5, 1.0,0.0);
glTexCoord2f(0.0,1.0);glVertex3f(-0.5, 1.0,0.0);
glEnd();
glPopMatrix();
glBindTexture(GL_TEXTURE_2D, texName[0]);
glPushMatrix();
glTranslated(1.5,0.0,-8);
glBegin(GL_QUADS);
glTexCoord2f(0.5,0.0);glVertex3f(0.0,-1.0,0.0);
glTexCoord2f(1.0,0.0);glVertex3f( 1.0,-1.0,0.0);
glTexCoord2f(1.0,1.0);glVertex3f( 1.0, 1.0,0.0);
glTexCoord2f(0.5,0.5);glVertex3f(-0.0, 0.0,0.0);
glEnd();
glPopMatrix();

glutSwapBuffers();
}
void Reshape(int w, int h){
h = (h == 0) ? 1 : h;
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, (GLfloat) w/(GLfloat) h,
0.1, 4000.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main(int argc, char** argv){
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
glutInitWindowSize(500,500);
glutInitWindowPosition(100,100);
glutCreateWindow("Texture Check Image");
Init();
glutDisplayFunc(Display);
glutReshapeFunc(Reshape);
glutMainLoop();
return 0;
}
Imaginea captat din fereastra afiat la execuia acestui program este dat n
Fig. 6.6 i difer de imaginea din Fig. 5.15 prin faptul c se folosesc dou texturi.
n mod obinuit, imaginile texturilor se citesc din fiiere, dar texturile simple,
n tabl de ah, se pot genera prin program. Funcia Makeimages() creeaz dou
tablouri de 64 x 64 locaii, fiecare locaie fiind un vector cu patru componente R, G, B,
A. n primul tablou (image4) este creat o tabl cu 16 x 16 ptrate alternante de
culoare alb i neagr, fiecare ptrat de dimensiune 4 x 4 texeli. n al doilea tablou
(image8) este creat o tabl cu 8 x 8 ptrate alternante de culoare alb i neagr,
fiecare ptrat de dimensiune 8 x 8 texeli.
Texturile sunt definite n funcia Init(). Mai nti se creeaz numele a
dou texturi n vectorul texName[2], prin funcia glGenTextures(). Pentru
crearea i definirea proprietilor fiecrei texturi, se conecteaz mai nti textura
specificat prin numele ei (funcia glBindTexture()) i apoi se specific
proprietile texturii.
n funcia Display() se utilizeaz texturile definite pentru texturarea unor
primitive geometrice. Textura care se aplic este textura curent, activat prin numele
ei dat ca argument funciei de conectare glBindTexture(). Ca urmare, primele
dou suprafee sunt texturate cu textura cu numele texName[1], iar a treia suprafa
este texturat cu textura cu numele texName[0], ceea ce se poate observa n
imaginea din Fig. 4.15. Imaginea din Fig. 3.65 a fost generat cu acelai program, dar
s-a activat numai textura cu numele texName[1], adic textura format din 8 x 8
ptrate. ntr-un bloc glBegin()- glEnd() se transmit vrfurile unei primitive
geometrice; pentru fiecare vrf se definesc mai nti coordonatele de texturare (cu
glTexCoord2f()) i apoi coordonatele spaiale ale vrfului (cu glVertex3f()).
Restul funciilor din program efectueaz operaiile deja cunoscute, de transformri
geometrice, setare culori de tergere, etc.
Filtrarea texturilor
Fig. 6.6 Aplicaia texturilor pe suprafee plane
Tipul de filtrare care se aplic unei texturi este definit prin valorile a doi
parametri, GL_TEXTURE_MAG_FILTER i GL_TEXTURE_MIN_FILTER. setai
prin apelul funciei glTexParameter#(). Filtrarea de mrire (magnification,
GL_TEXTURE_MAG_FILTER) se aplic atunci cnd dimensiunea pre-imaginii
pixelului este egal sau mai mic dect dimensiunea texelului (Fig. 6.7(a)). Filtrarea
de micorare (minification, GL_TEXTURE_MIN_FILTER) se aplic atunci cnd
dimensiunea pre-imaginii pixelului este mai mare dect dimensiunea texelului (Fig.
6.7(b)).
Dac nu este definit imagine mip-map a texturii, cei doi parametri de filtrare
GL_TEXTURE_MAG_FILTER i GL_TEXTURE_MAG_FILTER pot lua numai
una din valorile GL_NEAREST sau GL_LINEAR. Valoarea GL_NEAREST
nseamn, de fapt, lipsa filtrrii: se selecteaz texelul cel mai apropiat de centrul pre-
imaginii pixelului. Valoarea GL_LINEAR asigur filtrarea texturii prin calculul mediei
ponderate a patru texeli cei mai apropiai de centrul pre-imaginii pixelului. Dac este
implementat software, filtrarea texturii (GL_LINEAR) este executat mai lent dect
eantionarea acesteia (GL_NEAREST).
n unele cazuri nu este simplu de decis dac trebuie s se execute o filtrare de
mrire sau o filtrare de micorare. Patrulaterul prin care se reprezint pre-imaginea
pixelului poate s aib dimensiunea ntr-o direcie mai mic dect dimensiunea
texelului, iar n alt direcie mai mare dect dimensiunea texelului. n astfel de situaii
OpenGL selecteaz filtrul care d cel mai bun rezultat posibil.
Filtrarea de micorare este accelerat prin tehnica de prefiltrare a texturilor
folosind imagini de texturi mip-map. Secvena de imagini ale texturii mip-map poate
fi generat prin apelul funciei glTexImage2D() pentru fiecare nivel, ncepnd cu
nivelul 0 (rezoluie maxim) pn la ultimul nivel, cu rezoluie 1 x 1. Datele fiecrei
imagini (tabloul bidimensional de texeli) se obin din imaginea precedent prin
nlocuirea fiecrui grup de patru texeli cu un texel a crui culoare este media culorilor
celor patru texeli din imaginea precedent.
Fig. 6.7 (a) Filtrarea de mrire a texturii.
(b)filtrarea de micorare a texturii.
a texturii
Poligon Textur
(b) GL_TEXTURE_MIN_FILTER
Poligon Textur
(a) GL_TEXTURE_MAG_FILTER
Pre-imagine
pixel Pixel
Dac s-a definit imaginea mip-map a texturii, atunci filtrarea de micorare se
poate realiza n mai multe moduri, depinznd de felul n care se selecteaz nivelul
imaginii mip-map i de tipul de filtrare n imaginea mip-map selectat. Filtrul de
micorare (GL_TEXTURE_MIN_FILTER) este definit printr-una din urmtoarele
constante simbolice:
GL_NEAREST: nu se aplic nici-o filtrare, se selecteaz texelul cel mai
apropiat de centrul pre-imaginii pixelului din imaginea de nivel 0 a
texturii mip-map.
GL_LINEAR: se selecteaz imaginea de nivel 0 a texturii mip-map i se
mediaz ponderat patru texeli cei mai apropiai de centrul pre-imaginii
pixelului.
GL_NEAREST_MIPMAP_NEAREST: se selecteaz nivelul imaginii mip-
map a texturii pentru care dimensiunea pre-imaginii pixelului este cea mai
apropiat de dimensiunea texelului i n aceast imagine se selecteaz
texelul cel mai apropiat de centrul pre-imaginii pixelului.
GL_LINEAR_MIPMAP_NEAREST: se selecteaz nivelul imaginii mip-
map a texturii pentru care dimensiunea pre-imaginii pixelului este cea mai
apropiat de dimensiunea texelului i n aceast imagine se mediaz
ponderat patru texeli cei mai apropiai de centrul pre-imaginii pixelului.
GL_NEAREST_MIPMAP_LINEAR: se selecteaz dou imagini mip-map
n care pre-imaginea pixelului are dimensiunea cea mai apropiat de
imaginea texelului; n fiecare din aceste imagini se selecteaz cte un
texel dup criteriul GL_NEAREST (texelul cel mai apropiat de centrul
pre-imaginii pixelului); aceti texeli se mediaz ponderat pentru obinerea
valorii finale a culorii pixelului.
GL_LINEAR_MIPMAP_LINEAR: se selecteaz dou imagini mip-map n
care pre-imaginea pixelului are dimensiunea cea mai apropiat de
imaginea texelului; n fiecare din aceste imagini se selecteaz cte un
texel dup criteriul GL_LINEAR (media ponderat a patru texeli cei mai
apropiai de centrul pre-imaginii pixelului) i aceste valori se mediaz
ponderat pentru obinerea valorii finale a culorii pixelului.
Filtrarea GL_LINEAR_MIPMAP_LINEAR, care se mai numete i filtrare
triliniar, este cel mai eficient mod de eliminare a zgomotului de aliasing al texturii,
dar i cel mai costisitor din punct de vedere al puterii de calcul. Chiar din simpla
enumerare a operaiilor efectuate, se poate observa cantitatea de calcule extrem de
mare necesar pentru fiecare pixel al imaginii generate. Filtrarea trilinear a texturilor
genereaz imagini deosebit de realiste, dar este fie lent, dac este executat software,
fie costisitoare, dac este implementat hardware.
n exemplul urmtor se prezint modul de programare a filtrrii texturilor i
rezultatele care se pot obine cu diferite tipuri de filtrri.
Exemplul 6.6
#include <GL/glut.h>
#include <gl/glaux.h>
AUX_RGBImageRec *image;
void Cube(){
glBegin(GL_QUADS);
glTexCoord2f(0.0,0.0);glVertex3f(-1.0,-1.0,1.0);
glTexCoord2f(1.0,0.0);glVertex3f( 1.0,-1.0,1.0);
glTexCoord2f(1.0,1.0);glVertex3f( 1.0, 1.0,1.0);
glTexCoord2f(0.0,1.0);glVertex3f(-1.0, 1.0,1.0);
glTexCoord2f(0.0,0.0);glVertex3f(-1.0, 1.0, 1.0);
glTexCoord2f(1.0,0.0);glVertex3f( 1.0, 1.0, 1.0);
glTexCoord2f(1.0,1.0);glVertex3f( 1.0, 1.0,-2.0);
glTexCoord2f(0.0,1.0);glVertex3f(-1.0, 1.0,-2.0);
glTexCoord2f(0.0,0.0);glVertex3f(1.0,-1.0, 1.0);
glTexCoord2f(1.0,0.0);glVertex3f(1.0,-1.0,-2.0);
glTexCoord2f(1.0,1.0);glVertex3f(1.0, 1.0,-2.0);
glTexCoord2f(0.0,1.0);glVertex3f(1.0, 1.0, 1.0);
.
glEnd();
}
void Init(void){
glClearColor(1.0, 1.0, 1.0, 1.0);
glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
image = auxRGBImageLoad("../textures/brick.rgb");
//image = auxRGBImageLoad("../textures/circles.rgb");
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, image->sizeX,
image->sizeY,GL_RGB,GL_UNSIGNED_BYTE,image->data);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,
GL_DECAL);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
GL_REPEAT);
glEnable(GL_TEXTURE_2D);
}
void Display(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Primul obiect,fara filtrarea texturii
glPushMatrix();
glTranslatef(-2.0, -2.5, -8.0);
glRotated(-30, 0.0,1.0,0.0);
glRotated( 20, 1.0,0.0,0.0);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_NEAREST);
Cube();
glPopMatrix();
// Al doilea obiect,cu filtrarea texturii
glPushMatrix();
glTranslatef(-2.0, -2.5, -8.0);
glRotated(20, 0.0,1.0,0.0);
glRotated(20, 1.0,0.0,0.0);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_LINEAR_MIPMAP_LINEAR);
Cube();
glPopMatrix();
glutSwapBuffers();
}
void Reshape(int w, int h){
h = (h == 0) ? 1 : h;
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0,(GLfloat)w /(GLfloat)h,0.1,1000);
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glScaled(4,4,4);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
Funcia main() este identic cu cea din exemplul anterior i nu a mai fost
prezentat din nou. n funcia Reshape() se ncarc matricea din vrful stivei
matricelor de texturare cu o matrice de scalare, care multiplic coordonatele de
texturare cu factorul 4.
n acest program se folosete o singur textur, care este n permanen textura
curent. Toate funciile de definire a parametrilor i de aplicare a texturii se refer la
acest unic textur i nu a mai fost necesar atribuirea unui nume i conectarea (bind)
texturii pentru definire i activare.
Imaginea texturii se citete dintr-un fiier, folosind funcia
auxRGBImageLoad() care aparine unei biblioteci auxiliare OpenGL,
glaux.lib, care nu a fost nc descris. Acest bibliotec auxiliar este o versiune
mai veche a sistemului de dezvoltare GLUT, care a nlocuit-o pentru cea mai mare
parte din funciile de creare a ferestrei de afiare OpenGL, tratare a evenimentelor din
sistem sau generarea unor obiecte tridimensionale. Deoarece n versiunea 3.6 a
sistemului GLUT n care au fost scrise programele, nu exist o funcie de ncrcare a
imaginilor de textur, s-a apelat funcia din glaux.lib. Imaginile n format. Prin
funcii ale bibliotecii glaux.lib se pot ncrca imagini de textur n format RGB
sau n format bitmap DIB (Device Independent Bitmap).
Imaginea citit din fiier este folosit pentru crearea secvenei mip-map de
imagini prefiltrate ale texturii. Acest operaie se poate efectua prin funcia
gluBuild2DMipmaps(). Dup crearea imaginii mip-map a texturii, operaiile de
definire i aplicaie a texturii sunt asemntoare cu cele prezentate n exemplele
precedente. Setarea tipului de filtrare se face n funcia Display() pentru fiecare
din obiecte generate, prin funciile glTexParameterf(). n Fig. 6.8 se observ
diferena dintre imaginea filtrat i imaginea nefiltrat.
(b) (a)
Creare imaginilor cu texturi cu filtrare mip-map necesit o putere de calcul
deosebit de ridicat i este necesar implementarea hardware n aceleratoarele grafice
a algoritmilor de texturare pentru redarea n timp real.
Fig. 6.8 (a) Imagine cu textur nefiltrat.
(b) Imagine cu textur filtrat.
7
Modele de reflexie i iluminare
Redarea obiectelor tridimensionale prin suprafee colorate uniform creaz
imagini nerealiste i dificil de interpretat. De exemplu, dac se red imaginea unei
sfere aproximate prin poligoane colornd feele vizibile cu aceeai culoare alb, se
obine un cerc alb. Acest aspect nerealist apare datorit faptului c percepia celei de-a
treia dimensiuni este mult influienat de modul de redare a iluminrii obiectelor.
Imaginea aceleiai sferei n care se ine seama de iluminare este mult mai sugestiv.
n lumea real, atunci cnd lumina provenit de la diferite surse de lumin
cade asupra obiectelor opace, o parte este absorbit de obiect, iar o parte este
reflectat. Ochiul percepe lumina reflectat de obiect, pentru a interpreta forma,
culoarea i alte detalii ale obiectului. Pentru calculul iluminrii n grafica pe calculator
trebuie s fie definite sursele de lumin i interaciunea dintre lumin i suprafee.
Un model de iluminare definete natura luminii emise de o surs de lumin,
adic distribuia intensitii luminii emise. Un model de reflexie descrie interaciunea
dintre lumin i o suprafa, n funcie de proprietile suprafeei i natura sursei de
lumin. Modelele de iluminare i de reflexie n grafica pe calculator permit redarea
acceptabil din punct de vedere al percepiei umane a obiectele tridimensionale
proiectate n spaiul ecran bidimensional. Nivelul de acceptabilitate al redrii depinde
de natura aplicaiei. Cu ct este cerut un nivel de realism mai ridicat, cu att este
necesar un model de reflexie mai complex i cerine de prelucrare mai mari.
Implementarea unui model de reflexie n procedeul de calculare a intensitii
culorii fiecrui pixel este cunoscut sub numele de tehnic de umbrire.
Consideraii teoretice asupra reflexiei
luminii
Lumina incident la o suprafa a unui obiect este distribuit n patru
categorii: lumina refectat, lumina adsorbit, lumina transmis i lumina mprtiat i
emis (Fig. 7.1).

n sinteza de imagine se ncearc modelarea ct mai eficient i complet a
acestui mod de interaciune a luminii cu obiectele. Intensitatea i lungimea de und a
luminii reflectate de o suprafa a unui obiect depinde de mai muli factori: lungimea
de und a luminii incidente, unghiul de inciden, natura suprafeei i proprietile ei
electrice: permitivitatea, permeabilitatea i conducana. Modelul exact al interaciunii
este extrem de complex i el poate fi aproximat prin intermediul funciei de reflexie
bidirecional (bidirectional reflectivity function BDRF), care permite o apreciere
cantitativ suficient de sugestiv pentru redarea iluminrii obiectelor n grafica pe
calculator.
Funcia de reflexie bidirecional este relaia dintre intensitatea luminii
reflectate n direcia (
v

v
) i energia luminii primite din direcia (
i

i
) (Fig. 7.2):
) , ( E
) , , , ( I
= ) , , , , ( R
i i i
v v i i V
v v i i bd



(7.1)
A
B
Lumina
mprtiat
i emis
Lumina
transmis
Reflexie
difuz
Reflexie
direcionat
(specular)
Lumina
incident
Reflexie
intern
Lumina
absorbit
Fig. 7.1 Interaciunea luminii cu un corp solid
V
N
L
i
i
v
v
Funcia de reflexie bidirecional depinde de lungimea de und . Relaia ntre
energia luminii incidente corespunztoare unui unghi solid
i
i intensitate I
i
este:
i i i i i i i i
d cos ) , ( I = ) , ( E (7.2)
Pentru grafica pe calculator se poate considera n mod simplificat c
intensitatea reflectat este compus din trei componente: componenta de reflexie
direcionat (specular), componenta de reflexie difuz direcionat i componenta de
reflexie difuz ideal. Primele dou componente se datoreaz reflexiei de prim ordin,
iar componenta de reflexie difuz ideal se datoreaz reflexiilor multiple i a
reflexiilor subsuprafeelor (Fig. 7.3).
Valorile componentelor intensitilor reflectate depind de rugozitatea
suprafeei i de lungimea de und a luminii. Dac suprafaa ar fi oglind perfect,
atunci singura component de lumin reflectat ar fi componenta direcionat
(specular). Pentru suprafee reale, cu un anumit grad de rugozitate, componenta
specular se definete ca intensitatea reflectat n direcia:
v
=
i
,
v
=
i
, considerat
fa de orientarea medie a suprafeei. Intensitatea acestei componente depinde de
rugozitatea suprafeei: cu ct suprafaa este mai neted, cu att componenta specular
este mai mare.
Componenta de difuzie direcionat depinde de asemenea de reflexiile de prim
ordin. Direciile de reflexie sunt mprtiate n semisfera centrat n punctul de
Fig. 7.2 Funcia de reflexie bidirecional
L
Reflexie
de prim ordin
L
Reflexie
multipl
Reflexii ale
subsuprafeelor
Orientarea medie
a suprafeei
Fig. 7.3 Reflexii de prim ordin, reflexii multiple
i reflexii ale subsuprafeelor
inciden, dar exist o direcie preferinial, care este direcia reflexiei speculare
pentru suprafeele cu rugozitate redus.
Componenta de difuzie ideal reflect lumina n toate direciile n interiorul
unei semisfere centrate n punctul de inciden, datorit mprtierii provocate de
subsuprafeele componente.
Prin descompunerea funciei de reflexie bidirecional n trei componente se
poate dezvolta un model analitic bazat pe aspecte fizice, optice i geometrice, care s
permit simularea iluminrii i a reflexiei n grafica pe calculator. Modelul de reflexie
Phong este cel mai cunoscut model n grafica pe calculator, care adopt o reprezentare
empiric i fenomenologic, prin formule de calcul simple de imitare a comportrii
teoretice a reflexiei luminii, descrise mai sus.
Modelul Phong de reflexie a luminii
Modelul de reflexie Phong imit eficient modul real de reflexie, pn la un
grad care produce o percepie destul de bun obiectelor iluminate i, de aceea, are o
larg utilizare n grafica pe calculator. Modelul de reflexie Phong consider lumina
reflectat de o suprafa ca fiind o combinaie liniar a trei componente: reflexia
difuz, specular i ambiental.
Componenta de reflexie difuz corespunde componentei de reflexie difuz
ideal descris n seciunea precedent i este evaluat prin relaia:
cos k I = ) ( k I = I
d i d i d
N L (7.3)
unde I
i
este intensitatea luminii incidente, L este vectorul unitate ndreptat ctre sursa
de lumin i N este vectorul unitate normal la suprafa n punctul de inciden (Fig.
7.4(a)). Pentru o suprafa plan unghiul este constant i, deci, componenta de
reflexie difuz este constant. k
d
este un coeficient de reflexie (reflectan) empiric,
care depinde de lungimea de und a luminii i de natura suprafeei. Dat fiind c n
reflexia difuz lumina este reflectat n toate direciile, aceast component nu
depinde de poziia de observare.
Dac exist mai multe surse de lumin, atunci:
n
n , i d d
) ( I k = I N L
n
(7.4)
unde L
n
este vectorul unitate n direcia celei de-a n-a surs de lumin.
N

L
(a)
N

L
R
V

(b)
Componenta specular a reflexiei n modelul Phong depinde de unghiul
ntre direcia de observare V i direcia de oglindire R (Fig. 7.4(b)). Dac se
consider R i V vectorii unitate ai acestor direcii, atunci:
n
s i
n
s i s
) ( k I = cos k I = I V R (7.5)
unde n este un indice care simuleaz rugozitatea suprafeei.
Pentru o suprafa oglind perfect, n tinde ctre infinit i lumina este reflectat
numai n direcia de oglindire R, pentru care cos
n
=1. Pentru valori finite ale
indicelui n, se genereaz un lob de reflexie, a crui grosime este o funcie de
rugozitatea suprafeei (Fig. 7.5).
Efectul reflexiei speculare n modelul Phong este acela de a produce o iluminare
mai accentuat (highlight), care este reflexia sursei de lumin pe o arie a suprafeei,
care depinde de valoarea lui n. Culoarea luminii reflectate specular poate fi diferit de
culoarea luminii reflectate difuz. n modelele cele mai simple de reflexie specular, se
presupune c aceast component are culoarea sursei de lumin. De exemplu, o
suprafa de culoare verde iluminat de o surs de lumin alb produce o component
de reflexie de difuzie de culoare verde, dar pata luminoas de reflexie specular are
culoarea alb.
Componenta de lumin ambiental se adaug n modelul Phong pentru a simula
iluminarea global a scenei. Aceast component permite iluminarea suprafeelor care
Fig. 7.4 (a) Reflexia difuz Phong.
(b) Reflexia specular Phong.
Fig. 7.5 (a) Indice n mare simuleaz reflexie specular n lob ngust.
(b) Indice n mic simuleaz reflexie specular n lob larg.
L
N
R
V
(b)
L
N
R
V
(a)
nu sunt vizibile din sursa de lumin, dar sunt vizibile din punctul de observare. Fr
componenta ambiental, suprafeele care nu sunt ndreptate ctre o surs de lumin ar
fi redate complet negre, ceea ce ar crea un efect nerealist. Componenta ambiental
aproximeaz iluminarea indirect a suprafeelor, de exemplu datorit reflexiilor
multiple fa de pereii unei incinte. Aceste reflexii sunt foarte de complicat de
simulat, astfel nct modelul Phong le ignor i adaug o component de lumin
ambiental constant dat de relaia:
a a g
k I = I
(7.6)
Prin nsumarea componentelor de lumin difuz, specular i ambiental, se obine
iluminarea total a unei suprafee:
( ) ( ) ( )
n
s d i a a
k + k I + k I = I V R N L (7.7)
n modelul RGB de reprezentare a culorilor, relaia 7.7 se descompune n trei
relaii, pentru fiecare component rou, verde, albastru:
( ) ( ) ( )
( ) ( ) ( )
( ) ( ) ( )
n
sb db i ab a b
n
sg dg i ag a g
n
sr dr i ar a r
k + k I + k I = I
k + k I + k I = I
k + k I + k I = I
V R N L
V R N L
V R N L
(7.8)
n mod obinuit se consider componenta specular de culoare alb (deci
k
sr
= k
sg
= k
sb
= k
s
), iar culoarea suprafeei este controlat prin coeficienii de reflexie
difuz (k
dr
, k
dg
, k
db
) i ambiental (k
ar
, k
ag
, k
ab
). Rezult relaia de calcul a culorii unei
suprafee n modelul Phong:
( ) ( ) ( )
n
s d i a a
k + ) b , g , r ( k I + ) b , g , r ( k I = ) b , g , r ( I V R N L (7.9)
Modelul Phong de reflexie este un model foarte simplificat al comportrii
obiectelor iluminate. n acest model, se consider sursele de lumin punctiforme,
ignorndu-se distribuia surselor luminoase i simulndu-se un termen global de
iluminare ambiental. Cu toate aceste simplificri, modelul Phong produce imagini cu
un grad de realism care este suficient pentru multe aplicaii.
Modele de umbrire
Aplicarea direct a relaiei 7.8 pentru calculul culorii fiecrui pixel necesit un
timp de execuie extrem de ridicat, care nu este acceptabil n grafica interactiv. De
aceea, n sinteza de imagine se folosesc anumite metode simplificate de calcul a
culorii fiecrui pixel, numite tehnici (modele) de umbrire. Tehnicile de umbrire depind
de modul de reprezentare a obiectelor. Pentru obiectele modelate prin reea de
poligoane, se folosesc mai multe modele de umbrire: umbrirea constant (poligonal,
flat), umbrirea Gouraud i umbrirea Phong.
Modelul de umbrire constant
n umbrirea constant se admite calculul unei singure intensiti a culorii
pentru fiecare suprafa poligonal; acest mod de calcul este posibil dac se admite
ipoteza simplificatoare c att sursele de lumin ct i observatorul sunt la infinit.
Umbrirea constant produce discontinuiti de culoare la frontiera dintre suprafee.
Calculul umbririi constante nseamn aplicarea formulelor Phong (7.8) pentru fiecare
suprafa vizibil, o singur dat pentru fiecare poziie a observatorului.
Modelul de umbrire Gouraud
Pentru eliminarea discontinuitilor de colorare care apar n umbrirea
constant, Gouraud (1971) a introdus o metod de umbrire care-i poart numele i care
calculeaz intensitatea de culoare a pixelilor suprafeelor prin metode de interpolare,
pornind de la intensitile n vrfurile poligonului. Metoda incremental de calcul a
intensitii de culoare a pixelilor este asemntoare metodei de calcul a adncimii
pixelilor folosit n algoritmul Z-buffer. n general, se aplic combinat transformarea
de rastru, eliminarea suprafeelor ascunse i umbrirea Gouraud, ntr-un algoritm de
baleiere pe linii generalizat.
Umbrirea Gouraud este o tehnic de interpolare biliniar a intensitii culorii,
foarte simpl i economic, care atenueaz discontinuitile de la frontiera
poligoanelor prin care este reprezentat un obiect tridimensional, fr s elimine
complet aspectul poligonal al obiectelor.
Intensitatea de culoare se calculeaz n vrfurile poligoanelor prin aplicarea
relaiilor 7.8 de calcul a reflexiei n modelul Phong. Normala ntr-un vrf al unui
poligon se calculeaz ca medie a normalelor tuturor poligoanelor care sunt adiacente
vrfului (Fig. 7.6):
N
N
m
v
i
i
m

1

(7.10)
N
A
N
4
N
3
N
2
N
1
Fig. 7.6 Normala la vrful NA este media normalelor N1, N2, N3, N4
a poligoanelor adiacente n vrful respectiv.
Normalele n vrfurile poligoanelor sunt definite n sistemul de referin
model i ele sunt transformate n sistemul de referin de observare prin aplicarea
acelorai transformri care se aplic vrfurilor: transformarea de instaniere i
transformarea de observare. n sistemul de referin de observare se calculeaz
intensitile n vrfurile poligoanelor i aceste valori sunt folosite pentru interpolare
biliniar n algoritmul de conversie de baleiere pe linii a poligoanelor.
Acest mod de calcul permite ca normalele n vrfuri s fie calculate o singur
dat, la modelare, i memorate ca parte a modelului obiectului n baza de date grafic.
Atunci cnd se decupeaz feele obiectelor, pot s apar vrfuri noi, care nu existau n
modelul obiectului iniial. Pentru aceste vrfuri se calculeaz normalele n noile
vrfuri prin interpolare ntre normalele laturilor intersectate de planul de decupare.
Interpolarea biliniar a intensitilor de culoare a pixelilor unui poligon se
execut n cadrul algoritmului de baleiere pe linii pornind de la intensitile de culoare
ale vrfurilor poligonului, calculate prin relaiile modelului de reflexie Phong.
Se reia exemplul de baleiere pe linii din seciunile 5.3 i 5.4.3. Poligonul
ABCDE are intensitile de culoare calculate n vrfuri: I
A
, I
B
, I
C
, I
D
, i, respectiv, I
E
.
Intensitile la capetele liniilor de baleiere se calculeaz din intensitile vrfurilor
(Fig. 7.7). Pentru laturile AB i BC, ecuaiile de interpolare sunt:
I

= m
i1
y+n
i1

I = m
i2
y+n
i2
(7.11)
unde: m
i1
= (I
A
I
B
)/(y
A
y
B
), n
i1
= y
B
m
i1
I
B
m
i2
= (I
C
I
B
)/(y
C
y
B
), n
i2
= y
C
m
i2
I
C
(7.12)
Din motive de eficien a calculelor, aceste ecuaii se implementeaz incremental.
Intensitile se calculeaz n punctele de intersecie cu liniile de baleiere y
1
, y
2
, y
i
,
y
i+1
,Fiind calculate intensitile I
i,1
i I
i,2
corespunztoare liniei de baleiere y = y
i
,
intensitile I
i+1,1
i I
i+1,2
, corespunztoare liniei de baleiere urmtoare, y
i+1
= y
i
+1 se
obin prin incrementare:
I
i+1,1
= I
i,1
+ m
i1
I
i+1,2
= I
i,2
+ m
i2
(7.13)
Intensitatea I
i,1
se atribuie pixelului a crui adres se obine din coordonatele
punctului (x
i,1
, y
i
), intensitatea I
i,2
se atribuie pixelului a crui adres se obine din
coordonatele punctului (x
i,2
, y
i
), etc.
Fig. 7.7 Interpolarea intensitii pe laturile poligonului
i pe o linie de baleiere n umbrirea Gouraud.
I
y
I
i,1
y
i+1
=y
i
+1
y
i
I
i,2
I
i+1,2
I
i+1,1
I
B
I
A
I
C
I
D
I
E
y
B
I
i,j
y
A
y
C
Intensitile de-a lungul liniei de baleiere se calculeaz din intensitile la
capetele acesteia. Pentru linia de baleiere y = y
i
, ecuaia de interpolare a intensitii
este:
I

= m
ix
x+n
ix

unde: m
ix
= (I
i,2
I
i,1
)/(x
i,2
x
i,1
), n
ix
= x
i,1
m
ix
I
i,1
(7.14)
Implementarea eficient a acestei interpolri se face de asemenea incremental.
Fiind calculat intensitatea I
i,j
corespunztoare punctului de coordonate (x
i,j
, y
i
),
intensitatea n punctul urmtor eantionat pe linia de baleiere (x
i,j+1
, y
i
, unde
x
i,j+1
= x
i,j
+1) este:
I
i,j+1
= I
i,j
+ m
ix
(7.15)
Pentru fiecare linie de baleiere se calculeaz intensitatea n puncte succesive prin
incrementarea valorii precedente cu coeficientul dat de relaia 7.14.
n Fig. 7.8 este exemplificat diferena dintre umbrirea poligonal i umbrirea
Gouraud. Dou sfere reprezentate prin reea de suprafee plane (poligoane) sunt
iluminate de la aceeai surs punctiform de lumin i au aceleai caracteristici de
reflectan ai materialului. Diferena dintre cele dou imagini ale sferei provine din
faptul c pentru prima sfer se folosete umbrirea poligonal iar pentru cea de-a doua
sfer umbrirea Gouraud.
Dei acceptabil n multe aplicaii, att ca eficien ct i ca realism de
reprezentare, umbrirea Gouraud poate s provoace unele anomalii care provin n
primul rnd din calculul normalei ntr-un vrf prin medierea normalelor feelor
adiacente. De exemplu, n Fig. 7.9 se observ cum este posibil s se obin normale n
vrfuri identice (i deci intensiti egale), din normale la suprafee diferite.
Fig. 7.8 Diferena dintre umbrirea poligonal i umbrirea Gouraud.
O alt deficien a modelului Gouraud este c nu se poate obine o pat de
lumin (highlight) datorat reflexiei speculare n interiorul unui poligon, dac vrfurile
poligonului nu sunt cuprinse n aceast pat de lumin.
O parte din deficienele tehnicii de umbrire Gouraud sunt eliminate n modelul
de umbrire Phong.
Modelul de umbrire Phong
Modelul de umbrire Phong este de asemenea un model de calcul a intensitii
culorii prin interpolare biliniar, ca i modelul Gouraud, dar n acest model se
interpoleaz normalele i se calculeaz exact intensitatea culorii (Fig. 7.10).
Etapele de calcul a intensitii culorii n modelul de umbrire Phong sunt:
Calculul normalelor n vrfurile poligonului.
Pentru fiecare linie de baleiere, se calculeaz prin interpolare vectorii
normali ai interseciei liniei de baleiere cu laturile poligonului, folosind
normalele n vrfuri (N
i,1
i N
i,2
n figura de mai sus).
Normalele la capetele unei linii de baleiere sunt folosite pentru calculul
prin interpolare a normalei fiecrui punct (cruia n corespunde un pixel)
de pe linia de baleiere (N
i,j
).
Fig. 7.9 O suprafa pliat regulat produce normale n vrfuri egale,
deci colorare constant a suprafeelor n umbrirea Gouraud
Fig. 7.10 Interpolarea normalelor n modelul de umbrire Phong.
Linie de baleiere
N
A
N
D
N
B
N
C
N
i,1
N
i,2
N
i,j
Normalele calculate prin interpolare sunt folosite pentru calculul
intensitii culorii n fiecare punct.
Umbrirea Phong este mai costisitoare din punct de vedere al operaiilor
efectuate deoarece, pentru fiecare pixel, se aplic relaia de calcul 7.8, care conine
produse scalare de vectori i nmuliri. Dar, din punct de vedere al calitii imaginii
generate, umbrirea Phong este mai bun, dat fiindc se calculeaz normale foarte
apropiate de normala real n fiecare punct al suprafeei. n tehnica de umbrire Phong
se poate simula mult mai corect reflexia specular (highlight).
n seciunea urmtoare sunt prezentate modalitile de programare a iluminrii
n aplicaii grafice folosind biblioteca OpenGL.
Funciile OpenGL de calcul a iluminrii
Biblioteca OpenGL implementeaz modelul Phong de reflexie i modelele de
umbrire poligonal i umbrire Gouraud.
n mod implicit, sistemul de iluminare este inactivat i pentru desenarea
primitivelor geometrice se folosete culoarea curent, specificat prin funcia
glColor#(). Pentru validarea iluminrii obiectelor, se activeaz sistemul de
iluminare OpenGL prin apelul funciei glEnable(GL_LIGHTING).
Pentru calculul iluminrii obiectelor trebuie s fie definite:
sursele de lumin;
materialul suprafeelor;
modelul de umbrire a suprafeelor.
Definirea surselor de lumin
n OpenGL se pot defini mai multe surse de lumin punctiforme. Numrul de
lumini admise variaz n funcie de implementare, dar cel puin opt lumini sunt
disponibile n orice bibliotec OpenGL. Fiecare surs de lumin poate fi validat prin
apelul funciei glEnable(GL_LIGHTi), unde i este indexul sursei de lumin.
O surs de lumin se caracterizeaz prin intensitate i poziie n scen.
Intensitatea unei surse de lumin se specific pentru fiecare component de iluminare
(ambiental, de difuzie i specular) printr-un vector n spaiul culorilor n modelul
RGBA. Poziia unei surse se specific printr-un vector n coordonate omogene
corespunztoare sistemului de referin universal.
Funcia de definire a unui parametru al unei surse de lumin este funcia
glLight#(), care are mai multe variante n funcie 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 reprezint indexul sursei de lumin i poate lua un nume
simbolic de forma GL_LIGHT0, GL_LIGHT1, .GL_LIGHTi, unde 0 i <
GL_MAX_LIGHTS. Numrul maxim de lumini depinde de implementarea bibliotecii.
Argumentul pname specific un parametru al sursei de lumin. Sunt acceptate
mai multe valori, dintre care unele se refer la intensitate de culoare iar altele la
poziia sursei.
Valorile GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR ale
argumentului pname permit definirea componentelor intensitii culorii sursei de
lumin. n aceast situaie, argumentul params reprezint un pointer la un vector de
patru valori (de tip ntreg sau virgul mobil) care specific intensitile RGBA ale
componentei de iluminare ambiental, difuz i, respectiv, specular. Valorile implicite
ale intensitilor sunt (0.0,0.0,0.0,1.0) pentru componenta ambiental i pentru
componentele difuz i specular a oricrei lumini cu excepia luminii cu index 0, care
au intensitatea difuz i specular implicit (1.0,1.0,1.0,1.0).
n acest model de definire a sursei de lumin, componenta ambiental
(GL_AMBIENT) se refer la intensitatea RGBA pe care o surs de lumin o adaug
iluminrii globale a scenei. Componenta de iluminare difuz (GL_DIFFUSE) este cel
mai apropiat mod de reprezentare a ceea ce se consider culoarea sursei de lumin.
Componenta de iluminare specular (GL_SPECULAR) afecteaz culoarea zonei
strlucitoare (hightlight) a obiectelor luminate de sursa de lumin respectiv. Valoarea
transparenei (alpha) surselor de lumin este ignorat dac nu se valideaz calculul
transparenei (blending).
Valoare GL_POSITION a argumentului pname permite definirea poziiei
sursei de lumin. n aceast situaie, argumentul params este un pointer la un vector
de patru numere (ntregi sau virgul flotant) care reprezint poziia n coordonate
omogene n sistemul de referin universal a sursei de lumin. Acest poziie este
transformat prin aplicarea valorii matricii de modelare-vizualizare din momentul
apelului funciei glLight, astfel nct sursa de lumin va avea coordonatele
transformate n sistemul de referin de observare, unde se calculeaz intensitatea n
vrfurile primitivelor geometrice.
Dac componenta w a poziiei este 0, atunci lumina este tratat ca o lumin
direcional plasat la infinit, n direcia definit de componentele x,y,z i se
utilizeaz aceast direcie pentru calculul componentelor de reflexie difuz i
specular.
Dac w 0, atunci sursa este o surs poziional i se folosete localizarea
acesteia pentru calculul direciei de iluminare a suprafeelor. Poziia implicit a unei
surse este (0,0,1,0), deci sursa este plasat la infinit pe axa z i ea lumineaz
obiectele n direcia z.
Secvena de instruciuni pentru definirea intensitii i poziiei sursei de
lumin de indice 0 arat astfel:
GLfloat light_ambient[] = {1.0, 0.0, 0.0, 0.0};
GLfloat light_diffuse[] = {1.0, 0.0, 0.0, 0.0};
GLfloat light_specular[] = {1.0, 1.0, 1.0, 0.0};
GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0};
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
n iluminarea real, intensitatea luminii primite de un obiect scade odat cu
creterea distanei acestuia fa de sursa de lumin. Dat fiind c sursele de lumin
direcionale (care au w =0) se consider plasate la infinit, nu are sens calculul
atenurii cu distana, astfel nct atenuarea este invalidat pentru astfel de surse.
Pentru sursele poziionale, se folosete un factor de atenuare cu valoarea:
2
q l c
d k + d k + k
1
= f
(7.16)
unde: d este distana dintre sursa de lumin i vrful n care se calculeaz iluminarea
k
c
= GL_CONSTANT_ATTENUATION
k
l
= GL_LINEAR_ATTENUATION
k
q
= GL_QUADRATIC_ATTENUATION
Implicit, aceti parametri au valorile: k
c
=1, k
l
=0, k
q
=0, dar ei pot fi setai prin
apelul uneia din funciile glLightf() sau glLighti() astfel:
glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 2.0);
glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 1.0);
glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.5);
Dac se folosesc mai multe surse de lumin, pentru fiecare dintre ele se
definesc componentele intensitii, poziia i caracteristicile de atenuare.
Definirea proprietilor materialelor
Pentru calculul intensitii culorii unei suprafee, trebuie s fie definite
proprietile de reflexie a luminii pentru componentele de reflexie ambiental, difuz
i specular. Aceste proprieti sunt considerate proprieti de material al suprafeei i
se specific prin apelul uneia sau mai multora din cele patru variante ale funciei
glMaterial#():
void glMateriali(GLenum face,GLenum pname,GLint param);
void glMaterialf(GLenum face,GLenum pname,GLfloat param);
void glMaterialiv(GLenum face,GLenum pname,GLint *param);
void glMaterialfv(GLenum face,GLenum pname,
GLfloat *param);
n aceste funcii, argumentul face este numele feei i depinde de orientarea
acesteia; poate lua ca valori constantele simbolice GL_FRONT, GL_BACK,
GL_FRONT_AND_BACK. Argumentul pname specific proprietatea materialului care
se definete prin apelul funciei glMaterial#(). Acest argument poate lua una
valorile date n tabelul de mai jos.
Tabelul 7.1 Parametrii de definire a materialelor
Nume parametru Valoare implicit Semnificaie
GL_AMBIENT (0.2,0.2,0.2,1.0) Reflectana (coeficient de
reflexie) ambiental
GL_DIFFUSE (0.8,0.8,0.8,1.0) Reflectana de difuzie
GL_AMBIENT_AND
_DIFFUSE
Reflectana ambiental i
de difuzie
GL_SPECULAR (0.0,0.0,0.0,1.0) Reflectana specular
GL_EMISSION (0.0,0.0,0.0,1.0) Intensitatea luminii emise
GL_SHININESS 0.0 Exponentul de
reflexie specular
GL_COLOR_INDEX (0,1,1) Indicii culorilor
ambiental, difuz i
specular ale
materialului
Funciile glMateriali() i glMaterialf() se folosesc numai pentru
setarea strlucirii (GL_SHININESS) la valoarea dat prin argumentul param.
Funciile glMaterialiv() i glMaterialfv() se folosesc pentru
specificarea celorlalte proprieti. Dac argumentul pname este GL_COLOR_INDEX,
atunci param este un pointer la un vector de trei valori de tip ntreg, care conine
indicii culorilor ambiental, de difuzie i specular ale materialului. n celelalte
situaii, param este un pointer la un vector de patru valori de tip ntreg sau flotant,
care sunt componentele rou, verde, albastru i alpha (transparen) ale componentei
de reflexie specificat prin parametrul pname(ambiental, difuz, specular,
emisivitate). Se poate observa faptul c modelul OpenGL de reflexie permite
adugarea unei componente emisive a luminii reflectat de o suprafa.
Reflexia difuz joac cel mai important rol n culoarea pe care o prezint o
suprafa. Ea reprezint culoarea pe care o are suprafaa luminat direct i depinde de
componenta de difuzie a luminii incidente, provenit de la una sau mai multe surse de
lumin, de coeficientul de reflexie de difuzie (reflectana de difuzie) a materialului i
de unghiul dintre direcia luminii i normala la suprafa. Poziia de observare nu
influieneaz componenta de difuzie a luminii reflectate.
Reflexia ambiental afecteaz culoarea de ansamblu pe care o prezint o
suprafa i ea devine sesizabil atunci cnd suprafaa nu este luminat direct. Ca i
reflexia difuz, aceast component nu depinde de poziia de observare. Cele dou
componente se specific de cele mai multe ori cu aceeai culoare (aa cum sunt
suprafeele reale) folosind parametrul GL_AMBIENT_AND_DIFFUSE n apelul
funciei glMaterial#().
Reflexia specular produce iluminarea mai puternic (highlight) a unei zone
a obiectului, n funcie de poziia de observare. OpenGL permite specificarea culorii
produse de reflexia specular (prin parametrul GL_SPECULAR) i dimensiunea i
strlucirea zonei prin parametrul GL_SHININESS.
Componenta de emisie a unei suprafee se specific prin parametrul
GL_EMISSION. Acest efect este folosit pentru simularea lmpilor sau a altor surse de
lumin din scen.
Proprietilor materialelor. Funcia glMaterial#() definete
proprietile materialului curent, care se aplic tuturor vrfurilor introduse dup
aceasta prin funciile glVertex#() sau prin diferite funcii de modelare din
biblioteca GLUT (de exemplu, glutSolidSphere()). Proprietile materialului
curent se menin pn la urmtorul apel al funciei glMaterial#(). Calculele de
iluminare se pot executa diferit pentru feele orientate direct (GL_FRONT) i cele
orientate invers (GL_BACK).
Un exemplu de definire a unui material este dat prin urmtoarele instruciuni:
GLfloat mat_ambient[] = {1.0, 0.0, 0.0, 1.0};
GLfloat mat_diffuse[] = {1.0, 0.0, 0.0, 1.0};
GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};
GLfloat mat_shininess = 50.0;
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialf(GL_FRONT, GL_SHININESS, mat_shininess);
Modelul de umbrire se definete prin apelul funciei
glShadeModel(GLenum mode), unde argumentul mode poate lua una din
valorile GL_FLAT, pentru modelul de umbrire poligonal, sau GL_SMOOTH, pentru
modelul de umbrire Gouraud. Valoarea implicit este GL_SMOOTH.
Dac nu este validat sistemul de iluminare (prin apelul funciei
glEnable(GL_LIGHTING);) atunci culoarea care se atribuie vrfurilor
primitivelor geometrice este culoarea curent, setat prin apelul unei funcii
glColor#(). Dac s-a definit modelul de umbrire poligonal (GL_FLAT),
primitivele geometrice se genereaz de culoare constant (culoarea curent ntlnit la
primul vrf introdus prin funcia glVertex#()). Dac s-a definit modelul de
umbrire Gouraud (GL_SMOOTH), atunci culorile definite n vrfuri se folosesc pentru
calculul intensitii culorii pixelilor primitivei prin interpolarea biliniar.
Exemplul 7.1
n Fig 7.11 (a) s-a definit umbrirea Gouraud (GL_SMOOTH), iar n Fig 7.11 (b)
s-a definit umbrirea poligonal (GL_FLAT), toate celelate funcii fiind aceleai.
glShadeModel(GL_FLAT);
glBegin(GL_POLYGON);
glColor3f(0.5,0.5,0.5);
glVertex3d(-1,-1,-8);
glColor3f(0.1,0.1,0.1);
glVertex3d(1,-1,-8);
glColor3f(0.5,0.5,0.5);
glVertex3d(1,1,-8);
glColor3f(0.9,0.9,0.9);
glVertex3d(-1,1,-8);
glEnd();
(b)
glShadeModel(GL_SMOOTH);
glBegin(GL_POLYGON);
glColor3f(0.5,0.5,0.5);
glVertex3d(-1,-1,-8);
glColor3f(0.1,0.1,0.1);
glVertex3d(1,-1,-8);
glColor3f(0.5,0.5,0.5);
glVertex3d(1,1,-8);
glColor3f(0.9,0.9,0.9);
glVertex3d(-1,1,-8);
glEnd();
(a)
Exemplul 7.2
Pentru generarea imaginii din Fig. 7.8 din seciunea precedent, s-a validat
sistemul de iluminare, s-a definit sursa de lumin GL_LIGHT0 i s-au definit
parametrii materialului feelor sferei. Programul scris folosind sistemul de dezvoltare
GLUT este urmtorul:
#include <GL/glut.h>
void Init(){
GLfloat light_ambient[] = {1.0, 1.0, 1.0, 1.0};
GLfloat light_diffuse[] = {1.0, 1.0, 1.0, 1.0};
GLfloat light_specular[] = {1.0, 1.0, 1.0, 1.0};
GLfloat mat_ambient[] = {0.1, 0.1, 0.1, 1.0};
GLfloat mat_diffuse[] = {0.9, 0.9, 0.9, 1.0};
GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};
GLfloat mat_shininess = 50.0 ;
glClearColor(0.0,0.0,0.0,0.0);
glEnable(GL_DEPTH_TEST);
glClearDepth(1.0f); // implicit
glDepthFunc(GL_LESS); // implicit
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialf(GL_FRONT, GL_SHININESS, mat_shininess);
glShadeModel(GL_SMOOTH); // implicit
}
void Display(void){
GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0};
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glPushMatrix();
glTranslatef(-1.5,0,-8); //transf. modelare
glShadeModel(GL_FLAT);
glutSolidSphere(1,16,16);
Fig. 7.11 (a) Interpolarea biliniar a culorilor din vrfurile primitivei.
(b) Colorare constant a primitivei.
glPopMatrix();
glPushMatrix();
glTranslatef(1.5,0,-8); // transf. modelare
glShadeModel (GL_SMOOTH);
glutSolidSphere(1,16,16);
glPopMatrix();
glutSwapBuffers();
}
void Reshape(int w, int h){
h = (h == 0) ? 1 : h;
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0,(GLfloat)w/(GLfloat)h, 1, 40.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main(int argc, char** argv){
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH );
glutInitWindowSize(500,500);
glutInitWindowPosition(100,100);
glutCreateWindow("Lights");
Init();
glutDisplayFunc(Display);
glutReshapeFunc(Reshape);
glutMainLoop();
return 0;
}
Funciile callback Display() i Reshape() au aceleeai semificaie
care a fost descris n programele precedente. Sursa de lumin direcional (plasat la
distan infinit) are culoarea alb, iar materialul are componenta specular alb, iar
componentele difuz i ambiental au nuane de gri. Pentru redarea primei sfere s-a
setat umbrire poligonal (GL_FLAT), iar pentru cea de-a doua sfer umbrire Gouraud
(GL_SMOOTH). Imaginea din Fig. 7.11 evideniaz diferena dintre umbrirea
poligonal i umbrirea Gouraud, precum i iluminarea accentuat (pata luminoas)
datorat reflexiei speculare.
Dac n programul de mai sus se nlocuiesc apelurile funciilor
glutSolidSphere(1,16,16) cu apelul funciilor glutSolidTorus(0.5,
0.9,8,16) se obine imaginea din Fig. 7.12, n care este i mai pregnant diferena
dintre umbrirea poligonal i umbrirea Gouraud.
Fig. 7.12 Tor cu umbrire poligonal i umbrire Gouraud.

Normalele n vrfurile primitivelor


geometrice
Pentru calculul reflexiei difuze i speculare este necesar s fie definite
normalele n vrfurile primitivelor geometrice. Normala care se folosete pentru
calculul reflexiei ntr-un vrf este normala curent, care se seteaz prin apelul unei
variante a funciei glNormal#() i se memoreaz ntr-o variabil de stare a
bibliotecii, identificat prin constanta simbolic GL_CURRENT_NORMAL. O parte din
prototipurile funciilor glNormal#()definite n fiierul header gl.h sunt:
void glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz);
void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
void glNormal3i(GLint nx, GLint ny, GLint nz);
void glNormal3bv(const GLbyte *v);
void glNormal3dv(const GLdouble *v);
void glNormal3fv(const GLfloat *v);
Normala se poate specifica prin componentele nx, ny, nz, sau printr-un
pointer la un vector care conine cele trei componente, de tipul cerut prin numele
funciei glNormal#().
Normalele se poate defini n orice loc n program, n exteriorul sau n
interiorul unui bloc glBegin()-glEnd(). Dac normala se definete o singur
dat pentru o primitiv geometric, aceast valoare este folosit pentru calculul
intensitilor tuturor vrfurilor primitivei geometrice. n mod normal ns, pentru
calculul corect al intensitilor culorii n vrfuri, este necesar ca normala s fie definit
pentru fiecare vrf al primitivei geometrice, deci funciile glNormal#() se apeleaz
alternant cu funciile glVertex#() n interiorul blocului glBegin()-glEnd().
n exemplul precedent nu a fost necesar definirea normalelor, deoarece
funcia glutSolidSphere() le definete n mod automat, dar, pentru calculul
iluminrii unui obiect definit printr-o mulime de primitive date prin vrfurile lor, este
nesesar s fie definite toate normalele n vrfuri.
Normalele se specific n aceelai sistem de referin ca i vrfurile
primitivelor geometrice, deci n sistemul de referin de modelare. Acest mod de
calcul permite ca normalele n vrfuri s fie calculate o singur dat, la modelare, i
memorate ca parte a modelului obiectului n baza de date grafic. Asupra lor se aplic
n mod automat transformarea de modelare-vizualizare folosind valoarea matricei din
vrful stivei de modelare-vizualizare, existent n momentul apelului funciei
glNormal#(). n felul acesta, normalele sunt transformate n sistemul de referin
de observare, unde se calculeaz intensitile componentelor de reflexie n vrfurile
primitivelor geometrice.
Exemplul 7.3
n acest exemplu se evideniaz necesitatea definirii normalelor pentru
calculul iluminrii. n program este validat sistemul de iluminare i este definit o
surs de lumin direcional i materialul, cu componente de reflectan difuz i
ambiental. Cubul din Fig. 7.13(a) a fost generat cu definirea normalelor n fiecare
vrf al fiecrei suprafee. n Fig. 7.13 (b), singura diferen este absena normalelor n
vrfuri; se observ absena umbririi obiectului.
Programul care produce aceste imagini este foarte asemntor cu programul
din Exemplul 7.2 pentru toate funciile, mai puin funcia callback Display(), care
arat astfel:
void Display(){
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable (GL_NORMALIZE);
glPushMatrix();
glTranslated(-2,-2,-8); // transf. de observare
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glBegin(GL_POLYGON);
glNormal3d(-1,1, 1);
glVertex3d(-1,1, 1);
glNormal3d( 1,1, 1);
glVertex3d( 1,1, 1);
glNormal3d( 1,1,-1);
glVertex3d( 1,1,-1);
glNormal3d(-1,1,-1);
glVertex3d(-1,1,-1);
glEnd();
glBegin(GL_POLYGON);
glNormal3d(-1,-1,1);
glVertex3d(-1,-1,1);
glNormal3d( 1,-1,1);
glVertex3d( 1,-1,1);
glNormal3d( 1, 1,1);
(a)
(b)
Fig. 7.13 (a) Calculul iluminrii folosind normalele n vrfuri.
(b) Imaginea obinut dac nu sunt definite normalele n vrfuri.
glVertex3d( 1, 1,1);
glNormal3d(-1, 1,1);
glVertex3d(-1, 1,1);
glEnd();
glBegin(GL_POLYGON);
glNormal3d(1,-1, 1);
glVertex3d(1,-1, 1);
glNormal3d(1,-1,-1);
glVertex3d(1,-1,-1);
glNormal3d(1, 1,-1);
glVertex3d(1, 1,-1);
glNormal3d(1, 1, 1);
glVertex3d(1, 1, 1);
glEnd();

glPopMatrix();
glutSwapBuffers();
}
n funcia Display() sunt introduse numai trei din cele ase fee ale cubului;
celelate trei se definesc n mod similar. Funcia glEnable(GL_NORMALIZE) are
ca efect scalarea la valoarea unitate a vectorilor normalelor introduse prin funciile
glNormal#().
Dac se comenteaz toate funciile glNormal3d() din programul de mai sus, se
obine imaginea din Fig. 7.13(b), n care nu se obine umbrirea feelor cubului.
Controlul poziiei i al direciei surselor
de lumin
OpenGL trateaz poziia i direcia surselor de lumin la fel cum este tratat
poziia primitivelor geometrice, adic sursele de lumin sunt transformate cu aceleai
matrici de transformare ca i primitivele geometrice. Atunci cnd este apelat funcia
glLight#(GL_LIGHTi, GL_POSITION vect) pentru specificarea poziiei
sau direciei unei surse de lumin, poziia sau direcia este transformat de matricea de
modelare-vizualizare curent i este memorat n coordonate n sistemul de referin
de observare. Acest lucru nseamn c se poate modifica poziia sau direcia unei surse
de lumin prin modificarea corespunztoare a matricii de modelare-vizualizare.
Matricea de proiecie nu modific poziia surselor de lunim. Sursele de lumin pot fi
tratate n trei moduri:
surse cu poziie fix;
surse care se deplaseaz odat cu punctul de observare;
surse care se deplaseaz n scen.
Surse de lumin cu poziie fix. Funcia glLight#() cu parametrul
GL_POSITION definete coordonatele omogene ale poziiei sursei. Dac aceast
funcie este apelat n momentul n care matricea curent din stiva de modelare-
vizualizare conine matricea de observare, atunci poziia sursei este transformat n
coordonate de observare. Poziia n spaiu a sursei rmne fix, iar poziia calculat i
utilizat n calcule este poziia n coordonate de observare. n Exemplul 7.3 sursa de
lumin este meninut n poziie fix n scen prin setarea poziiei ei n momentul n
care matricea curent de modelare-vizualizare conine matricea de transformare de
observare:
glPushMatrix();
glTranslated(-2,-2,-8); // transf. de observare
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
// Desenare obiect
glPopMatrix();
Exemplul 7.4
Se reia programul de desenare a dou sfere luminate din Exemplul 7.2.
Culoarea de tergere este modificat (culoare gri deschis (0.8, 0.8, 0.8)) pentru o mai
bun evideniere a umbririi obiectelor. Transformrile de instaniere se aplic fiecrui
obiect n parte. Transformarea de observare se aplic tuturor obiectelor i direciei
sursei de lumin. n continuare este prezentat numai funcia Display(), pentru
evidenierea poziiei fixe a sursei de lumin, n condiiile modificrii punctului de
observare (x
V
=0, y
V
=0, z
V
=8 i unghiul varibil).
void Display(){
GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0};
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(0,0,-8);
glRotated(gamma,0,1,0); // transf. observare
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glPushMatrix();
glTranslatef(1.5,0,0); // transf. modelare
glutSolidSphere(1,16,16);
glPopMatrix();
glPushMatrix();
glTranslatef(-1.5,0,0); // transf. modelare
glutSolidSphere(1,16,16);
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
(a) =0 (b) =45
(f) =225
(e) =180
Fig. 7.14 Surs de lumin fix n direcia (1.0, 1.0, 1.0, 0.0).
Prin micarea de rotaie a punctului de observare, sferele sunt vzute iluminate
n diferite situaii: pentru =45 se poate observa partea cea mai luminat a sferelor;
pentru =225 se observ partea cea mai puin luminat a sferelor.
Surse de lumin care se deplaseaz o dat cu punctul de observare. Pentru
a crea surse de lumin care se mic odat cu punctul de observare, trebuie ca poziia
sursei s fie setat nainte de transformarea de observare. Poziia sau direcia sursei
dat prin funcia glLight#() cu parametrul GL_POSITION, este transformat cu
matricea curent din stiva de modelare-vizualizare care conine matricea identitate,
deci localizarea sursei rmne constant fa de punctul de observare. Acest mod de
control al sursei este folosit n simulatoare de antrenament, pentru a simula lumina
farurilor vihiculului. Dac poziia sursei este (0,0,0,1), atunci sursa este plasat chiar
n punctul de observare.
Exemplul 7.5
Se reia programul de generare a imaginii obiectelor luminate din exemplul
precedent, dar sursa de lumin se seteaz cu o direcie fix n sistemul de referin de
observare prin setarea direciei sursei nainte de transformarea de observare. n
continuare sunt prezentate funciile callback Display() i Keyboard() ale
programului, celelalte funcii fiind nemodificate (cu excepia culorii de tergere care
este gri nchis (0.3, 0.3, 0.3, 1.0) i a nregistrrii funciei callback Keyboard()).
static int gamma = 0;
void Keyboard(unsigned char key, int x, int y){
switch (key){
case 'G':
gamma = (gamma+30)%360;
glutPostRedisplay();
break;
case 'g':
gamma = (gamma-30)%360;
glutPostRedisplay();
break;
}
}
void Display(){
GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0};
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glPushMatrix();
glTranslatef(0,0,-8);
glRotated(gamma,0,1,0); // transf. observare
glPushMatrix();
glTranslatef(1.5,0,0); // transf. modelare
glutSolidTeapot(1);
glPopMatrix();
glPushMatrix();
glTranslatef(-1.5,0,0); // transf. modelare
glutSolidTeapot(1);
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
Sursa de lumin direcional are direcia (1.0, 1.0, 1.0, 1.0) care, transformat
cu matricea identitate, pstreaz aceeai valoare n sistemul de referin de observare.
De aceea, indiferent de poziia i direcia de observare, obiectele sunt iluminate dintr-o
direcie fix fa de direcia de observare.
n Fig. 7.15 sunt reprezentate mai multe imagini, pentru direcii de observare
diferite. Unghiul (gamma n program) de rotaie fa de axa y se modific prin
comenzi de la tastatur, prelucrate de funcia callback Keyboard().
Surse de lumin care se deplaseaz n scen. Se pot defini surse de lumin
care se mic independent n scena virtual, prin aplicarea unei transformri de
instaniere (care localizeaz sursa de lumin n sistemul de referin universal), urmat
de transformnarea de observare, prin care se calculeaz poziia sau direcia sursei n
sistemul de referin de observare. La fel ca i n cazul instanierii obiectelor n scen,
se folosete matricea curent din stiva de modelare-vizualizare.
Exemplul 7.6
Se consider un punct i o direcie de observare fix, iar obiectele din scen
sunt luminate de o surs de lumin direcional care i modific direcia printr-o
comand de la mouse. Programul care implementeaz aceast funcionare este similar
celorlalte programe de iluminare prezentate n exemplele precedente, cu excepia
funciei Display() i a funciei callback de prelucrare a evenimentelor de la mouse,
care trebuie s fie nregistrat n GLUT.
(a) =0
(b) = 30
(c) =150 (c) =90
Fig. 7.15 Surs de lumin care se deplaseaz o dat cu punctul de observare.
static int teta = 0;
void Mouse(int button, int state, int x, int y){
switch(button){
case GLUT_LEFT_BUTTON:
if (state == GLUT_DOWN){
teta = (teta+30)%360;
glutPostRedisplay();
}
}
}
void Display(){
GLfloat light_position[] = {0, 0, 2, 1.0};
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(0,0,-8); // transf. observare
glPushMatrix();
glRotated(teta,1,0,0);// transf. inst. sursa
glLightfv(GL_LIGHT0, GL_POSITION,
light_position);
glPopMatrix();
glutSolidTorus(0.3, 0.8, 8, 16);
glPopMatrix();
glutSwapBuffers();
}
Iniial variabila teta = 0 i sursa este plasat pe axa z la distan egal cu
2 fa de centrul sistemului de referin universal. La fiecare apsare a butonului
stnga al mousului, variabila teta este incrementat (modulo 360) cu 30, i poziia
sursei este rotit cu unghiul spin n raport cu axa x. Imaginile succesive (Fig. 7.16)
indic modul n care este iluminat un tor de o surs de lumin care se rotete n jurul
axei x.

Combinarea culorilor
Mai multe efecte n redarea obiectelor (transparen, anti-aliasing, cea) se
obin prin combinarea culorilor la nivel de pixel.
Pentru validarea operaiei de combinare a culorilor la nivel de pixel (blending)
se apeleaz funcia glEnable(GL_BLEND). n cursul combinrii, culoarea unui
Fig. 7.16 Surs de lumin care se deplaseaz n scen.
(a) =0
(b) = 60 (c) = 180
nou fragment (sursa) este combinat cu culoarea memorat ntr-o locaie
corespunztoare din bufferul de cadru, care este i destinaia pentru nscrierea
rezultatului combinrii.
Pentru combinarea culorilor se calculeaz factorii de combinare ai sursei i ai
destinaiei. Aceti factori sunt cvadruplei RGBA care se multiplic cu componentele
corespunztoare R, G, B i A ale sursei, respectiv ale destinaiei.
Fie factorii de combinare ai sursei (S
r
, S
g
, S
b
, S
a
) i ai destinaiei (D
r
, D
g
, D
b
,
D
a
) i componentele culorii sursei (R
s
, G
s
, B
s
, A
s
) i ale destinaiei (R
d
, G
d
, B
d
, A
d
).
Culoarera rezultat prin combinare, care se nscrie n locaia de destinaie are
componentele (R
s
S
r
+R
d
D
r
, G
s
S
g
+G
d
D
g
, B
s
S
b
+G
d
D
g
, A
s
S
a
+A
d
D
a
). Este posibil ca fiecare
component a culorii rezultate s fie limitat la intervalul [0,1].
Factorii de combinare se pot selecta din mai multe valori posibile prin
argumentele transmise funciei:
void glBlendFunc(GLenum sfactor, GLenum dfactor);
n tabelul 4.3 sunt date valorile constantelor simbolice predefinite n OpenGL,
din care se pot selecta factorii de combinre ai sursei i ai destinaiei.
Tabelul 4.3 Factorii de combinare ai sursei i ai destinaiei
Constanta Surs-destinaie Factorul de combinare
GL_ZERO surs sau dest (0,0,0,0)
GL_ONE surs sau dest (1,1,1,1)
GL_DST_COLOR surs (Rd,Gd,Bd,Ad)
GL_SRC_COLOR destinaie (Rs,Gs,Bs,As)
GL_ONE_MINUS_DST_COLOR surs (1,1,1,1)-(Rd,Gd,Bd,Ad)
GL_ONE_MINUS_SRC_COLOR destinaie (1,1,1,1)-(Rs,Gs,Bs,As)
GL_SRC_ALPHA surs sau dest (As,As,As,As)
GL_DST_ALPHA surs sau dest (Ad,Ad,Ad,Ad)
GL_ONE_MINUS_SRC_ALPHA surs sau dest (1,1,1,1)- (As,As,As,As)
GL_ONE_MINUS_DST_ALPHA surs sau dest (1,1,1,1)- (Ad,Ad,Ad,Ad)
GL_SRC_ALPHA_SATURATE surs (f,f,f,1);
f=min(As,1-Ad)
Transparena
Transparena suprafeelor se implementeaz folosind combinarea cu factorii
de combinare GL_SRC_ALPHA, pentru surs i GL_ONE_MINUS_SRC_ALPHA
pentru destinaie.
Exemplul 7.7
n programul urmtor se suprapun parial suprafee transparente triunghiulare de
culoare gri deschis (0.8, 0.8, 0.8) peste un dreptunghi de culoare gri nchis (0.2, 0.2,
0.2). Imaginea din Fig. 7.17 s-a obinut pentru valorile 0.25, 0.50, 0.75, 1.0 ale
componentei A
s
a triunghiului. Combinarea culorii unei noi suprafee cu culoarea
existent n buffer produce aspectul de transparen a suprafeelor.

n continuare sunt prezentate funciile callback Init() i Display() ale
programului dezvoltat sub GLUT. Celelalte funcii, main() i Reshape() nu au
nimic special, fiind asemntoare cu cele din programele precedente.
void Init(){
glClearColor(1.0,1.0,1.0,1.0);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
void Triangle() {
glBegin(GL_POLYGON);
glVertex3d(-2,-2,0);
glVertex3d( 2,-2,0);
glVertex3d( 0, 2,0);
glEnd();
}
void Display(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslated(0.0,0.0,-20.0);// transf. de observare
glDisable(GL_BLEND); // invalid. comb. culorilor
glColor3d(0.2,0.2,0.2);
glBegin(GL_POLYGON); // desenare dreptunghi
glVertex3d(-8,0,0);
glVertex3d( 8,0,0);
glVertex3d( 8,4,0);
glVertex3d(-8,4,0);
glEnd();
glEnable (GL_BLEND); // validare comb. culorilor
glPushMatrix();
glTranslated(-6.0,4.0,0.0);
glColor4d(0.8,0.8,0.8,0.25);
Fig. 7.17 Combinarea culorilor n calculul transparenei.
0.95 0.90 0.85 0.80
0.35 0.50 0.65 0.80
0.20
0.95 0.90 0.85 0.80
0.35 0.50 0.65 0.80
0.20
Triangle(); // al doilea triunghi
glPopMatrix();
glPushMatrix();
glTranslated(-2.0,4.0,0.0);
glColor4d(0.8,0.8,0.8,0.50);
Triangle(); // al doilea triunghi
glPopMatrix();
glPushMatrix();
glTranslated(2.0,4.0,0.0);
glColor4d(0.8,0.8,0.8,0.75);
Triangle(); // al treilea triunghi
glPopMatrix();
glPushMatrix();
glTranslated(6.0,4.0,0.0);
glColor4d(0.8,0.8,0.8,1.0);
Triangle(); // al patrulea triunghi
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
n funcia Init() se seteaz culoarea de tergere alb (1.0, 1.0, 1.0, 1.0) a
bufferului de culoare i factorii de combinare GL_SRC_ALPHA, pentru surs i
GL_ONE_MINUS_SRC_ALPHA pentru destinaie.
Dreptunghiul se nscrie n buffer cu culorea lui iniial. Culoarea fiecruia din
cele 4 triunghiuri care urmeaz (poligoane surs) se combin la nivel de pixel cu
culoarea existent n buffer (care poate fi culoarea de tergere sau culoarea
dreptunghiului) folosind pentru factorii de combinare valoarea transparenei sale.
Primele trei triunghiuri sunt compuse din dou culori: una rezultat din combinarea
culorii proprii cu culoarea dreptunghiului, cealalt rezultat din combinarea culorii
proprii cu culoarea de tergere. De exemplu, pentru primul triunghi, n partea de jos,
suprapus peste dreptunghi, fiecare component de culoare R,G,B are intensitatea
0.25 * 0.8 + (1- 0.25)*0.2 = 0.35; n partea de sus, prin combinare cu culoarea de
tergere, fiecare component de culoare R,G,B rezultat are intensitatea 0.25 * 0.8 +
(1- 0.25)*1.8 = 0.95. Pentru al doilea triunghi componentele de culoare sunt 0.5 pentru
partea de jos i 0.9 pentru partea de sus; pentru al treilea triunghi componentele de
culoare sunt 0.65 pentru partea de jos i 0.85 pentru partea de sus. Ultimul triunghi, cu
A
s
= 1, nlocuiete complet valorile existente n buffer i este desenat cu componentele
de culoare 0.8 n ambele pri de suprapunere.
De remarcat c n acest program simplu nu este validat bufferul de adncime.
n mod implicit, n OpenGL testul de adncime este invalidat i, deoarece nu se
valideaz nici la iniializare nici n alt parte n program, testul de adncime nu se
efectueaz i poligoanele sunt nscrise n bufferul de imagine n ordinea n care sunt
transmise, indiferent de adncimea lor.
Acest lucru trebuie s fie evitat atunci cnd sunt reprezentate obiecte
tridimensionale opace i transparente n scen. Dat fiind c obiectele tridimensionale
se pot ascunde unele pe altele este necesar s se valideze testul de adncime prin
apelul funciei glEnable(GL_DEPTH_TEST). Obiectele opace se deseneaz mai
nti i se execut operaiile cu bufferul de adncime n mod normal. Pentru desenarea
obiectelor transparente, se seteaz condiia de acces numai pentru citire a bufferului de
adncime (read-only) prin apelul funciei glDepthMask(GL_FALSE). Atunci cnd
se deseneaz obiecte transparente, adncimea lor se compar cu adncimile memorate
n Z-buffer, stabilite de obiectele opace, astfel c nu se deseneaz prile ascunse
(aflate n spatele) obiectelor opace. Dac sunt mai aproape de punctul de observare, se
deseneaz prin combinarea culorii, dar nu se elimin adncimea obiectele opace din
bufferul de adncime, deoarece acesta este read-only.
Anti-aliasing
Biblioteca OpenGL pune la dispoziie dou modaliti de redare antialiasing:
prin combinarea culorilor (blending) i prin buffer de acumulare (A-buffer).
Redarea anti-aliasing prin combinarea culorilor este o tehnic de prefiltrare a
imaginii i d rezultate de netezire numai dac se renun la mecanismul de Z-buffer
(buffer de adncime) i se deseneaz suprafeele n ordinea n care sunt transmise
bibliotecii. n aceast situaie, culoarea unui pixel acoperit parial de un poligon se
obine prin combinarea culorii poligonului cu culoarea pixelului, aflat n bufferul de
culoare. n modul RGBA, OpenGL multiplic componenta A a culorii poligonului cu
ponderea de acoperire (raportul dintre aria acoperit de fragmentul poligonului i aria
pixelului). Aceast valoare poate fi folosit pentru ponderarea culorii n fiecare pixel
prin combinare cu factorul GL_SRC_ALPHA pentru surs i factorul
GL_ONE_MINUS_SRC_ALPHA i pentru destinaie. Pentru efectuarea acestor
calcule, mai este nesesar validarea anti-aliasing-ului prin apelul funciei
glEnable() cu unul din argumentele GL_POINT_SMOOTH, GL_LINE_SMOOTH,
GL_POLYGON_SMOOTH, pentru puncte, linii i, respectiv, poligoane.
Exemplul 7.8
Programul din acest exemplu este cel folosit pentru generarea imaginilor a
dou triunghiuri cu i fr antialiasing. Funciile callback Init() i Display() ale
programului dezvoltat sub GLUT sunt urmtoarele:
void Init(){
glClearColor(1.0,1.0,1.0,1.0);
glLineWidth (1.5);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); }
void Display(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(0.0,0.0,0.0);
glPushMatrix();
glTranslated(0.0,0.0,-25.0);
// Triunghiuri fr antialiasing
glDisable(GL_BLEND);
glDisable(GL_LINE_SMOOTH);
glDisable(GL_POLYGON_SMOOTH);
glPushMatrix();
glTranslated(-8,0,0.0);
glBegin(GL_LINE_LOOP);
glVertex3d(-3,-3,0);
glVertex3d( 3,-2,0);
glVertex3d( 2,3,0);
glEnd();
glPopMatrix();
glPushMatrix();
glTranslated(-2,0,0.0);
glBegin(GL_POLYGON);
glVertex3d(-3,-3,0);
glVertex3d( 3,-2,0);
glVertex3d( 2,3,0);
glEnd();
glPopMatrix();
// Triunghiuri cu antialiasing
glEnable(GL_BLEND);
glEnable(GL_LINE_SMOOTH);
glEnable(GL_POLYGON_SMOOTH);
glPushMatrix();
glTranslated(4,0,0.0);
glBegin(GL_LINE_LOOP);
glVertex3d(-3,-3,0);
glVertex3d( 3,-2,0);
glVertex3d( 2,3,0);
glEnd();
glPopMatrix();
glPushMatrix();
glTranslated(10,0,0.0);
glBegin(GL_POLYGON);
glVertex3d(-3,-3,0);
glVertex3d( 3,-2,0);
glVertex3d( 2,3,0);
glEnd();
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
Deoarece anti-aliasing-ul se realizeaz prin combinarea culorilor, este
necesar i validarea combinrii culorilor (glEnable(GL_BLEND)) pentru
poligoanele cu antialiasing. La execuia acestui program se obine imaginea din
Fig. 7. 18.
(a) (b)
Fig. 7.18 (a) Dou poligoane fr anti-aliasing
(b) Aceleai poligoane reprezentate cu anti-aliasing.
Acest mod de realizare a filtrrii anti-aliasing este foarte simplist i nu poate fi
folosit dect pentru suprafee sau linii care nu se suprapun i pot fi redate fr
eliminarea suprafeelor ascunse, aa cum a fost situaia din acest exemplu.
Dac se invalideaz bufferul de adncime, eliminarea suprafeelor ascunse
trebuie s fie asigurat printr-un alt mecanism, de exemplu prin ordonarea suprafeelor
dup adncime (lista de display). Dar eliminarea suprafeelor ascunse prin ordonarea
suprafeelor dup adncime este un procedeu costisitor i care nu poate fi implementat
pentru scene complexe, cu un numr mare de obiecte. Soluia acceptabil ca
performane i rezultate pentru redarea anti-aliasing a scenelor complexe este folosirea
unui buffer de acumulare (A-buffer). Implementarea unui A-buffer prin rutine
software este foarte lent i deci impracticabil. Sistemele grafice performante
implementeaz diferite tehnici de anti-aliasing n hardware. Aceste tehnici sunt
dependente de implementarea hardware i sunt mai greu de descris la modul general.
8
Crearea i vizualizarea scenelor virtuale
Modul n care se creeaz i se utiliteaz modelele obiectelor tridimensionale
variaz n funcie de aplicaia grafic creia i sunt destinate.
n aplicaii de proiectare grafic pentru diferite domenii de activitate
(mecanic, arhitectur), crearea i utilizarea modelelor sunt tratate mpreun, n cadrul
unui sistem de proiectare, cum este, de exemplu sistemul AutoCad. Obiectele create de
proiectant sunt redate pe display, memorate ntr-o reprezentare specific sistemului i
editate sau modificate n continuare n cursul proiectrii.
Modelele din care este compus scena ntr-o aplicaie de realitate virtual au
cerine diferite de timp de prelucrare n timpul creerii scenei (modelare) i a utilizrii
ei (redare). n mod obinuit cele dou procese, de modelare i de redare a modelelor se
desfoar separat.
Modelarea este un proces off-line prin care se creeaz colecia de modele care
compun scena virtual. Procesul de modelare a obiectelor se desfoar asistat de
calculator, n diferite sisteme de proiectare interactiv, care pun la dispoziia
proiectantului funcii de creare a modelelor pornind de la diferite date de intrare.
Pentru aplicaiile de realitate virtual pot fi folosite att sisteme de proiectare automat
de uz general, cum sunt, de exemplu Autocad sau 3DStudio, sau sisteme de proiectare
special concepute pentru crearea scenelor virtuale, numite sisteme de generare a
bazelor de date (DBGS Data Base Generation Systems). Astfel de sisteme, cum sunt
sistemul Multigen, Corypheus, Sense8 i multe altele, ofer numeroase posibiliti de
modelare a obiectelor tridimensionale, a terenului, i a fenomenelor atmosferice (nori,
cea, etc.). Rezultatul operaiei de modelare l reprezint modele ale obiectelor sau
colecii de modele care compun o scen virtual, i acestea sunt memorate sub forma
de baze de date grafice, alctuite dintr-unul sau mai multe fiiere.
Redarea imaginii obiectelor este un proces care se desfoar interactiv, de
cele mai multe ori n timp real, n cursul diferitelor experimente de realitate virtual
(simulatoare de antrenament, muzee virtuale, etc.), ntr-un sistem grafic numit
generator de imagine (Image Generator IG). n generatorul de imagine se re-creeaz
modelele obiectelor i al scenei virtuale, folosind ca date de intrare fiiere de baze de
date. Pentru redarea eficient a imaginii, scena virtual este organizat ierarhic, pe mai
multe nivele de ierarhie, ceea ce permite selectarea rapid a obiectelor, moteniri de
transformri geometrice i de atribute, etc. Aceast organizare ierarhic se
implementeaz printr-un graf aciclic direcionat, numit graful scenei (scene graph).
Nodurile grafului conin modele ale obiectelor sau informaii de redare (gruparea
obiectelor n structura ierarhic, poziia obiectelor, proprieti de redare, lumini, etc.).
Organizarea ierarhic a scenei virtuale va fi prezentat mai detaliat n seciunea
urmtoare.
Bazele de date grafice sunt reprezentarea pe suport de memorie (fiiere) a
modelelor obiectelor scenei i trebuie s conin toate informaiile necesare pentru
crearea grafului scenei. Exist un numr mare de formate de reprezentare a bazelor de
date grafice, mai mult sau mai puin complete din punct de vedere al informaiilor de
construire a grafului scenei virtuale. Proliferearea formatelor bazelor de date
ngreuneaz portabilitatea programelor de aplicaii grafice, care trebuie s prevad
posibiliti de interpretare pentru ct mai multe formate.
n orice generator de imagine, modelul scenei are o structur bine precizat,
care depinde de scopul aplicaiei, iar datele importate din diferite formate de baze de
date sunt convertite la formatul intern al scenei. Un tip de format de baz de date
reprezint un anumit mod de descriere a entitilor componente ale bazei de date. Cele
mai cunoscute dintre formatele de baze de date sunt date n Tabelul 8.1.
Tabelul 8.1 Formate de baze de date.
Denumire Descriere
3ds Format binar 3DStudio, firma AutoDesk
dxf Format ASCII AutoCad, firma AutoDesk
obj Format ASCII, firma Wavefront Technologies
phd Format de descriere poliedre, firma Silicon Graphics
iv Format ASCII Open Inventor, firma Silicon Grafics
dwb Format binar/ASCII, firma Corypheus
flt14 Format binar Open Flight, firma Multigen
Formatele 3ds i dxf sunt formate de export ale sistemelor de proiectare de
uz general 3DStudio i AutoCad de la firma AutoDesk. Ele nu au fost concepute
special pentru propiectarea bazelor de date grafice, astfel c nu pot avea dect o
utilizare limitat. De exemplu, se pot folosi pentru proiectarea de obiecte individuale,
care sunt apoi nglobate n scene decrise prin formate mai complete.
Formatul obj este un format simplu care poate descrie obiecte
tridimensionale reprezentate prin reea de poligoane. Firma Wavefront Technology a
plasat n domeniu public un numr de modele n format obj, care a devenit n felul
acesta destul de cunoscut. O bogat librrie de modele produse de firma Viewpoint
(peste 3500 de modele tridimensionale reprezentnd avioane, maini, animale, organe
anatomice, etc.) sunt disponibile n formate dxf, obj, flt. Modelul avionului F-16
din Fig. 2.16 este un model n formatul obj.
Formatele dwb i flt sunt formate speciale de descriere a bazelor de date
grafice, dezvoltate mpreun cu sistemele de generare a bazelor de date de companiile
Corypheus i, respectiv, Multigen. Aceste formate conin informaii complete privind
obiectele, amplasarea i gruparea lor, materiale, lumini, din care se poate crea graful
scenei n generatorul de imagine.
Formatul iv (Open Inventor), dezvoltat de firma Silicon Graphics, este un
superset al limbajului de modelare VRML 1.0 (Virtual Reality Moddeling Language),
care n 1997 a devenit standard sub numele de VRML 97. Limbajul VRML 97 permite
crearea scenelor virtuale i accesarea lor prin internet. O scen virtual n limbajul
VRML este un format de baz de date, asemntor altor formate de baze de date.
Denumirea de limbaj VRML provine din faptul c specificaiile VRML conin reguli
sintactice i semantice precise, care permit verificarea corectitudinii construciilor
folosite. Acest limbaj este descris n seciunea urmtoare.
8.1Reprezentarea scenelor virtuale
O scen virtual (virtual scene) este compus dintr-o colecie de obiecte
tridimensionale, specificate prin forma i poziia lor, prin aspect (culoare, material,
etc), i comportare (deplasare n spaiu, interaciune). Diferite alte denumiri mai sunt
utilizate cu acelai neles: lume virtual (virtual world), mediu virtual (virtual
environment). Construirea ierarhic a scenei permite organizarea i parcurgerea
eficient a acesteia. Scena este compus din noduri conectate prin arcuri direcionate.
Un nod n scen descrie o anumit entitate: un obiect tridimensional, o grupare de
obiecte tridimensionale, o transformare geometric, o textur, o surs de lumin, etc.
Un arc al grafului scenei introduce un descendent (fiu) al unui nod, care motenete
unele din atributele nodului printe (Fig. 8.1).
O
1
A B C
G
1
T
11
T
12
O
2
D E F
G
22
T
21
T
22
R
T
2
T
1
G
21

Construirea ierarhic a scenei permite reutilizarea obiectelor i a
transformrilor geometrice. Un obiect complex se compune din gruparea mai multor
obiecte mai simple, dintre care unele se repet, n poziii de instaniere diferite. n felul
acesta, un nod poate avea mai mult de un nod printe.
Nodurile grafului sunt de mai multe tipuri, dintre care cele mai importante
sunt: nodurile de descriere geometric (forma) a obiectelor tridimensionale, noduri de
transformare i noduri de grupare.
Nodurile de descriere geometric conin modele ale unor obiecte elementare,
reprezentate poligonal, parametric sau prin descrierea matematic ntr-un sistem de
referin local (de modelare). n Fig.8.1 nodurile A, B, C, D, E, F reprezint obiecte
tridimensionale. Nodul G
1
grupeaz mai multe obiecte simple, formnd un obiect
compus care, la rndul lui este instaniat de dou ori, n poziii definite prin
intermediul nodurilor de transformare T
1
i T
2
, rezultnd obiecul O
1
, s.a.m.d. Nodul R
este un nod grup i reprezint rdcina grafului scenei.
Graful scenei descrie relaiile de motenire ntre noduri. Atributele unui obiect
descris de un nod pot fi cele motenite de la nodul printe, pot fi completate, sau
redefinite n nodul fiu.
Scena virtual este definit n sistemul de referin universal, n care se
poziioneaz i orienteaz punctul de observare n fiecare cadru al imaginii generate.
Obiectele din nodurile frunz sunt reprezentate ntr-un sistem de referin local. Un
nod de transformare conine o matrice de transformare M care definete poziia i
orientarea sistemului de referin al nodului fiu n sistemul de referin al nodului
printe. Transformarea prin aplicarea matricei M punctelor obiectelor din nodul fiu, le
transform din sistemul de referin al nodului fiu n sistemul de referin al nodului
printe.
Redarea imaginii unei scene reprezentat printr-un graf aciclic direcionat se
obine prin parcurgerea (traversarea) grafului scenei. Traversarea grafului scenei este
o operaie de parcurgere a grafului n adncime (depth first search), care ncepe cu
nodul rdcin al grafului i parcurge toate drumurile n graf pn la fiecare nod
frunz. n acest fel, un nod poate fi traversat de mai multe ori, pe ci diferite de
parcurgere. De exemplu, n graful din Fig. 8.1 nodul A este instaniat de dou ori,
odat pe calea RT
1
O
1
T
11
G
1
A i a doua oar pe calea RT
1
O
1
T
12
G
1
A; la fel i nodurile B
i C.
n reprezentarea ierarhic a obiectelor i a scenei, un obiect tridimensional
este instaniat (plasat n sistemul de referin universal) prin aplicarea unei secvene de
transformri de instaniere, i anume toate transformrile din nodurile de transformare
de la rdcin pn la nodul frunz pe una din cile de parcurgere a grafului.
Combinarea dintre operaia de parcurgere n adncime a grafului i operaiile de
concatenare a matricelor de transformare prin intermediul stivelor de transformare
Fig. 8.1Graful unui scene virtuale reprezentat printr-o ierarhie de noduri.
(definite n OpenGL sau de programul de aplicaie) permite reutilizarea matricelor
calculate pe parcursul traversrii prin salvarea lor n stivele de transformri i
restaurarea atunci cnd sunt necesare.
Algoritmul de traversare a grafului scenei de mai jos (n pseudocod
asemntor limbajului C) specific parcurgerea n adncime a grafului scenei i
operaiile care se execut la vizitarea fiecrui nod, n funcie de tipul acestuia. Se
consider un tip de date Node, care poate fi o clas de obiecte (n programarea
orientat pe obiecte) sau o structur (n abordarea procedural) i o stiv de matrice de
transformare de modelare, care admite operaiile de introducere (PushMatrix()),
de extragere (PopMatrix()) i de concatenare (prin postmultiplicare-
MultMatrix()) a matricei curente de transformare C cu o nou matrice M, cu
depunerea rezultatului n matricea curent (C = C M). n mod obinuit, aceasta este
stiva OpenGL de transformare de modelare-vizualizare (stiva MODELVIEW). n
aceast prezentare se consider trei tipuri de noduri: noduri frunz cu descrierea
formei unui obirect (SHAPE), noduri grup (GRUP) i noduri de transformare
(TRANSFORM).
void Traversal (Node* node){
if (node->type == SHAPE){
Redare obiect folosind stiva curenta C
}
else if (node->type ==GROUP){
for (i=0;i< nChilds; i++){
PushMatrix();
Traversal(node->child[i]);
PopMatrix();
}
}
else if (node->type == TRANSFORM){
MultMatrix(M);
}
}
Notaiile care s-au folosit n acest algoritm sunt evidente. Tipul nodului
(node->type) determin modul de prelucrare a acestuia. Un nod grup are
nChilds noduri fii, numerotai childs[i]. Un nod de transformare conine o
matrice de transformare M. Travesarea ncepe prin iniializarea matricei curente de
transformare cu matricea identitate (C = I) i apelul funciei de traversare pentru nodul
rdcin al scenei (Traversal(R)).
Matricele de instaniere se introduc n stiv n ordinea invers aplicrii lor
asupra obiectului, aa cum este necesar n operaia de acumulare prin postmultiplicare.
De exemplu, pentru prima instan a obiectului A, se execut operaiile:
C = I
C = C M
1
= M
1
C = C M
12
= M
1
M
12
Un punct oarecare P a obiectului A este instaniat prin transformarea:
P = CP = M
1
M
12
P
Pentru o alt instaniere a nodului A, matricea intermediar M
1
este salvat
nainte de prelucrarea fiecruia din fiii nodului O
1
. Poate este mai puin evident
eficiena metodei n acest exemplu foarte mic, dar pentru scene complexe, cu multe
transformri succesive, economia de calcule de produse de matrice este considerabil.
Acesta este modul principial de organizare i traversare a grafului unei scene
virtuale. Construirea unui astfel de graf se poate face fie direct, prin program (pentru
mici exemple cu scene de dimensiuni reduse) sau, n forma cea mai general, prin
parcurgerea unei baze de date descrise ntr-un limbaj (format) care s permit
identificarea construciei ierarhice a scenei: tipuri de noduri, atributele acestora, etc.,
pentru construcia grafului echivalent. Un astfel de limbaj este limbajul VRML.
8.2Limbajul VRML
Limbajul VRML (Virtual Reality Modeling Language) este un limbaj folosit n
crearea scenelor virtuale tridimensionale, cu posibilitatea de acces a acestora prin
reeaua internet WWW (World Wide Web). Versiunea folosit n momentul de fa este
VRML 2.0 (numit i VRML 97, fiind standard ISO din anul 1997) i este o revizuire
a versiunii VRML 1.0, stabilit n 1995. Numeroase informaii referitoare la limbajul
VRML se pot gsi n reeaua internet (http://www.vrml.org).
n prima versiune, limbajul VRML 1.0 permitea crearea unei scene virtuale
compus din obiecte tridimensionale, dar cu posibiliti limitate de interactivitate prin
reeaua internet. VRML 1.0 s fost dezvoltat pe baza formatului de descriere a bazelor
de date Open Inventor, dezvoltat de firma Silicon Graphics, care suport descrierea
scenelor ierarhice cu obiecte poligonale, lumini, materiale i efecte realiste. Un subset
a formatului Open Inventor, cu extensii pentru acces prin reeaua internet, a constituit
baza de pornire pentru limbajul de descriere a scenelor virtuale VRML. n momentul
de fa, numeroase titluri de cri, articole, reviste, documentaie, exemple, adrese de
grupuri de lucru, etc., se gsesc pe reea despre limbajul VRML i utilizarea acestuia.
Un fiier VRML este un fiier ASCII care conine descrierea unei scenei
virtuale i a unor aciuni interactive, i poate fi accesat prin reea folosind programe de
navigare (browsere). Pentru a afia o scen VRML din reeaua internet sau dintr-un
fiier de pe disc (cu extensia .vrl) este necesar un browser VRML, configurat ca o
extensie (plug-in) al unui browser Web. Pentru browserul Netscape Navigator, exist
browserul Cosmo Player (de la compania Platinum Technology) pentru interpretarea
fiierelor VRML. Un browser VRML citete fiierul care conine descrierea scenei
virtuale, creaz graful scenei i memoreaz datele de comportare a obiectelor i de
interaciuni corespunztoare. Observarea scenei virtuale i navigarea n direcia dorit
se realizeaz prin comenzi ale browserului. Aceste comenzi sunt foarte simple i se
gsesc n Help.
Dei utilizarea cea mai frecvent a limbajului VRML este n crearea i redarea
scenelor 3D prin reeaua www, un fiier VRML poate fi folosit i ca descriere a unei
scene virtuale pentru aplicaii de realitate virtual care nu se desfoar n reea. n
aceast situaie, pentru citirea fiierelor VRML se folosete un program de interpretare
a fiierelor VRML (parser) care creeaz graful scenei n concordan cu structura
programului de aplicaie. n domeniul public pe reeaua internet sunt disponibile un
mare numr de parsere care pot fi integrate ntr-o aplicaie. De exemplu, exist VRML
2.0 Parser de la Silicon Graphics (http://vrml.sgi.com/) sau Viper Parser (de
la NIST- National Institute of Standard and Technology) implementat n limbajul Java,
orientat pe obiecte.
n oricare situaie, formatul VRML permite construirea grafului scenei,
furniznd toate informaiile despre obiectele tridimensionale, ierarhia acestora,
condiii de mediu ambiant, materiale, etc. Graful scenei, construit prin citirea unuia
sau mai multor fiiere VRML, este apoi traversat pentru obinerea imaginii obiectelor
n diferite situaii de navigare a scenei. Redarea imaginii obiectelor pe display se
realizeaz prin intermediul bibliotecilor grafice de nivel mai sczut, cum sunt OpenGL
sau Direct3D (de la Microsoft). Aceste biblioteci asigur interfaa corespunztoare cu
acceleratorul grafic al sistemului.
Specificaiile limbajului VRML 97 descriu conceptele de realizare a scenelor
virtuale, descrierea nodurilor, descrierea cmpurilor, a evenimetelor i interaciunea
ntre noduri. Similar limbajelor de programare standard, specificaiile VRML conin
reguli sintactice i reguli semantice ale limbajului.
Un fiier VRML conine un header (acelai pentru ISO VRML 97 i VRML
2.0), urmat de descrierea nodurilor grafului scenei, care specific formele geometrice,
grupurile, transformrile i atributele mediului virtual care se contruiete i
vizualizeaz. Sintaxa VRML este simpl, cu cuvinte cheie n limba Englez sugestive
pentru entitatea definit. Headerul fiierului este:
#VRML 2.0 utf8
# Alte comentarii
unde utf8 este setul de caractere folosit. Este obligatorie introducerea versiunii
VRML 2.0 imediat dup caracterul # (fr nici un spaiu liber).
Un nod este specificat prin tipul nodului, urmat de un bloc cuprins ntre
acolade. Blocul din interiorul acoladelor conine zero sau mai multe cmpuri (fields) i
pentru fiecare cmp se specific valoarea (sau valorile) acestuia (field value). Fiecare
cmp al unui nod are un nume i admite una sau mai multe valori de un tip de date
determinat de tipul parametrului.
n VRML este extins noiunea de nod pentru orice entitate care grupeaz mai
multe informaii. Se poate observa diferena dintre noiunea de nod VRML i noiunea
de nod ntr-un graf al scenei. Un nod ntr-un graf este o component a unei structuri
ierarhice, fiecare nod avnd unul sau mai muli prini (cu excepia nodului rdcin
care nu are nici un printe) i unul sau mai muli fii (cu excepia nodurilor frunz care
nu au fii). Un nod VRML poate fi nod n graful scenei, sau poate s fie inclus (ca
valoare a unui cmp) ntr-un alt nod. Modul cum se construiete graful scenei pornind
de la specificarea nodurilor VRML depinde de programul de aplicaie.
Sistemele de coordonate folosite n VRML sunt aceleai cu sistemle de
coordonate din OpenGL: sistemul de referin universal este un sistem drept, sistemul
de referin observator este de asemenea un sistem de referin drept, definit ca
localizare i orientare relativ la sistemul de referin universal; proiecia perspectiv se
definete printr-un plan perpendicular pe axa z a sistemului de referin de observare,
cu direcia de observare spre z .
Tipurile de noduri VRML sunt urmtoarele:
Forme i descrieri geometrice (shapes): Box, Cone, Coordinate,
Cylinder, EvaluationGrid, Extrusion, IndexedFaceSet,
IndexedLineSet, Normal, PointSet, Shape, Sphere, Text.
Aspect (appearance): Appearance, Color, FontStyle,
ImageTexture, Material, MovieTexture, PixelTexture,
Texture-Coordinate, TextureTransform.
Grupuri (grouping): Anchor, Billboard, Collision, Group,
Inline, LOD, Switch, Transform.
Mediu (environment): AudioClip, Background, Directional-
Light, Fog, PointLight, Sound, SpotLight.
Vizualizare (viewing): NavigationInfo, Viewpoint.
Animaie (animation): ColorInterpolator, Coordinate-
Interpolator, NormalInterpolator, Orientation-
Interpolator, PositionInterpolator, ScalarInterpolator,
TimeSensor.
Interaciuni (interaction): CylinderSensor, PlaneSensor,
ProximitySensor, SphereSensor, TouchSensor,
VisibilitySensor.
Alte noduri: Script, WordInfo.
n total sunt 54 de tipuri de noduri, i fiecare tip admite unul sau mai multe
tipuri de cmpuri. Tipurile de date prin care se specific valoarea unui cmp pot fi:
numere ntregi, numere n virgul mobil, valori boolene, iruri de caractere, sau pot fi
folosite chiar noduri VRML. Un exemplu de fiier VRML foarte simplu este dat n
continuare.
Exemplul 8.1
#VRML 2.0 utf8
# Construieste un cilindru 3D
Shape {
appearance Appearance {
material Material {
diffuseColor 0.0, 0.5, 1.0
}
}
geometry Cylinder {
height 2.0
radius 1.5
}
}
Nodul de tipul Shape introduce un obiect tridimensional pentru care se
specific cmpurile cu numele appearance i geometry, pentru definirea
aspectului i a formei. Valoarea cmpului appearance este un nod de tipul
Appearance, definit imediat prin blocul corespunztor ntre acolade. Nodul
Apperence are specificat cmpul material a crui valoare este dat printr-un nod
de tipul Material. Nodul de tip Material conine cmpul diffuseColor,
pentru care se specific valoarea prin trei numere n virgul flotant, pentru
componentele rou, verde, albastru. Valoarea cmpului geometry este un nod de
tipul Cylinder, care este definit prin cmpurile heigth i radius, cu valori
numere n virgul mobil.

Un fiier VRML poate conine mii de noduri i fiecare nod conine un numr
variabil de cmpuri, tipic dou-trei cmpuri, dar pot fi i zeci de cmpuri. Din fericire,
toate cmpurile nodurilor au prevzute valori implicite rezonabile, astfel c nodurile
pot fi folosite chiar dac nu se specific valoarea tuturor cmpuri. De exemplu,
valoarea implicit a culorii de tergere este negru, i, dac nu se specific alt culoare
de fundal (printr-un nod Background), atunci, la navigare prin intermediul
browserelor fundalul rmne negru. Poziia iniial a punctului de observare este este
la (0.0, 0.0, 10.0) i, dac nu se specific alt poziie, (printr-un nod Viewpoint),
atunci navigarea ncepe cu aceast poziie.
Sunt considerate comentarii toate caracterele dup caracterul # pn la
sfritul liniei. Nodurile, cmpurile i valorile cmpurilor pot fi aranjate n oricte
linii; spaiile, tab-urile, virgulele i caracterul de linie nou sunt considerate spaii albe
(white spaces) i ignorate la citire. VRML este case-senzitive, adic difereniaz
literele mici de cele mari.
8.2.1Construirea formelor geometrice
Orice form geometric se construiete folosind un nod de tipul Shape, cu
cmpurile appearance i geometry pentru specificarea aspectului i a formei
geometrice.
Forma geometric se specific prin numele unuia din corpurile geometrice
elementare recunoscute de VRML (Box, Cylinder, Cone, Sphere), printr-o
gril de valori de altitudini (ElevationGrid), printr-un obiect obinut prin
extrudare (Extrusion) sau printr-o reea de fee poligonale (IndexedFaceSet),
linii (IndexedLineSet) sau puncte (PointSet).
Cea mai puternic i mai folosit modalitate de reprezentare a obiectelor este
reprezentarea poligonal descris de nodul IndexedFaceSet. Acest nod definete
un obiect printr-o mulime de vrfuri (coordonate 3D) i o mulime de fee, fiecare fa
fiind o list de indici n vectorul de vrfuri. Se poate urmri mai simplu definiia unui
astfel de nod n exemplul urmtor.
Exemplul 8.2
#VRML V2.0 utf8
# cub.wrl - construiete un cub prin fee indexate
Shape {
appearance Appearance {
material Material { }
}
geometry IndexedFaceSet {
coord Coordinate {
point [
# Coordonatele de deasupra a cubului
-1.0 1.0 1.0,
1.0 1.0 1.0,
1.0 1.0 -1.0,
-1.0 1.0 -1.0,
# Coordonatele de jos ale cubului
-1.0 -1.0 1.0,
1.0 -1.0 1.0,
1.0 -1.0 -1.0,
-1.0 -1.0 -1.0
]
}
coordIndex [
0, 1, 2, 3, -1,
7, 6, 5, 4, -1,
0, 4, 5, 1, -1,
1, 5, 6, 2, -1,
2, 6, 7, 3, -1,
3, 7, 4, 0
]
}
}
Acest nod creeaz un cub i specific fiecare fa poligonal printr-o list de
indici n lista de vrfuri i n lista de culori. Orice vector (vectorul point, vectorul
coordIndex) este ncadrat ntre paranteze drepte. Delimitarea ntre indecii feelor
se face prin numrul 1.
8.2.2Noduri de grupare
Nodurile de grupare (Group, LOD, Switch, Billboard, Inline,
Collision, Anchor, Transform) ale limbajului VRML sunt noduri care au
unul sau mai multe noduri fii.
Nodul Group colecteaz mai muli fii, care pot fi forme, lumini, sau alte
noduri Group. n exemplul urmtor este creat un obiect compus din trei
paralelipipede dreptunghice (semnul plus tridimensional).
Exemplul 8.3
#VRML V2.0 utf8
# semn3D.wrl semnul plus tridimensional
Group {
children [
Background {
skyColor 1.0 1.0 1.0
},
Viewpoint {
position 40.0, 10.0, 40.0
orientation 0.0 1.0 0.0 0.78
},
DirectionalLight {
direction 0.0 -1.0 -0.2
intensity 1.0
ambientIntensity 0.2
color 1.0 1.0 1.0
},
Shape {
appearance DEF White Appearance {
material Material { }
}
geometry Box {
size 25.0 2.0 2.0
}
},
Shape {
appearance USE White
geometry Box {
size 2.0 25.0 2.0
}
},
Shape {
appearance USE White
geometry Box {
size 2.0 2.0 25.0
}
}
]
}
Imaginea care se obine la vizualizarea acestui fiier VRML este dat n Fig.
8.2 . Grupul conine ase noduri fii, trei noduri de descriere a unei forme geometrice
(nodurile Shape), un nod de surs lumin (DirectionalLight), un nod de
definire a culorii de tergere (Background) i un nod de poziionare a punctului de
observare (Viewpoint). Lista de fii este introdus ntre paranteze drepte precedate
de cuvntul cheie children.
Fig. 8.2 Imaginea afiat de browserul Cosmo Player
la ncrcarea fiierului semn3D.wrl.
n acest exemplu este folosit etichetarea nodurilor. Orice nod poate primi o
etichet introdus prin cuvntul-cheie DEF. Un nod odat etichetat la definiie, poate fi
folosit ca valoare a unui cmp prin simpla introducere a cuvntului-cheie USE urmat
de eticheta nodului. n exemplul de mai sus, un nod de aspect a fost etichetat cu
numele White (DEF White Appearance{}) i apoi folosit cu acest nume
ca valoare a unui cmp (appearance USE White).
Aceast imagine se obine fie prin intermediul unui browser (Cosmo Player
pentru Netscape), fie prin interpretare (parsarea) fiierului, crearea grafului scenei i
redarea imaginii acestuia.
n fiierul semn3D.wrl mai este folosit un nod pentru definirea culorii de
fundal (nodul Background cu cmpul skyColor), nodul Viewpoint pentru
definirea poziiei de observare i nodul DirectionalLight pentru definirea unei
surse de lumin direcional. Se pot remarca unele diferene ntre conveniile de
definire a unor date n VRML i cele din OpenGL. De exemplu, pentru rotaie se
specific mai nti componentele axei de rotaie, apoi unghiul de rotaie n radiani (n
OpenGL se d mai nti valoarea unghiului n grade, apoi componentele axei de
rotaie).
Nodul Switch conine o list ordonat de noduri fii care conin reprezentri
variate ale aceluiai obiect. n cursul redrii, se selecteaz n secven cte unul din fii
la fiecare cadru de imagine, ceea ce creeaz impresia de evoluie (modificare
dinamic) a obiectului. n acest fel sunt redate luminile de semnalizare (care i
schimb culoarea sau intensitatea la intervale stabilite de timp) sau flcrile, fumul,
etc.
Nodul LOD conine reprezentarea unui obiect cu nivele de detaliu multiple.
Fiecare nod fiu al nodului LOD este selectat ntr-un interval de distane specificat n
vectorul de distane al nodului LOD.
Nodul Transform definete transformarea de coordonate a tuturor nodurilor
fii ai acestuia fa de nodul printe. Prin aplicarea acestei transformri, un nod fiu este
transformat din sistemul de referin propriu n sistemul de referin al nodului printe.
Succesiunea de transformri care se aplic unui nod frunz l transform din sistemul
de referin local n sistemul de referin universal.
Exemplul 8.4
Fiierul cupola.vrl de mai jos construiete o cupol din dou obiecte
poziionate folosind un nod Transform:
#VRML V2.0 utf8
# cupola.wrl - construiete o cupol
Group {
children [
Background {
skyColor 1.0 1.0 1.0
},
DirectionalLight {
direction 0.0 -1.0 -1.0
intensity 1.0
ambientIntensity 0.2
color 1.0 1.0 1.0
},
# Pereii cupolei
Shape {
appearance DEF Brown Appearance {
material Material {
diffuseColor 0.6 0.4 0.0
}
}
geometry Cylinder {
height 2.0
radius 2.0
}
},
# Acoperiul cupolei
Transform {
translation 0.0 2.0 0.0
children [
Shape {
appearance USE Brown
geometry Cone {
height 2.0
bottomRadius 2.5
}
}
]
}
]
}
Cupola este reprezentat printr-un nod Group cu doi fii. Primul fiu este un
cilindru, care red pereii cupolei; cel de-al doilea fiu este un con translatat cu 2 uniti
fa de nodul printe (nodul Group) i reprezint acoperiul. Imaginea obinut prin
ncrcarea fiierului cupola.wrl este dat n Fig. 8.3. (a).
Exemplul 8.5
Fig. 8.3 (a) Imaginea fiierului cupola.wrl.
(b) Imaginea fiierului asterix.wrl
#VRML V2.0 utf8
# asterix.wrl construiete semnul asterix 3D
Group {
children [
Viewpoint {
position 40.0, 10.0, 40.0
orientation 0.0 1.0 0.0 0.78
},
# Primul bra
DEF Arm1 Shape {
appearance Appearance {
material Material { }
}
geometry Cylinder {
height 1.0
radius 0.1
}
},
# Al doilea bra
Transform {
rotation 1.0 0.0 0.0 1.047
children USE Arm1
},
# Al treilea bra
Transform {
rotation 1.0 0.0 0.0 2.094
children USE Arm1
}
]
}
Fiierul asterix.wrl construiete un semn asterix n trei dimensiuni.
Obiectul este reprezentat printr-un nod Group cu patru fii. Primul nod fiu
(Viewpoint) poziioneaz punctul i direcia de observare. Cel de-al doilea nod fiu
este un bra reprezentat printr-un cilindru vertical; cel de-al treilea fiu al nodului
Group reprezint al doilea bra i se obine printr-o rotaie cu 60 (1.047 radiani) a
primului bra relativ la axa x; cel de-al patrulea fiu al nodului Group reprezint al
treilia bra i se obine printr-o rotaie cu 120 (2.094 radiani) a primului bra relativ
la axa x.
Grafurile scenelor corespunztoare fiierelor cupola.wrl i
asterix.wrl sunt date n Fig. 8.4.
Nodul Billboard definete o transformare a nodurilor fii, dar automat
adaug la aceast transformare o rotaie astfel nct axa z a sistemului de referin al
nodurilor fii s fie n permanen orientat ctre punctul de observare. n acest mod,
atunci cnd observatorul se mic n scen, el vede ntotdeauna aceeai fa a
obiectului. Nodul de tip Billboard se folosete pentra redarea copacilor n scenele
virtuale. Un copac se reprezint printr-o singur fa cu o textur care reproduce
imaginea copacului, i care se rotete astfel nct observatorul vede faa texturat i nu
muchiile acesteia.
Nodul Inline este un nod de grupare care permite introducerea unuia sau
mai multor noduri fii dintr-un alt fiier VRML extern specificat prin codul URL. n
acest fel, o scen virtual se poate compune din mai multe module (fiiere) existente.
8.2.3Animaia n VRML
Una din cele mai importante caracteristici ale limbajului VRML este abilitatea
de a descrie animaia obiectelor n scena virtual. Animaia VRML poate modifica
poziia, orientarea, dimensiunea obiectelor; culoarea, materialul, textura sau parametrii
de amplasare a texturii pe feele obiectelor; culoarea, poziia sau direcia luminilor; i
nc multe alte caracteristici ale scenei virtuale.
Fig. 8.4 (a) Graful scenei cupola.wrl (b) Graful acenei asterix.wrl.
Group
Transform Shape
Shape
Group
Shape
Transform Transform
Viewpoint
(a)
(b)
Bibliografie
[Aur91] F. Aurenhammer, Voronoi Diagrams- A Survei of Fundamental Geometric Data Structure,
ACM Computing Survey, Vol. 23 Nr. 3, Sept. 1991.
[Azu97] R.T Azuma, A survey of Augnented Reality, Presence: Teleoperators and Virtual
Environments, Vol. 6, Nr. 4, pp. 355-385, August 1997.
[Baciu99] Rodica Baciu i D. Volovici, Sisteme de prelucrare grafic, Editura Albastr, Cluj-Napoca,
1999.
[Burd92] G. Burdea, J. Zhuang, E. Roskos, D. Silver i N. Langrana, A Portable Dextrous Master
with Force Feedback, Presence- Teleoperators and Virtual Environments, Vol. 1, Nr. 1, pp
18/27, March 1992.
[Burd93] G. Burdea, Virtual Reality Systems and Applications, Electro93 International Conference,
Short Course, Edison, NJ, April 1993.
[Burd94] G. Burdea i P. Coiffet, La Ralit Virtuelle, Edition Hermes, Paris, 1994.
[Burd97] G. Burdea, Force and Touch Feedback for Virtual Reality, John Willey & Sons, Inc., New
York, 1997.
[Dog88] D. Dogaru, Elemente de grafic 3D, Ed. tiinific i Enciclopedic, Bucureti, 1988.
[Fang95] Tsung-Pao Fang i Les A. Piegl, Delaunay Triangulation in Three Dimensions, IEEE
Computer Graphics and Applications, Vol. 15, Nr. 5, September 1995, pp. 62-69.
[Fjall93] Per-Olof Fjallstrom, Evaluation of a Delaunay-based method for surface approximation,
Computer-Aided Design, Vol. 25, Nr. 11, November 1993, pp. 711-719.
[Foley90] J.D. Foley i A. Van Dam, Computer Graphics: Principles and Practices, 2
nd
Edn, Addison-
Wesley, Reading, Massachusetts, 1990.
[Giga93] M.A. Gigante, Virtual Reality: Definitions, History and Applications, Virtual Reality
Systems, Academic Press, 1993.
[Gour71] H. Gouraud, Continous Shading of Curved Surfaces, IEE Trans. on Computers, C-20(6),
June 1971, pp. 623-629.
[Ion99] Felicia Ionescu, Principiile Calculului Paralel, Editura Tehnic, Bucureti 1999.
[Man95] C. Manetta i R. Blade, Glossary of Virtual Reality Terminology, International Journal of
Virtual Reality, Vol.1, Nr. 2, 1995.
[Mold96] Florica Moldoveanu, Zoea Racovi, . Petrescu, G. Hera i M. Zaharia, Grafica pe
Calculator, Editura Teora, 1996.
[New81] W.M. Newman i R.F. Sproull, Principles of Interactive Computer Graphics, McGraw-Hill,
New Zork, 1981.
[Prep85] F.P. Preparata i M.I. Shamos, Computational Geometry: an Introduction, Springer-Verlag,
New-York, 1985.
[Rour93] Joseph ORourke, Computational Geometry in C, Cambridge University Press, Boston,
Massachusetts, 1993.
[Sher92] B. Sherman i P Judkins, Glimpses of Heaven, Vision of Hell: Virtual Reality and its
implications, Hodder and Stoughton, London, 1992.
[Suth74] I.E. Sutherland i G.W Hodgman, Reentrant Polygon Clipping, CACM, January 1974.
[Watt95] A. Watt, 3D Computer Graphics, Addison-Wesley, Reading, Massachusetts, 1995.
[Woo97] M. Woo, Jackie Neider i T. Davis, OpenGL Programming Guide, OpenGL Architecture
Review Board, Addison-Weslez Developres Press, Reading, Massachusetts, 1997.
[Ames97] A.L. Ames, D.R. Nadeau, i J.L. Moreland, The VRML 2.0 Sourcebook, John Wiley & Sons
Inc., New York, 1997.