Sunteți pe pagina 1din 15

Software Pentru Aparatura Medicala Laborator: Biblioteci Grafice

Cristina Stoica, Ioana Dogaru

Lucrarea Nr. 1
BIBLIOTECI GRAFICE
Pentru programarea aplicaiilor grafice complexe se pot utiliza 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 disponibile gratis pe
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 mare numr de funcii grafice de baz pentru
crearea apliciilor grafice tridimensionale, asigurnd o interfa independent de platforma hardware.
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 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 platform, care ascunde dificultile interfeelor de aplicaii Windows,
punnd la dispoziie funcii pentru crearea i iniializarea ferestrelor i pentru execuia
programelor grafice bazate pe biblioteca OpenGL.
Toate funciile bibliotecii OpenGL ncep cu prefixul gl, funciile GLU ncep cu prefixul glu,
iar funciile GLUT ncep cu prefixul glut.
nainte de a prezenta caracteristicile bibliotecii OpenGL, se vor preciza conveniile de
reprezentare a coordonatelor punctelor n spaiul tridimensional i al culorilor.
Sisteme de referin tridimensionale. Pentru crearea i redarea scenelor tridimensionale 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. 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. Diferite sisteme de grafic tridimensional 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 parcurs.

Software Pentru Aparatura Medicala Laborator: Biblioteci Grafice

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 coloan:
x
P x y z sau P y
z
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 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, folosesc notaia
de matrice coloan pentru un punct n spaiul tridimensional, care este adoptat i n lucrarea prezent.

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 ferestra 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.
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. 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
unde R, G, B sunt versorii axelor rou (red), verde (green), albastru (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 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.

1.1

CARACTERISTICILE BIBLIOTECII OPENGL

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
typedef
typedef
typedef
typedef
typedef
typedef
typedef
typedef

unsigned int GLenum;


unsigned char GLboolean;
signed char GLbyte;
int GLint;
int GLsizei;
unsigned int GLuint;
float GLfloat;
float GLclampf;
double GLdouble;

De asemenea, 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:

Software Pentru Aparatura Medicala Laborator: Biblioteci Grafice

/* Boolean */
#define GL_TRUE
#define GL_FALSE

1
0

/* BeginMode */
#define GL_POINTS
#define GL_LINES
#define GL_TRIANGLES
#define GL_POLYGON

0x0000
0x0001
0x0004
0x0009

Pentru a nelege funcionarea comenzilor OpenGL, se descriu n continuare cele mai


importante dintre caracteristicile OpenGL.
Poarta de afiare OpenGL mai este numit context de redare (rendering context) i este
asociat unei ferestre de afiare din sistemul Windows. Dac se programeaz folosind biblioteca
GLUT, corelarea dintre fereastra de afiare i poarta OpenGL este asigurat de funcii ale acestei
biblioteci. Dac nu se folosete biblioteca GLUT, atunci funciile bibliotecilor de extensie XGL, WGL
sau PGL permit asocierea contextului de redare OpenGL cu o fereastr de afiare i accesul la aceasta.
n OpenGL un pixel este reprezentat 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 (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 (Zbuffer), bufferul ablon (stencil), bufferul de acumulare (accumulation).
Bufferul de imagine (image buffer, 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. n OpenGL comutarea bufferelor este efectuat de funcia SwapBuffers(). Biblioteca
OpenGL ofer posibilitatea creerii imaginilor cu simplu sau dublu buffer, monoscopice i
stereoscopice.
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 la o anumit adres. Valoarea
3

Software Pentru Aparatura Medicala Laborator: Biblioteci Grafice

memorat n locaia corespunztoare unui pixel este distana acestuia 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.
Operaiile de baz. OpenGL deseneaz primitive geometrice (puncte, linii i poligoane) n
diferite moduri selectabile. O primitiv este definit printr-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 n ordine i n acelai mod pentru toate primitivele geometrice.
Modul n care este executat secvena de operaii pentru redarea primitivelor geometrice 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 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. Variabilele de stare au denumiri date sub
form de constante simbolice care pot fi folosite pentru aflarea valorilor acestora. Cteva exemple de
stri definite prin constante simbolice n fiierul gl.h sunt:
#define
#define
#define
#define

GL_CURRENT_COLOR
GL_CURRENT_NORMAL
GL_MODELVIEW_MATRIX
GL_PROJECTION_MATRIX

0x0B00
0x0B02
0x0BA6
0x0BA7

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(), glColor4d(), etc. n continuare,
n aceast lucrare se noteaz generic cu # sufixul dintr-o familie de funcii (de exemplu,
glColor#()).
Primitive geometrice. Funciile OpenGL execut secvena de operaii grafice asupra fiecrei
primitive geometrice, definit prin tipul acesteia i o list de vrfuri. Coordonatele unui vrf al unei
primitive sunt transmise ctre OpenGL prin apelul unei funcii glVertex#(). Aceasta are mai

Software Pentru Aparatura Medicala Laborator: Biblioteci Grafice

multe variante, dup numrul i tipul argumentelor. Iat, de exemplu, numai cteva din prototipurile
funciilor glVertex#():
void
void
void
void

glVertex2d(GLdouble x, GLdouble y);


glVertex3d(GLdouble x, GLdouble y, GLdouble z);
glVertex3f(GLfloat x, GLfloat y, GLfloat z);
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 list 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. Fiecare vrf este specificat prin intermediul unei funcii glVertex, iar
lista de vrfuri este delimitat ntre funciile glBegin(GLenum mode) i glEnd(). Aceeai list
de vrfuri (v0, v1, v2,.vn1) poate fi tratat ca puncte izolate, linii, poligon, etc, n funcie de tipul
primitivei, care este transmis prin argumentul mode al funciei glBegin() (GL_POINTS,
GL_LINES, GL_POLYGON, etc).
De exemplu, desenarea unei primitive geometrice (un patrulater) n spaiul tridimensional se
realizeaz n OpenGL prin secvena de apeluri de funcii:
glBegin(GL_POLYGON);
glVertex3d(-1.0, 1.0,
glVertex3d( 1.0, 1.0,
glVertex3d( 1.0,-1.0,
glVertex3d(-1.0,-1.0,
glEnd();

0.0);
0.0);
0.0);
0.0);

Argumentele funciilor glVertex3d() reprezint coordonatele n spaiul tridimensional ale


vrfurilor patrulaterului. De fapt, "desenarea" unei suprafee (primitiv geometric) nseamn
reprezentarea pe display a proieciei pe un plan de proiecie a suprafeei din spaiul tridimensional.
Obinerea imaginii pe display este rezultatul unei secvene de operaii grafice, care vor fi prezentate n
lucrrile urmtoare.
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 i primitive orientate invers. 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

Software Pentru Aparatura Medicala Laborator: Biblioteci Grafice

intrare (index) componentele corespunztoare R,G,B,A ale culorii. n modul de culori indexate nu se
pot efectua unele dintre prelucrrile grafice importante (cum sunt umbrirea, anti-aliasing, ceaa).
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 i 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, dou din prototipurile acestei funcii definite n fiierul gl.h sunt:
void glColor3f(GLfloat r, GLfloat g, GLfloat b);
void glColor4d(GLdouble r, GLdouble g, GLdouble b, GLdouble a);

Culoarea se poate specifica prin trei sau patru valori, care corespund componentelor rou (r),
verde (g), albastru (b), respectiv transparen (a) ca a patra component pentru funciile cu 4
argumente.

1.2

DEZVOLTAREA APLICAIILOR GRAFICE

Biblioteca GLUT permite crearea i administarea ferestrelor de afiare i a evenimentelor de


intrare n aplicaii grafice OpenGL, n mod independent de platforma de calcul. Header-ul glut.h
trebuie s fie inclus n fiierele aplicaiei, iar biblioteca glut.lib (sau glut32.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 pentru iniializarea programului, redimensionarea ferestrei de afiare, desenarea
fesrestrei i controlul dispozitivelor de intrare (tastatur i mouse). Aceste funcii 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 al ferestrei de afiare. Sunt disponibile cinci funcii pentru controlul
ferestrei de afiare a programului. n programele dezvoltate sub GLUT, pentru corelarea dintre poarta
de afiare i fereastra de afiare se folosesc funciile i glutInitDisplayMode() i
glutInit(). Funcia
void glutInit(int* argc, char** argv) iniializeaz
biblioteca GLUT folosind argumentele din linia de comand; ea trebuie s fie apelat naintea oricror
alte funcii GLUT sau OpenGL. Funcia 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.
Funcia: void glutInitWindowPosition(int x, int y) specific poziia pe
ecran a colului stnga sus al ferestrei de afiare. Pentru definirea dimensiunii iniiale a ferestrei de
afiare se apeleaz funcia void glutInitWindowSize(int width, int heigth).
Crearea fereastrei n care se afieaz contextul de redare (poarta) OpenGL are loc la apelul
funciei int glutCreateWindow(char* string).
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. Apelul glutDisplayFunc(Display)nregistreaz funcia
callback Display() care calculeaz i afieaz imaginea. Argumentul funciei este un pointer la o

Software Pentru Aparatura Medicala Laborator: Biblioteci Grafice

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().
Funcia void
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.
Funcia 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.
Funcia glutMouseFunc(void(*Mouse)(unsigned int button, int
state, int x, int y) nregistreaz funcia callback Mousecare 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. Funcia glutMotionFunc(void(*Motion)(int x, int y)
nregistreaz funcia callback Motion care este apelat la micarea mouse-ului.
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.
Generarea obiectelor tridimensionale. Multe programe folosesc modele simple de obiecte
tridimensionale pentru a ilustra diferite aspecte ale prelucrrilor grafice. GLUT conine cteva funcii
care redau astfel de obiecte tridimensionale n modul wireframe sau cu suprafee pline (filled). Fiecare
obiect este reprezentat ntr-un sistem de referin local, dimensiunea lui poate fi transmis ca argument
al funciei, iar poziionarea i orientarea n scen se face n programul de aplicaie. Exemple de astfel
de funcii:
void glutWireCube(GLdouble size);
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 funcii callback. Acest mod va fi prezentat la primul exemplu de program OpenGLGLUT i va fi reluat apoi i n alte exemple.

Software Pentru Aparatura Medicala Laborator: Biblioteci Grafice

Exemplu:
Pentru crearea unui program grafic bazat pe biblioteca GLUT n sistemele Windows se
poate folosi mediul Microsoft Visual Studio. Se creeaz un proiect de tipul Win32 Console
Application i se selecteaz opiunea "An empty project".

Software Pentru Aparatura Medicala Laborator: Biblioteci Grafice

Programul dorit se scrie ntr-unul sau mai multe fiiere care se insereaz n proiectul creat. De
exemplu, programul GLUT care deseneaz un ptrat rou n spaiul tridimensional, va conine fiierul
surs:
// Program HelloGlut.cpp
#include <GL/glut.h>
// Pozitionare obiecte scena
float Xs = 0.0f, Ys = 0.0f, Zs = 0.0f;
float angleXs = 0.0f, angleYs = 0.0f, angleZs = 0.0f;
// Pozitionare observator
float Xv = 0.0f, Yv = 0.0f, Zv = 5.0f;
float angleXv = 0.0f, angleYv = 0.0f, angleZv = 0.0f;
// Mouse
bool pressed = false;
int mouse_x;
int mouse_y;
// Functia de initializare a starii OpenGL
void Init(){
glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // culoare stergere
glClearDepth(1.0f);
//adancimea maxima Z buffer
glEnable(GL_DEPTH_TEST);
// validare Z buffer
}
void DrawRectangle(){
glBegin(GL_POLYGON);
glVertex3d(-1.0, 1.0, 0.0);
glVertex3d( 1.0, 1.0, 0.0);
glVertex3d( 1.0,-1.0, 0.0);
glVertex3d(-1.0,-1.0, 0.0);
glEnd();
}
// Functia callback de desenare
void Display(void){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
// Transformarea de observare
glRotatef(-angleZv, 0.0,0.0,1.0);
glRotatef(-angleXv, 1.0,0.0,0.0);
glRotatef(-angleYv, 0.0,1.0,0.0);
glTranslatef(-Xv, -Yv, -Zv);
// se initializeaza Zv = 5;
// Transformare de modelare (pozitionare) obiecte din scena
glTranslatef(Xs,Ys,Zs);
glRotatef(angleYs, 0.0,1.0,0.0);
glRotatef(angleXs, 1.0,0.0,0.0);
glRotatef(angleZs, 0.0,0.0,1.0);
glColor3d(1.0, 0.0, 0.0);
// culoare curenta
DrawRectangle();
glPopMatrix();
glFinish();
glutSwapBuffers();
// comutare buffer
}
// Functia CALLBACK de redimensionare a ferestrei
void Reshape(int w, int h){
h = (h == 0) ? 1 : h;
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION); //selectie stiva PROJECTION
glLoadIdentity();
gluPerspective(45.0f, (GLdouble)w/h, 1.0f, 100.0f);
glMatrixMode(GL_MODELVIEW); // selectie stiva MODELVIEW
glLoadIdentity();
}

Software Pentru Aparatura Medicala Laborator: Biblioteci Grafice

// Functia callback de tastatura


void Keyboard(unsigned char key, int x, int y){
switch (key){
// tastele z si Z modifica pozitia obiectelor
case 'z':
Zs -= 0.5;
glutPostRedisplay();
break;
case 'Z':
Zs += 0.5;
glutPostRedisplay();
break;
}
}
// Functia callback de tratare evenimente de apasare butoane mouse
void Mouse(int button, int state, int x, int y){
switch(button){
case GLUT_LEFT_BUTTON:
if (state == GLUT_DOWN){
pressed = true;
mouse_x = x;
mouse_y = y;
}
else pressed = false;
break;
}
}
// Functia callback de tratare evenimente de miscare mouse
void Motion(int x, int y){
if (pressed){
float w = 500;
float h = 500;
angleYs += 180.0f*(x - mouse_x)/w;
angleXs += 180.0f*(y - mouse_y)/h;
mouse_x = x;
mouse_y = y;
glutPostRedisplay();
}
}
// Functia principala a programului
int main(int argc, char** argv){
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(100,100);
glutCreateWindow("OpenGL");
Init();
glutDisplayFunc(Display);
glutReshapeFunc(Reshape);
glutKeyboardFunc(Keyboard);
// Inregistrare func. Keyboard
glutMouseFunc(Mouse);
// Inregistrare func. Mouse
glutMotionFunc(Motion);
// Inregistrare func. Motion
glutMainLoop();
return 0;
}

Observatii
Pentru compilarea i execuia corect a programului, trebuie adugate bibliotecile
OpenGL, GLU i GLUT. Pentru aceasta se folosete comanda Project-Properties si se adaug
bibliotecile opengl32.lib, glu32.lib, glut32.lib, glaux.lib (dupa cum reiese din figura de mai jos).
10

Software Pentru Aparatura Medicala Laborator: Biblioteci Grafice

Alte setari premergatoare generarii proiectelor folosind bibliotecile grafice OpenGL


fisierele GL.h, GLU.h, GLUT.h, GLAUX.h trebuie sa fie prezente in directorul
C:\Program
Files\Microsoft
Visual
Studio
9.0\VC\include;
fisierele
OPENGL32.lib, GLU32.lib, GLUT32.lib, GLAUX.lib trebuie sa fie prezente in directorul
C:\Program Files\Microsoft Visual Studio 9.0\VC\lib; fisierele OPENGL32.dll,
GLU32.dll, GLUT32.dll, trebuie sa fie prezente in directorul C:\Windows\System32.

sunt:

Utilizand meniul: Project->Lab3d Properties... se modifica setarile de proiect dupa cum se


observa in figura de mai jos:

Fisierul cod sursa C++ se creaza si se adauga in proiect dupa cum urmeaza:

11

Software Pentru Aparatura Medicala Laborator: Biblioteci Grafice

n acest program se pot remarca funciile strict necesare dezvoltrii unui program folosind
biblioteca GLUT . Funcia de iniializare Init()seteaz culoarea de tergere (prin apelul funciei
glClearColor), seteaz valoarea de tergere a buferului de adncime i valideaz testul de
adncime (GL_DEPTH_TEST).
n funcia main() se fac iniializrile bibliotecilor GLUT i OpenGL, se nregistreaz
funciile callback i se apeleaz funcia de execuie n bucl (glutMainLoop()).
Funcia callback de desenare (denumit Display()) este echivalent funciei
DrawScene() din proiectul precedent; n exemplul prezentat ea conine doar partea de desenare a
unui ptrat.
Funcia callback de redimensionare (denumit Reshape()) este echivalent funciei
OnSize() din proiectul precedent. Ea este invocat de aplicaia cadru GLUT atunci cnd se schimb
dimensiunile ferestrei de afiare a imaginii i definete transformarea ferestr-poart
(glViewport()) i transformarea de proiecie perspectiv (gluPerspective(), cu aceeai
parametri ca n proiectul precedent.
Funcia callback de tratare a evenimentelor de tastatura (Keyboard()) permite modificarea
poziiei obiectelor n scen (coordonata Zs) la acionarea tastelor z, Z. Funciile callback de tratare a
evenimentelor de mouse (Mouse() i Motion()) permit rotirea obiectului dup axele x i y.
La execuia programului se afia un ptrat a crui poziie n spaiul tridimensional poate fi
modificat folosind mouse-ul i tastatura.

12

Software Pentru Aparatura Medicala Laborator: Biblioteci Grafice

Execiii
1.1.
Studiul culorilor n OpenGL. Modificai culoarea de tergere (prin modificarea
argumentelor funciei glClearColor()) intr-o culoare neutra (gri) i culoarea ptratului desenat
(prin modificarea argumentelor funciei glColor3f()).
1.2.
Modurile de desenare a suprafeelor. Selectarea modului de desenare "plin" se specific
prin funcia glPolygonMode(GL_FRONT_AND_BACK, GL_FILL) care se poate introduce n
funcia de iniializare. Aceasta este setarea implicit a bibliotecii OpenGL. Dac se modific
argumentul GL_FILL n GL_LINE, suprafeele sunt desenate sub forma "cadru de srm"
(wireframe), iar la valoarea GL_POINT se deseneaz numai vrfurile suprafeelor.
De exemplu, la utilizarea GL_LINE
urmatoarea fereastra:

se

va

obtine

la

executia

programului

1.3.
Interpolarea culorilor la desenarea primitivelor geometrice. Pentru interpolarea culorilor
se specific cte o culoare diferit pentru fiecare vrf al primitivei. Pentru obiectul CUBE desenat,
exist deja acest mod de specificare. Pentru obiectul RECTANGLE, modificai funcia
DrawRectangle() astfel:
void DrawRectangle(){
glBegin(GL_POLYGON);
glColor3d(1.0, 0.0, 0.0);
glVertex3d(-1.0, 1.0, 0.0);
glColor3d(0.0, 1.0, 0.0);
glVertex3d( 1.0, 1.0, 0.0);
glColor3d(0.0, 0.0, 1.0);
glVertex3d( 1.0,-1.0, 0.0);
glColor3d(1.0, 1.0, 1.0);
glVertex3d(-1.0,-1.0, 0.0);
glEnd();
}

// rosu
// verde
// albastru
// alb

13

Software Pentru Aparatura Medicala Laborator: Biblioteci Grafice

Selectarea modului de desenare cu interpolarea culorilor se specific prin funcia


glShadeModel(GL_SMOOTH), care se poate introduce n funcia de iniializare. Aceasta este
setarea implicit a bibliotecii OpenGL. Dac se modific argumentul din GL_SMOOTH n GL_FLAT,
nu se mai efectueaz interpolarea culorilor. Ce culoare are patratul afisat in acest caz? Explicati!
Inversati primul varf (rosu) cu cel de-al doilea varf (verde) si explicati rezultatul vizualizat la rulare
atat in reprezentare GL_LINE cat si in reprezentare implicita (GL_FILL) in modul de reprezentare cu
interpolarea culorilor si fara interpolare.
1.4. nlocuii n funcia de afiare Display() funcia de desenare a ptratului
(DrawRectangle()) cu desenarea unei sfere (sau a altor obiecte GLUT) folosind funciile de
desenare corespunztoare :glutSolidSphere(1.0, 64, 64); glutSolidCone (1.0, 3.0,
64,
64);
glutSolidTorus
(0.275,
0.85,
64,
64);
glutSolidTeapot(1.0);)Vizualizati atat in reprezentare GL_FILL cat si in reprezentare
GL_LINE. Ce reprezinta argumentele de apel ale fiecarei functii de biblioteca apelate? In ce interval
pot varia valorile ultimelor 2 argumente in cazul sferei astfel incat sa se pastreze consistenta ei.
De
exemplu,
pentru
programului se va obtine:

functia

glutSolidTeapot(1.0);

14

la

executia

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