Sunteți pe pagina 1din 80

UNIVERSITATEA TITU MAIORESCU

FACULTATEA DE INFORMATICA

GRAFICA PE CALCULATOR
grafica pe calculator

Mironela Prnu

2015-2016

Acest material este destinat studentilor anului II, invatamant la distant,


specializarea Informatic.
Modul de prezentare are n vedere particularitile nvmntului la distan,
n care studiul individual este determinant. n timp ce profesorul sprijin
studentul prin coordonarea nvtrii si prin feedback periodic asupra
acumulrii cunostintelor si a deprinderilor, studentul alege locul, momentul si
ritmul pentru studiu, dispune de capacitatea de a studia independent si totodat
si asum responsabilitatea pentru initierea si continuarea procesului
educational.
Disciplina Grafica pe calculator utilizeaz noiunile predate la disciplinele
Bazele informaticii, Programare procedurala si alte discipline studiate n anul I
si anul II sem I.
O nentelegere a notiunilor fundamentale prezentate n acest curs poate genera
dificultti n asimilarea conceptelor complexe introduse n alte cursuri de
specialitate.

grafica pe calculator

Competene specifice disciplinei


1. Competene profesionale

Cunoasterea si utilizarea conceptelor si tehnicilor pentru proiectarea, elaborarea si


utilizarea programelor specifice pentru grafica pe calculator;
Intelegerea si asimilarea principalelor cunostinte privind modelarea, reprezentarea si
prelucrarea obiectelor 2D sau 3D in domeniul aplicatiilor software;
Programare de grafica C++, OpenGL, Java 2D, Unity Game Engine

2. Explicare i interpretare

Explicarea rolului i importantei mediului grafic


nelegerea functionarii functiilor si metodelor

3. Instrumental - aplicative

Corelarea cunotinelor teoretice cu abilitatea de a le aplica n practic


Posibilitatea de exemplificare a tehnologiilor utilizate in grafica pe calculator

grafica pe calculator

Nota final acordata fiecrui student, va conine


urmtoarele componente n procentele menionate:
- proba scrisa
- realizare referat

60%
40%

Fiecare student va realiza un referat de maxim 6 pagini,


despre unul din subiectele tratate in curs. De asemenea se
vor realiza minim 6 programe asemanatoare cu cele tratate
in suportul de curs. Toate functiile utilizate vor fi explicate
ca rol si parametrii.
Referatul si fisierele C si Java vor fi transmise cel mai
tarziu cu 2 zile inainte de proba de verificare, pe adresa de
email mironela.pirnau@prof.utm.ro.
grafica pe calculator

Continut
Unitatea de invatare 1 Unitatea de invatare 2 Unitatea de invatare 3 Unitatea de invatare 4 -

grafica pe calculator

Grafica pe calculator
Biblioteca grafic OpenGL
Java 2D
Unity Game Engine

Bibliografie
1

Pirnau,M. Grafica pe calculator, curs pentru invatamant la distanta, Editura


Renaissance, 2010, ISBN: 978-606-8321-54-7
2 G. Albeanu, Grafic pe calculator. Algoritmi fundamentali, Editura Univ.
Bucureti,2001.
1 Baciu, R., Programarea aplicaiilor grafice 3D cu OpenGL, Editura
Albastr, Cluj-Napoca, 2005.
2 Moldoveanu, F., Racovi, Z.,Hera, G., Petrescu, ., Zaharia, M.,
Grafica pe calculator, Editura Teora, Bucureti, 1996.
3 Ionescu, F., Grafica n realitatea virtual, Editura Tehnic, Bucureti
2000.
4 Hearn, Donald, Backer,M. Pauline, Computer Graphics, Prentice-Hall,
Inc, Englewood Cliffs, New Jersy, 1986
5 Foley,J., A.vanDame, Feiner, S.K., Hughes, J.F., Computer Graphics:
principles and practice, Addison Wesley Publishing Company, second
edition, 1993.
6 Neider, J., Davis, T., Woo, M., OpenGL Programming Guide, AddisonWesley, Menlo Park, 1993.
7 https://docs.oracle.com/javase/tutorial/2d/
8 https://docs.oracle.com/javase/tutorial/2d/basic2d/
9 https://docs.oracle.com/cd/E17802_01/j2se/javase/technologies/desk
top/java3d/forDevelopers/j3dguide/Intro.doc.html
10 http://docs.unity3d.com/Manual/index.html
11 http://www.opengl-tutorial.org/download/
12 http://learnopengl.com/
13 http://pixlr.com/editor/
14 Inkscape
grafica pe calculator

Alte referine bibliografice recomandate pe parcurs

Unitatea de invatare 1 - Grafica pe calculator


Grafica pe calculator reprezinta acele metode si tehnici de conversie a datelor catre si de la
un dispozitiv grafic prin intermediul calculatorului.
Aplicarea graficii pe calculator este folosita din urmtoarele domenii principale:
Vizualizarea informaiei
Proiectare
Modelare (simulare)
Interfa grafic pentru utilizatori GUI
n prezent cunoaterea elementelor de baz ale graficii pe calculator este necesar
inginerului,
omului de tiin,
artitilor plastici,
designerilor,
fotografilor,
pictorilor de animaie etc.
Datorit calculatorului putem avea la dispoziie n cteva fraciuni de secund variaii multiple
de culoare, forme, compoziii etc.
n baza tehnologiilor graficii computerizate s-au dezvoltat:
Interfaa de utilizator GUI (---inteligenta)
Proiectarea digital n arhitectur i grafica industrial
Efecte vizuale specializate, cinematografia digital
Grafica pe computer pentru filme, animaie, televiziune
Reeaua Internet --- SM
Conferinele video
Televiziunea digital
Proiecte multimedia, proiecte interactive
Fotografia digital i posibilitile avansate de prelucrare a fotografiei
Grafica i pictura digital (cu 2 laturi eseniale imitarea materialelor tradiionale i
noile instrumente de lucru digitale)
Vizualizarea datelor tiinifice i de afaceri
Jocuri pe calculator, sisteme de realitate virtual (de ex. simulatoare pentru aviaie)
Sisteme de proiectare automatizat
Tomografie computerizat
Poligrafia
Grafica laser
Grafica pe calculator este de asemenea i un domeniu de activitate tiinific
Grafica digital
OBSERVATIE: Grafica rastru i vector stau la baza graficii digitale.
Grafica digital este un domeniu al informaticii care acoper toate aspectele legate de
formarea imaginilor utiliznd un computer.
Termenul englez corespunztor este computer graphics.
Grafica digital mai este numit uneori grafic de computer, grafic de calculator, grafic pe
calculator, grafic computerizat.
Grafica digital este o activitate n care computerul este utilizat pentru sintetizarea i
elaborarea imaginilor, dar i pentru prelucrarea informaiei vizuale obinute din realitatea ce
ne nconjoar.
grafica pe calculator

Grafica digital se divizeaz n mai multe categorii:


Grafica bidimensional (se constituie din grafic raster i grafic vector)
Grafica Fractal
Grafica tridimensional (este des utilizat n animaie, spoturi publicitare, jocuri la
computer etc.)
CGI grafica (CGI n englez imagini, personaje generate de computer)
Grafica animat
Grafica video
Grafica web
Grafica Multimedia
Fractal Explorer este un generator de fractali care poate produce imagini frumoase,
misterioase
matematic
generate.
Fractal Explorer poate face seturi de fractali clasici, polinomial, (cum ar fi Mandelbrot, Julia,
Newton i variante ale lor). - Fractali compleci 4D (numii quaternions), atractori stranii
3D i IFS. De asemenea, FE are multe posibiliti pentru crearea de efecte speciale i de
mbuntire
a
imaginilor.

Termenul fractal provine din latinescul fractus, care nseamn "spart, "fracturat".
Acest termen a fost introdus de Benot Mandelbrot, n 1975.
Un fractal este un obiect matematic care are o structur detaliat la orice scar. n
structura unui fractal, fiecare parte este asemntoare cu fractalul ntreg (este autosimilar).
grafica pe calculator

Fractalii, aceste deosebite obiecte matematice, de o mare complexitate, sunt generai


printr-un procedeu matematic relativ simplu (metoda iteraiei).
Dimensiunea geometric a unui fractal se bazeaz pe dimensiunea Hausdorff, care este o
extensie a dimensiunii euclidiene. Dac n geometria euclidiana un obiect nu are dect o
dimensiune ntreag, n geometria fractal dimensiunile sunt, n general, numere reale
nentregi pozitive

n grafica digital se opereaz cu diverse elemente grafice, pentru elaborarea i controlul


imaginilor ca de exemplu: pixel, punct, linie, curb, poligon etc.
La baza graficii digitale (i n special grafica bidimensionala) stau doua tipuri de calculaii,
Raster (sau rastru) i Vector (vectorial).
Grafica rastru i vector stau la baza graficii digitale, ele sunt utilizate de programele 3
dimensionale, programe pentru montare video, animaie, etc.
Prezentarea la calculator a imaginii de tip Raster se face n baza segmentrii unei suprafee cu
ajutorul unor ptrele mici care se numesc pixeli. O imagine rastru este un tablou format din
mai multi pixeli. Cu ct mai muli pixeli avem n imagine cu att calitatea detaliilor e mai
nalt. Acest tip de grafic permite s cream i s reproducem oricare imagine cu multitudinea
de efecte i subtiliti, indiferent de complexitate. Imaginile procesate cu ajutorul scanerului
sau aparatelor foto snt formulate ca raster.
Neajunsurile e complicata redimensionarea graficii rastru, deoarece la interpolare
(adugare de pixeli n raport de cei existeni n imagine) computerul inventeaz
calculnd pixelii nu ntotdeauna satisfctor, cu toate c sunt diverse metode de
interpolare.
Grafica vectorial este un procedeu prin care imaginile sunt construite cu ajutorul
descrierilor matematice prin care se determin poziia, lungimea i direcia liniilor folosite n
desen. Grafica vectoriala e bazat ca principiu pe desen cu ajutorul liniilor calculate pe o
suprafaa. Liniile pot fi drepte sau curbe.
n cazul imaginilor vectoriale fiierul stocheaz liniile, formele i culorile care alctuiesc
imaginea, ca formule matematice. Imaginile Vector pot fi mrite i micorate fr a pierde
calitatea.
O imagine poate fi modificat prin manipularea obiectelor din care este alctuit, acestea fiind
salvate apoi ca variaii ale formulelor matematice specifice. Este des utilizata n imagini cu
funcii decorative, caractere-text, logotipuri, infograme, decor, cat i n proiecte sofisticate
3D, montare video, animaie, etc.
Exist sisteme sofisticate de control cromatic al imaginilor. Adaptarea valorilor
cromatice se aplic n funcie de necesitai i scopuri. Astfel, pentru controlul de culoare
la computere, exist mai multe modele cromatice (sau modele de culoare), care pot fi
folosite pentru definirea cromatic a imaginii, pentru selectarea culorilor n procesul
desenrii i crerii imaginii, pentru arhivare, etc.
n general exist dou tipuri majore de modele cromatice:
amestecul aditiv RGB (din englez de la Red-Green-Blue, rou-verde-albastru)
amestec de culori lumin se utilizeaz pentru ecran, monitor, televiziune,
scanare, aparate foto, design web, animaie i altele.
grafica pe calculator

amestec substractiv CMYK (de la CyanMagenta-Yellow-blacK) amestec de culori pigment se

utilizeaz pentru proiecte poligrafice destinate tiparului color.


Unele modele de culoare admit variaii ale diapazonului cromatic, din acest motiv sunt
mprite n diverse profiluri de culoare destinate diferitelor necesiti. De exemplu, pentru
modelul RGB exist mai multe profiluri. sRGB IEC61966-2.1 diapazon mediu utilizat mai
des pentru pagini web, sau Adobe RGB (1998) diapazon mai mare utilizat pentru
prelucrarea imaginilor destinate produselor pentru tipar.

Pe lng modelele cromatice RGB i CMYK mai exist i


altele precum: Lab, HSB / HSL / HSI, Culori Indexate, Culori
Pantone/PMS (Pantone Matching System), Culori Spot.
9

Desktop publishing, abreviat DTP, este o expresie englez din domeniul tipografiei i care sar putea traduce prin "publicare cu ajutorul calculatorului de tip desktop". Este procesul de
creare i editare (modificare) a unui document cu ajutorul unui computer avnd ca obiectiv
final tiprirea lui.
n acest domeniu exist programe de calculator specializate ce pot fi mprite n mai multe
categorii:
programe de creaie i prelucrare foto (Adobe Photoshop, Corel Photopaint);
programe de creaie i prelucrare de grafic vectorial (Adobe Illustrator, Corel
Draw,);
programe de paginare (Adobe InDesign, QuarkXPress, Adobe Pagemaker, Corel
Ventura);
programe utilitare (Adobe Acrobat Professional, Adobe Acrobat Distiller etc);
Cel mai utilizat program pentru realizarea documentelor ce urmeaz a fi tiprite este Corel
Draw. Are setri speciale pentru separaii, overprint
Monitoarele sunt aparatele ce decodific semnalul electric i genereaz culorile RGB (Red,
Green, Blue rou, verde, albastru) prin suprapunere de lumin. Cnd nu exist nici un fel de
lumin este generat culoarea neagr, cnd intensitatea prin cele trei canale este maxim, se
obine culoarea alb.
Teoretic s-ar putea tipri i folosind direct spaiul de culori RGB, ns datorit imperfeciunii
hrtiei, cernelii i a mainilor de tipar, se folosete spaiul CMYK (Cyan, Magenta, Yellow,
blacK), urmnd ca negrul, care se tiprete la sfrit de procedur, s acopere aceste
imperfeciuni.
La o lucrare pretenioas este indicat ca imaginile, textele i obiectele colorate s fie
combinate atent, mai ales cnd se lucreaz cu culori Pantone, pentru ca la sfrit s nu rezulte
amestecaturi nedorite de culoare.
Funcia de overprint este suprapunerea la tipar a dou culori diferite, culoarea de deasupra
(ultim) acoperind total culoarea de dedesubt (anterioar). Dac activm opiunea Overprint la
culoarea neagr, atunci cercul va putea rmne ntreg i nu va mai fi nevoie s fie mai nainte
decupat n locurile unde urmeaz a fi tiprit textul negru.
grafica pe calculator

Afiarea i crearea imaginilor vectoriale


Display-urile computerelor sunt alctuite din puncte minuscule numite pixeli. Imaginile
bitmap sunt de asemenea construite folosind aceste puncte. Cu ct sunt mai mici i mai
apropiate, cu att calitatea imaginii este mai ridicat, dar i mrimea fiierului necesar pentru
stocarea ei. Dac imaginea este afiat la o mrime mai mare dect cea la care a fost creat
10

iniial, devine granulat i neclar, deoarece pixelii din alctuirea imaginii nu mai corespund
cu pixelii de pe ecran.
Pentru a crea i modifica imagini vectoriale sunt folosite programe software de desen
vectorial. O imagine poate fi modificat prin manipularea obiectelor din care este alctuit,
acestea fiind salvate apoi ca variaii ale formulelor matematice specifice. Operatori
matematici din software pot fi folosii pentru a ntinde, rsuci, colora diferitele obiecte dintr-o
imagine. n sistemele moderne, aceti operatori sunt prezentai n mod intuitiv folosind
interfaa grafic a calculatorului.
Conversia din i n format raster
Vectorizarea imaginilor este util pentru eliminarea detaliilor nefolositoare dintr-o fotografie.
Conversia din format vectorial se face practic de fiecare dat cnd este afiat imaginea, astfel
nct procesul de l salva ca bitmap ntr-un fiier este destul de simplu.
Mult mai dificil este procesul invers, care implic aproximarea formelor i culorilor din
imaginea bitmap i crearea obiectelor cu proprietile corespunztoare. Numrul obiectelor
generate este direct proporional cu complexitatea imaginii. Cu toate acestea, mrimea
fiierului cu imaginea n format vectorial nu va depi de obicei pe cea a sursei bitmap.
Aplicaiile grafice avansate pot combina imagini din surse vectoriale i raster i pun la
dispoziie unelte pentru amndou, n cazurile n care unele pri ale proiectului pot fi obinute
de la o camer, iar altele desenate prin grafic vectorial.
Vectorizarea
Aceasta se refer la programe i tehnologii/servicii folosite pentru a converti imagini de tip
bitmap n imagini de tip vectorial. Exemple de utilizare:
n Proiectarea asistata pe calculator (CAD) schiele sunt scanate, vectorizate i
transformate n fiiere CAD printr-un process denumit sugestiv hrtie-CAD.
n GIS imaginile provenite de la satelii sunt vectorizate cu scopul de a obine hri.
n arta digitala i fotografie, imaginile sunt de obicei vectorizate folosind plugin-uri
pentru programe ca Adobe Photoshop sau Adobe Illustrator, dar vectorizarea se poate
face i manual. Imaginile pot fi vectorizate pentru o mai bun utilizare i
redimensionare, de obicei far diferene mari fa de original. Vectorizarea unei
fotografii i va schimba aspectul din fotografic n pictat sau desenat; fotografiile pot fi
transformate i n siluete. Un avantaj al vectorizrii este c rezultatul poate fi integrat
cu succes intr-un design precum un logo.
Dezavantaje i limitri
Principalul dezavantaj al imaginilor vectoriale este c, fiind alctuite din obiecte descrise cu
formule matemetice, att numrul acestor obiecte ct i complexitatea lor sunt limitate,
depinznd de biblioteca de formule matematice folosit de programul de desenare. De
exemplu, dispozitivele digitale, cum ar fi camerele foto sau scannerele, produc fiiere raster
care nu pot fi reprezentate fidel folosind imagini vectoriale. Chiar i n cazul n care se
reuete vectorizarea unei astfel de imagini, editarea acesteia la complexitatea original este
dificil.Un alt dezavantaj este c formatele n care sunt stocate imaginile vectoriale sunt foarte
complexe. Implementarea acestor formate pe dispozitive diferite este problematic din aceast
cauz. Conversia dintr-un format n altul este de asemenea dificil.
Aplicaii
Datorit flexibilitii n ceea ce privete rezoluia imaginilor vectoriale, acestea sunt folosite
intensiv pentru crearea materialelor ce trebuie imprimate la mrimi foarte diverse: acelai
fiier poate fi folosit pentru un card de vizit ct i pentru un panou publicitar, n ambele
cazuri.rezultatele fiind foarte clare i precise.
O alt aplicaie semnificativ a graficii vectoriale este n modelarea suprafeelor 3D, unde se
dorete o calitate ridicat a obiectelor.
GIS este acronimul provenit de la Geographic Information System (Sistem Informatic
Geografic - uneori tradus n forma SIG n limba romn). Acest sistem e utilizat pentru a
crea, stoca, a analiza i prelucra informaii distribuite spaial printr-un proces computerizat.
grafica pe calculator

11

Tehnologia GIS poate fi utilizat n diverse domenii tiinifice cum ar fi: managementul
resurselor, studii de impact asupra mediului, cartografie, planificarea rutelor.
Specific unui GIS este modul de organizare a informaiei gestionate. Exist dou tipuri de
informaie: una grafic care indic repartiia spaial a elementelor studiate i alta sub form
de baz de date pentru a stoca atributele asociate acestor elemente (de ex. pentru o osea
lungimea ei, limea, numrul benzilor, materialul de construcie etc.).
Informaia grafic poate fi de dou feluri: raster sau vectorial. Grafica raster este o
modalitate de reprezentare a imaginilor n aplicaii software sub forma de matrice de pixeli n
timp ce grafica vectorial este o metoda de reprezentare a imaginilor cu ajutorul unor
primitive geometrice (puncte, segmente, poligoane), caracterizate de ecuatii matematice.
Specific sistemelor GIS este asocierea unui sistem de coordonate geografic matricii de pixeli
(la imaginile raster) sau vectorilor - procedeul poarta numele de Georeferentiere. Astfel unui
obiect (reprezentat fie printr-o imagine, fie printr-un vector) i este asociat o poziie unic n
Sistemul Informatic corespunztoare poziiei geografice din lumea real.

Informaie tip raster - imagine satelitar - dintr-un sistem GIS


Datorit informaiilor asociate graficii, Sistemele Informatice Geografice beneficiaz de toate
oportunitile de interogare pe care le ofera sistemele moderne de baze de date i n plus pot
oferi uor analize orientate pe anumite zone geografice - aa numitele hri tematice.
Un exemplu comun de Sistem Informatic Geografic l reprezent Sistemele de Navigaie.
Harta rutier n form vectorial este georefereniat astfel nct Sistemul de Poziionare
Global (Global Positioning System - GPS) s poat indica poziia exact a autovehiculului.
Planificarea rutei este n fapt o hart tematic obinut n urma unei interogri spaiale
(cutarea distanei celei mai scurte ntre dou puncte) combinat cu o interogare a bazei de
date asociate drumurilor din hart astfel nct s fie respectate o serie de condiii (limitri de
vitez, gabarit, sensuri de circulaie, interdicii, etc.).
Datorit impactului pozitiv, sistemele software GIS s-au dezvoltat foarte mult. Exist pe pia
un numr foarte mare de produse, att ale dezvoltatorilor consacrai (ESRI, Intergraph,
Autodesk, MapInfo, etc.) dar i de tip Open source (Grass GIS, Quantum GIS, GVSIG,
OpenJump, etc.).
Adobe Photoshop este un software folosit pentru editarea imaginilor digitale pe calculator,
program produs i distribuit de compania american Adobe Systems i care se se adreseaz n
special profesionitilor domeniului.
Adobe Photoshop, aa cum este cunoscut astzi, este vrful de lance al gamei de produse
software pentru editare de imagini digitale, fotografii, grafic pentru tipar, video i Web de pe
pia. Photoshop este un program cu o interfa intuitiv i care permite o multitudine
extraordinar de modificri necesare n mod curent profesionitilor i nu numai: editri de
luminozitate i contrast, culoare, focalizare, aplicare de efecte pe imagine sau pe zone
(selecii), retuare de imagini degradate, numr arbitrar de canale de culoare, suport de canale
de culoare pe 8, 16 sau 32 bii, efecte third-party etc. Exist situaii specifice pentru un
profesionist n domeniu cnd alte pachete duc la rezultate mai rapide, ns pentru prelucrri
generale de imagine, ntruct furnizeaz instrumente solide, la standard industrial, Photoshop
este efectiv indispensabil.
grafica pe calculator

12

Alturi de aplicaia Photoshop (ajuns la versiunea CS5), este inclus i aplicaia ImageReady,
cu un impresionant set de instrumente Web pentru optimizarea i previzualizarea imaginilor
(dinamice sau statice), prelucrarea pachetelor de imagini cu ajutorul sistemului droplets-uri
(mini-programe de tip drag and drop) i realizarea imaginilor rollover (imagini ce i schimb
aspectul la trecerea cu mouse-ul peste), precum i pentru realizarea de GIF-uri animate.
Avantaje
Principalele elemente prin care Photshop se difereniaz de aplicaiile concurente i prin care
stabilete noi standarde n industria prelucrrii de imagini digitale sunt:
Seleciile
Straturile (Layers)
Mtile (Masks)
Canalele (Channels)
Retuarea
Optimizarea imaginilor pentru Web
Formate fiiere
Photoshop poate citi majoritatea fiierelor raster i vector. De asemenea, are o serie de
formate proprii:
PSD (abreviere pentru Photoshop Document). Acest format conine o imagine ca un
set de straturi (Layers), incluznd text, mti (mask), informaii despre opacitate,
moduri de combinare (blend mode), canale de culoare, canale alfa (alpha), ci de
tiere (clipping path), setri duotone precum i alte elemente specifice Photoshop.
Acesta este un format popular i des rspndit n rndul profesionitilor, astfel c este
compatibil i cu unele aplicaii concurente Photoshop.
PSB (denumit Large Document Format) este o versiune mai nou a formatului PSD,
conceput special pentru fiiere mai mari (2GB) sau cu o informaie prezent pe o
suprafa definit de laturi mai mari de 30.000 de pixeli (suport pn la
300.000x300.000 pixeli).
PDD este un format mai puin ntlnit, fiind asociat iniial aplicaiei Adobe
PhotoDeluxe, astzi (dup 2002) compatibil doar cu aplicaiile Adobe Photoshop sau
Adobe Photoshop Elements.
Ultimele instrumente
Camera RAW: Instrumentul ofer acces rapid i facil la imaginile tip RAW produse
de majoritatea camerelor foto digitale profesionale i de mijloc. Camera RAW se
folosete de toate detaliile acestor fiiere pentru a obine un control total asupra
aspectului imaginii, fr a modifica fiierul n sine.
Adobe Bridge: Un browser complex, de ultim generaie, ce simplific gestionarea
fiierelor, poate procesa mai multe fiiere de tip RAW n acelai timp i pune la
dispoziia utilizatorului informaia metadata de tip EXIF etc.
Multitasking: Adobe introduce posibilitatea de a folosi toate aplicaiile sale din suita
"Creative suite 2" n sistem multitasking.
Suport High Dynamic Range (HDR) pe 32 bii: Creeaz i editeaz imagini pe 32
bii, sau combin cadre fotografice de expuneri diferite ntr-una ce include valorile
ideale de la cele mai intense umbre pn la cele mai puternice zone de lumin.
Shadow/Highlight: mbuntete contrastul fotografiilor subexpuse sau supraexpuse,
inclusiv imagini CMYK, pstrnd n continuare echilibrul vizual al imaginii.
Vanishing Point: Ofer posibilitatea de a clona, picta sau lipi elemente ce automat se
transpun n perspectiva obiectelor din imagine.
Image Warp: Capacitatea de a deforma imaginile plane dup o matrice uor editabil,
folosind mouse-ul.
Corectarea deformrilor cauzate de lentile: Lens Distort corecteaz cu uurin
efectele obinuite date de lentilele aparatelor foto precum cele cilindrice, sferice, tip
plnie, "efectul de vignet" (funcie de poziionarea fa de lumin, colurile
grafica pe calculator

13

fotografiilor sunt fie ntunecate, fie luminate n contrast cu restul fotografiei) sau
aberaiile cromatice.
Personalizarea aplicaiei:Posibilitatea de a personaliza orice scurttur sau chiar
funciile din meniul aplicaiei i posibilitatea de a salva modificrile pentru fiecare
mod de lucru n parte.
Control mbuntit al straturilor (layers): capacitatea de a selecta mai multe
straturi n acelai timp.
Smart objects: abilitatea de a deforma, redeforma i a reveni la starea iniial a
obiectelor fr a pierde din calitate.
Aplicaiile grafice se realizeaz prin utilizarea urmtoarelor clase de produse software:
editoare grafice, biblioteci grafice, programe grafice specializate, desktop publishing,
worksheet graphics (birotic).
Editoarele grafice sunt destinate prelucrrii grafice in domeniul proiectrii asistate de
calculator dintre produsele care nglobeaz editoare grafice amintim: Auto Cad, Freelanec 2
Plus, Windows Paint, Corel Draw.
Bibliotecile grafice sunt destinate prelucrrilor prin intermediul limbajelor de programare de
nivel nalt (C, Visual C, Visual Basic, Delphi, Open GL etc...). Acestea conin biblioteci cu
rutine (primitive) grafice care realizeaz funcii grafice necesare aplicaii grafice.
Programe grafice specializate sunt destinate rezolvrii problemelor din anumite domenii,
oferind utilizatorului s enune probleme ct mai simplu i n concordan cu limbajul utilizat
n domeniul su. De exemplu: Matlab, Mathematica, Mathcad.
Desktop publishing sunt produse software destinate realizrii de publicatii (ziare, reviste,
reclame, etc.) la birou, parcurgnd toate etapele dintr-o tipografie clasic. De exemplu: Xerox
Ventura Publisher care este compatibil cu mai multe procesoare de text si cu unele editoare
grafice, Pagemaker, Xpress, Super Paint, Publish IT, etc.
grafica pe calculator

O interfata API este un cod sursa oferit de catre sistemul de operare sau o librarie
pentru a permite apeluri la serviciile care pot fi generate din API-uri respective de catre
un program.
Termenul API este folosit in 2 sensuri:
- O interfata coerenta care consta din clase sau seturi de functii sau proceduri
interconectate.
- Un singur punct de intrare, cum ar fi o metoda, o functie sau o procedura.
Doua Interfete API foarte cunoscute sunt Single UNIX Specification si Microsoft
Windows API.
Interfete API sunt deseori incorporate in Software Development Kit (SDK)
Modelul de design a Interfetelor API
Exista o multime de modele de design a Interfetelor API. Cele prevazute
pentru executie rapida deseori consta din functii, proceduri, variabile si structuri de
date. Exista si alte modele cum ar fi interpretatori (emulatori) care evalueaza expresii in
ECMAScript (cunoscut sub nume JavaScript) sau alt layer abstract, oferind
programatorului posibilitatea de a evita implicarea in relatiile functiilor cu nivelul
inferior al abstractiei.
Unele Interfete API, cum sunt cele standard pentru un sistem de operare, sunt
14

implementate ca librarii de cod separate care sunt distribuite impreuna cu sistemul de


operare. Altele au integrata functionalitatea interfetei API direct in aplicatie. Microsoft
Windows API este distribuita cu sistemul de operare. Interfetele API pentru sisteme
embedded, cum sunt console de jocuri video, in general intra in categoria API-urilor
integrate direct in aplicatie.
O interfata API care nu necesita drepturi mari de acces sunt numite "open" (OpenGL
ar fi un exemplu).
Cateva exemple de Interfete API:
-

Single UNIX Specification (SUS)

Microsoft Win32 API

Java Platform, Enterprise Edition API's

OpenGL cross-platform API

DirectX for Microsoft Windows

Google Maps API

Wikipedia API
grafica pe calculator

Simple DirectMedia Layer (SDL)

svgalib pentru Linux si FreeBSD

Carbon si Cocoa pentru Macintosh OS

Microsoft Windows API's


Windows API, neoficial WinAPI, este numele dat de catre Microsoft pentru un set de
Interfete API disponibile in sisteme de operare Microsoft Windows. Aceste interfete au
fost construite pentru a fi folosite de catre programatori C/C++ si sunt cel mai direct
mod de a interactiona cu sistemul Windows pentru aplicatii software. Accesul la nivel
inferior la sistemul Windows, in general necesar pentru drivere, este oferit de catre
Windows Driver Foundation in versiunea curenta a Windows-ului.
In sisteme de operare Windows este disponibil un Software Development Kit (SDK),
care ofera documentatia si unelte pentru a permite dezvoltatorilor crearea aplicatiilor
folosind Interfete API si tehnologii Windows asociate.

Compilatoare suportate
Pentru a dezvolta software care foloseste Interfetele API Windows, este nevoie de
compilator care poate importa si manipula fisierele DLL si obiectele COM caracteristice
Microsoft-ului. Compilatorul trebuie sa accepte dialectul limbajelor C sau C++ si sa
manipuleze IDL (interface definition language) fisiere si fisiere header care expun
15

denumirile functiilor interioare ale Interfetelor API. Aceste compilatoare, unelte, librarii
si fisiere header sunt impreunate in Microsoft Platform SDK (Software Development
Kit). Pentru mult timp familia de compilatoare si unelte Microsoft Visual Studio si
compilatoare Borland, au fost singurele care puteau la cerintele sus mentionate. Acuma
exista MinGW si Cygwin care ofera interfete bazate pe GNU Compiler Collection. LCCWin32 este disponibil pentru utilizare non-comerciala, continand compilator C si
intretinut de catre Jacob Navia. Pelles C este compilator C gratuit oferit de catre Pelle
Orinius.
Microsoft DirectX
Microsoft DirectX este o colectie de Interfete API folosita pentru manipularea
taskurilor legate de multimedia, in special programarea jocurilor si video, pe platforme
Microsoft.
DirectX este de asemenea folosit si de alti producatori software, in mare parte in sectorul
de inginerie, din cauza abilitatii de redare rapida a obiectelor 3D de inalta calitate.
Atat DirectX runtime cat si software development kit (kitul de dezvoltare soft) sunt
disponibilie gratuit, dar sunt proprietate Microsoft si sunt closed-source (fara
posibilitate de schimbare, rescriere, suprascriere). DirectX a fost initial redistribuit de
catre dezvoltatori de jocuri impreuna cu kiturile de instalare, dar in ultim timp DirectX
a fost inclus in kit de instalare a sistemului de operare (sau in Service Packs). Unii
dezvoltatori de jocuri inca mai includ DirectX in kitul de instalare si ofera posibilitate de
a-l instala (sau de a face update) dupa instalarea jocului.
grafica pe calculator

Cel mai recente versiuni ale DirectX-ului sunt DirectX 10 si DirectX 9.0L, disponibile
exclusiv pentru Windows Vista (motivul fiind, dupa cum sustine Microsoft, faptul ca
exista schimbari in arhitectura grafica a Windowsului si din cauza introducerii
Windows Display Driver Model).
Interfetele API din DirectX
Majoritatea Interfetelor API din DirectX sunt in forma de obiecte COM.
Componentele care le contine DirectX sunt:
DirectX Graphics, alcatuit din doua Interfete API (DirectX 8.0 sau mai mult):
1. DirectDraw: pentru generarea de obiecte grafice 2D (acum dezaprobat, desi
este inca folosit de multi programatori)
2. Direct3D (D3D): pentru generarea obiectelor grafice in 3D

DirectInput pentru tastaura, mouse, joustick sau alte controlere pentru jocuri (nu mai
este folosit decat pentru Xinput, in controlere la Xbox 360)
DirectPlay pentru comunicare jocurilor in retea (Impreuna cu DirectInput a fost folosit
ultima data in DirectX 8. Acuma este dezaprobat)
16

DirectSound pentru redarea sunetului si inregistrarea sunetului in forma wave


DirectMusic pentru redarea sunetelor autorizate de catre DirectMusic Producer
DirectX Media contine DirectAnimation pentru animatii web 2D, DirectShow pentru
redare multimedia, DirectX Transform pentru interactionare web si Direct3D Retained
Mode pentru obiecte grafice 3D de nivel inalt. DirectShow mai contine DirectX Plugins
pentru procesarea semnalului audio si DirectX Video Acceseration pentru a accelera
redarea video.
DirectX Media Objects suport pentru pentru obiecte cu streamuri cum sunt encodere,
decodere si efecte.
DirectSetup pentru instalarea componentelor DirectX (care de fapt nu prea este API)
Inainte de existenta DirectX-ului, Microsoft avea deja inclus setul de API-uri OpenGL
pe platformele Windows NT. In acel timp OpenGL necesita hardware de inalta
performanta si era limitat pe inginerie si utilizatori CAD. Direct3D (introdus de
persoane care au dezvoltat DirectX ca o alternativa pentru OpenGL) urma sa fie o
concurenta pentru (atunci) mai costisitor (din punct de vedere hardware) OpenGL
pentru dezvoltarea jocurilor. Cu timpul, dupa ce puterea placilor video au crescut,
OpenGL a devenit standard si conducatorul pietei. In acel punct a inceput "batalia"
intre adepti ai cross-platform OpenGL si Windows-only Direct3D, care dupa cum multi
sustineau era inca un exemplu de adoptare, extindere si eliminare (embrace, extend and
extinguish) de la Microsoft. Alte Interfete API din DirectX sunt deseori combinate cu
OpenGL in crearea jocurilor video datorita faptului ca OpenGL nu include toate
functionalitatile care le are DirectX (cum ar fi suport pentru sunet sau joystick). Totusi,
combinatia intre OpenGL si OpenAL (Open Audio Library) pentru acest scop a devenit
populara.
grafica pe calculator

DirectX este folosit ca si baza pentru Interfetele API de la console Xbox si Xbox 360,
oferite de catre Microsoft. Interfetele API au fost dezvoltate de catre Microsoft si
NVIDIA (care a dezvoltat hardware folosit de consola). Intefetele API din Xbox sunt
similare cu cele din DirectX 8.1, dar fara posibilitate de update. Xbox a fost numit
DirectXbox, dar numele a fost prescurtat pentru motive comerciale.
Compatibilitate
Producatori hardware sunt nevoiti sa scrie drivere si sa testeze fiecare bucata aparte,
pentru a le face compatibile cu DirectX. Unele dispozitive hardware au doar drivere
compatibile cu DirectX (ceea ce inseamna ca utilizatorul trebuie sa instaleze DirectX
pentru a folosi acele dispozitive). Versiunile mai vechi de DirectX includeau si o librarie
care continea toate driverele cunoscute si disponibile la momentul lansarii versiunii
respective. La aceasta practica s-a renuntat in favoarea sistemului de reactualizare,
bazat pe web, Windows Update care permite utilizatorilor sa descarce doar drivere
relevante pentru dispozitivul lor.
Inainte de DirectX 10, DirectX era considerat ca fiind compatibil cu versiuni precedente
(versiunile noi erau compatibile cu cele vechi). Asta este consecinta pozitiva a modelului
COM folosit pentru API-ul DirectX.
Cu Windows Vista si Direct3D 10 cu schimbari radicale, compatibilitate nu mai este
17

posibila. Din acest motiv DirectX 10 ofera Interfata API Direct3D 9, astfel incat sa fie
posibila rularea jocurilor si aplicatiilor mai vechi.
DirectX 10 si 9.0L
Windows Vista este lansata cu DirectX 10 (si 9.0L pentru compatibilitate cu versiuni
mai vechi) si este singurul sistem de operare din familia Windows care il contine.
Schimbari radicale au fost facute: DirectInput este defavorizat si inlocuit cu Xinput, din
Xbox. De asemenea, DirectSound este defavorizat si inlocuit cu XACT. DirectX 10 a
renuntat la suport pentru accelerarea dispozitivelor audio, iar sunetul este redat in
softearul pe CPU. DirectPlay este defavorizat si inlocuit cu Games for Windows - LIVE,
in timp ce DirectShow este defavorizat si inlocuit cu Media Foundation, un set diferit de
Interfete API lansate impreuna cu Windows Vista, pentru manipularea de secvente
audio si video. DirectMusic va fi probabil singurul ramas intact.
Direct3D
O proprietate noua majora in DirectX 10 este Direct3D (initial numit Windows
Graphics Foundation). Folosind noul Windows Display Driver Model, Shader Model 4.0
si noile, mai stricte, cerinte pentru producatori de GPU (Graphical Processing Unit) care
trebuie satisfacute pentru a sustine compatibilitate cu Direct3D, versiunea 10 de
Direct3D reprezinta indepartarea de la practicile versiunilor mai vechi. Pentru a oferi
compatibilitate cu versiunile precedente de Direct3D, DirectX 10 contine de fapt trei
versiuni de Direct3D:
grafica pe calculator

- Direct3D 9: aceasta Interfata API emuleaza comportamentele ale Direct3D 9 pe


Windows XP pentru a oferi compatibilitate cu aplicatii mai vechi. Toate detaliile si
avantajele ale Windows Display Driver Model (WDDM) din Vista, sunt ascunse de
aplicatie (in caz ca WDDM drivere sunt instalate). Aceasta este singura Interfata API
disponibila in caz ca exista doar drivere grafice XP.
- Direct3D 9Ex (initial numit 9.0L): permite acces total la noile capabilitati ale WDDM,
in timp ce pastreaza compatibilitate pentru aplicatii Direct3D existente folosind o
interfata API separata. Efectul de transparenta ("glass effect") din Windows Aero se
bazeaza pe codul din Direct3D 0Ex. Cand 9Ex era inca sub numele de cod 9.0L, existau
zvonuri ca acesta va fi Direct3D 10 pentru Windows XP. Pana la urma s-a demonstrat ca
nu este asa, in mare parte din cauza incompatibilitati al WDDM pe Windows XP.
- Direct3D 10: Temporar, singurul GPU compatibil cu Direct3D este NVIDIA GeForce 8
Series, care de fapt profita foarte putin de capabilitatile ale Direct3D 10.
Alternative
Exista alternative pentru aceasta arhitectura, unele mai complete decat altele.
Nu exista o solutie unica care sa ofere toate functionalitatile care le ofera DirectX, dar
prin combinare de librarii - OpenGL, OpenAL, SDL, OpenML, FMOD, etc utilizatorul pote sa implementeze o solutie comparabila cu DirectX si in aceasi timp
gratuita si cross-platform (poate fi folosite pe diferite platforme).

18

Unitatea de invatare 2 - Biblioteca grafic OpenGL


Biblioteca grafic OpenGL
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.
Desi 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. 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. Funiile OpenGL sunt apelabile din limbajele Ada, C,
C++ i Java.
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.
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.
grafica pe calculator

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.
19

Instalare: se pun glut32.dll si glut.dll in c:\windows\system32 si c:\windows\; folder-ul


GLUTMingw32 se pune in c:\, iar cand se lanseaza un nou proiect openGl se va alege
calea cu librarii GLUTMingw32 de pe c:

Daca folosim CodeBlocks atunci realizam un proiect de tip GLUT project si selectam apoi
locatie unde am pus libratia GLUTMingw32 (ca in figurele de mai jos).

grafica pe calculator

20

grafica pe calculator

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.
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
void glutInit(int* argc, char** argv);
21

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.
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 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.
a. 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.
Atentie:
Funcia Display (a aplicaiei) este apelat oridecte ori este necesar desenarea ferestrei: la
iniializare, la modificarea dimensiunilor ferestrei.
glutReshapeFunc(void(*Reshape)(int w, int h));
nregistreaz funcia callback Reshape care este apelat ori de cte 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 si 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.
Exemplu:
grafica pe calculator

22

void mouse(int buton, int stare, int x, int y)


{
switch(buton)
{
case GLUT_LEFT_BUTTON:
if(stare == GLUT_DOWN)
glutIdleFunc(animatieDisplay);
break;
case GLUT_RIGHT_BUTTON:
if(stare== GLUT_DOWN)
glutIdleFunc(NULL);
break;
}
}
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.
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);
grafica pe calculator

Programele GLUT au un mod specific de organizare, care provine din felul n care
sunt definite i apelate funciile callback.
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 width i heigth specific limea,
respectiv nlimea, porii de afiare, dat ca numr de pixeli.
Exemplu: glViewport (0, 0, (GLsizei) w, (GLsizei) h);
23

ATENTIE: transformarea ferestr-poart este component a transformrii din sistemul


de referin normalizat n sistemul de referin ecran 3D
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 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.
Atentie:
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. Atentie: 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.
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.
grafica pe calculator

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
24

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.
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 - OpenGL Reference Manual
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 variabile de stare, culoarea curent i normala curent, care denumirile
definite n gl.h:
#define GL_CURRENT_COLOR
0x0B00
#define GL_CURRENT_NORMAL
0x0B02
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);
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.
grafica pe calculator

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).
se obin cele patru componente ale culorii curente (red, green, blue, alpha) n vectorul color.
GLfloat color[4];
glGetFloatv(GL_CURRENT_COLOR, 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);
25

void glVertex3f(GLfloat x, GLfloat y, GLfloat z);


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 (v0, v1, v2,.vn1) 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);
Exista mai multe tipuri de primitive pe care le putem desena folosind OpenGL.
Tipurile de primitive geometrice
Argument
GL_POINTS
GL_LINES

Primitiv geometric
Deseneaz n puncte
Deseneaz segmentele de dreapt izolate (v 0,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, (v 0,v1,vn1).
Dac poligonul nu este convex, rezultatul este
impredictibil.
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
grafica pe calculator

26

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 printrun numr n de bii (nu neaprat acelai numr de bii pentru fiecare component). Deci
componentele culorilor pixelilor memorate n bufferul de imagine sunt numere ntreg n
intervalul (0 , 2n 1), care se obin prin conversia numerelor n virgul mobil prin care sunt
reprezentate i prelucrate culorile primitivelor geometrice, ale materialelor, etc.
grafica pe calculator

27

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();
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).
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 nceput, se consider o matrice
curent oarecare C stabilit n OpenGL. 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);
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():
grafica pe calculator

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,
28

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 M2 = T(0,8,0) S(2,2,2):
glTranslated(0,-8,0);
glScaled(2,2,2);
Transformarea M3 = T(8,0,0)RZ(/4)S(2,1,2):
glTranslated(8,0,0);
glRotated(45,0,0,1);
glScaled(2,1,2);
Transformarea M4 = T(8,0,0)RZ(/4)S(2,1,2):
glTranslated(-8,0,0);
glRotated(-45,0,0,1);
glScaled(2,1,2);
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().
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:
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
grafica pe calculator

29

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:
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();
Se creez n stiva curent matricea de transformare de observare
MV = RZ(gama)T(xv, yv, zv):
glRotated(-gama, 0,0,1);
glTranslated(-xv,-zv,-zv);
Primul obiect are matricea de instaniere MI1 = I, deci matricea curent (care
conine matricea de vizualizare) se aplic coordonatelor vrfurilor cubului din
sistemul de referin de modelare. Funcia Cube() transmite aceste vrfuri ctre
OpenGL:
Cube();
Dac s-ar construi n acest moment matricea de transformare pentru obiectul al doilea,
prin multiplicarea matricei curente cu matricele componente de instaniere din M2 = T(0,8,0)
S(2,2,2), atunci matricea de observare, s-ar pierde i pentru urmtorul obiect ar trebui
calculat din nou.
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.
grafica pe calculator

30

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
grafica pe calculator

31

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);
grafica pe calculator

32

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.
exemplu folosind textura
#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,
grafica pe calculator

33

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();
grafica pe calculator

34

}
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;
}

grafica pe calculator

35

Exemple OpenGl
Exemplu 1

Exemplu 2

grafica pe calculator

36

Exemplu 3

Exemplu 4

grafica pe calculator

37

Exemplu 5

grafica pe calculator

Exemplu 6

38

Exemplu 7

Exemplu 8
grafica pe calculator

39

Exemplu 9

Exemplu 10
grafica pe calculator

40

Exemplu 11

grafica pe calculator

41

Exemplu 12

Exemplu 13
grafica pe calculator

42

Exemplu 14

Exemplu 15
grafica pe calculator

43

Exemplu 16

grafica pe calculator

Exemplu 17

44

Exemplu 18

Exemplu 19

grafica pe calculator

45

Exemplu 20

grafica pe calculator

46

Exemplu 21

grafica pe calculator

47

Exemplu 22

Exemplu 23
grafica pe calculator

48

Exemplu 24

grafica pe calculator

49

Exemplu 25

Exemplu 26

grafica pe calculator

50

Exemplu 27

Exemplu 28
grafica pe calculator

51

Exemplu 29

grafica pe calculator

Exemplu 30

52

Exemplu 31

grafica pe calculator

53

Exemplu 32

grafica pe calculator

Drawing Circles with OpenGL


void drawCircle( float Radius, int numPoints )
{
glBegin( GL_LINE_STRIP );
for( int i=0; i<numPoints; i++ )
{
float Angle = i * (2.0*PI/numPoints); // use 360 instead of 2.0*PI if
float X = cos( Angle )*Radius; // you use d_cos and d_sin
float Y = sin( Angle )*Radius;
glVertex2f( X, Y );
}
glEnd();
}

54

Exemplu 33

grafica pe calculator

55

Exemplu 34

grafica pe calculator

56

Exemplu 35

grafica pe calculator

57

exemplu 36
#include <GL/glut.h> //header OpenGL ce include gl.h si glu.h
void init()//functia initiere
{
// glClearColor (0.0, 0.0, 0.0, 0.0);//stabileste culoarea de sters
// glShadeModel (GL_FLAT);
}
void display()//functia de desenare si afisare
{
glClear (GL_COLOR_BUFFER_BIT);//sterge urmele de desene din fereastra curenta
glBegin(GL_POLYGON);//initializare desen poligon
glColor3f (2.0, 0.0, 0.0);//culoarea de desenare
glVertex2f(200.0,200.0);//stabilire coordonate triunghi
glVertex2f(400.0,200.0);//stabilire coordonate triunghi
glVertex2f(400.0,400.0);//stabilire coordonate triunghi
glEnd();//sfisit desenare
glFlush ();//executare functie
glColor3f (1.0, 1.0, 0.0);//culoarea de desenare
glBegin(GL_POLYGON);//initializare desen poligon
glVertex2f(200.0,400.0);//stabilire coordonate triunghi
glVertex2f(400.0,400.0);//stabilire coordonate triunghi
glVertex2f(200.0,200.0);//stabilire coordonate triunghi
glEnd();//sfisit desenare
glFlush ();//executare functie
glColor3f (0.0, 1.0, 1.0);//culoarea de desenare
glBegin(GL_POLYGON);//initializare desen poligon
glVertex2f(000.0,000.0); //stabilire coordonate triunghi
glVertex2f(200.0,200.0);//stabilire coordonate triunghi
glVertex2f(000.0,200.0);//stabilire coordonate triunghi
glEnd();//sfisit desenare
glFlush ();//executare functie
glColor3f (1.0, 0.5, 1.0);//culoarea de desenare
glBegin(GL_POLYGON);//initializare desen poligon
glVertex2f(000.0,000.0); //stabilire coordonate triunghi
glVertex2f(200.0,200.0);//stabilire coordonate triunghi
glVertex2f(000.0,200.0);//stabilire coordonate triunghi
glEnd();//sfisit desenare
glFlush ();//executare functie
glColor3f (1.0, 1.0, 0.5);//culoarea de desenare
glBegin(GL_POLYGON);//initializare desen poligon
glVertex2f(600.0,000.0); //stabilire coordonate triunghi
glVertex2f(600.0,200.0);//stabilire coordonate triunghi
glVertex2f(400.0,200.0);//stabilire coordonate triunghi
glEnd();//sfisit desenare
glFlush ();//executare functie
glColor3f (0.0, 1.0, 0.0);//culoarea de desenare
glBegin(GL_POLYGON);//initializare desen poligon
glVertex2f(200.0,400.0);//stabilire coordonate triunghi
glVertex2f(000.0,400.0);//stabilire coordonate triunghi
glVertex2f(200.0,600.0);//stabilire coordonate triunghi
glEnd();//sfisit desenare
glFlush ();//executare functie
grafica pe calculator

58

glColor3f (0.0, 1.0, 1.0);//culoarea de desenare


glBegin(GL_POLYGON);//initializare desen poligon
glVertex2f(400.0,400.0); //stabilire coordonate triunghi
glVertex2f(600.0,400.0);//stabilire coordonate triunghi
glVertex2f(600.0,600.0);//stabilire coordonate triunghi
glEnd();//sfisit desenare
glFlush ();//executare functie
glColor3f (3.0, 0.0, 0.0);//culoarea de desenare
glBegin(GL_POLYGON);//initializare desen poligon
glVertex2f(400.0,600.0); //stabilire coordonate triunghi
glVertex2f(400.0,400.0);//stabilire coordonate triunghi
glVertex2f(600.0,600.0);//stabilire coordonate triunghi
glEnd();//sfisit desenare
glFlush ();//executare functie
} void reshape (int w, int h)//functia redesenare
{
glViewport (0, 0, (GLsizei) w, (GLsizei) h);//stabilirea viewportului la dimensiunea
ferestrei
glMatrixMode (GL_PROJECTION);//specificare matrice modificabila la valoare
argumentului de modificare
glLoadIdentity ();//initializarea sistemului de coordonate
gluOrtho2D (0.0, (GLdouble) w, 0.0, (GLdouble) h);//stabileste volumul de vedere folosind
o proiectie ortografica
}
int main(int argc, char** argv) //creare fereastra {
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);//se specifica modelul de culoare al
ferestrei: un singur buffer si culoare RGB
glutInitWindowSize (600, 600);//initiaza dimensiunea ferestrei principale 600x600 pixeli
glutInitWindowPosition (200,10);//initiaza in fereastra principala fereastra de afisare
glutCreateWindow ("TRIUNGHIURI");
init ();
glutDisplayFunc(display);//se reimprospateza continutul ferestrei
glutReshapeFunc(reshape);//functia redesenare
glutMainLoop();//bucla de procesare a evenimentelor
return 0; }
exemplu 38
#include <GL/glut.h>
#include <stdlib.h> #include <math.h>
void init() {
// Stabileste culoarea cu care se va curata interiorul ferestrei, prin parametrii dati
stabilindu-se
// componenetele culorii ce au valori reale de la 0.0 la 1.0 (cu pasi aproximativi de
0.00006).
glClearColor (0.0, 0.0, 0.0, 0.0);
// select flat or smooth shading.
glShadeModel (GL_FLAT);
} void display() {
// Sterge eventualele desene din fereastra curenta
glClear (GL_COLOR_BUFFER_BIT);
// stabileste culoarea (RGB)
glColor3f (1.0, 0.0, 0.0);
// Specifies the primitive or primitives that will be created from vertices
grafica pe calculator

59

presented between
// glBegin and the subsequent glEnd. Ten symbolic constants are accepted:
GL_POINTS, GL_LINES,
// GL_LINE_STRIP, GL_LINE_LOOP, GL_TRIANGLES, GL_TRIANGLE_STRIP,
GL_TRIANGLE_FAN, GL_QUADS,
// GL_QUAD_STRIP, and GL_POLYGON.
glBegin(GL_POLYGON);
// specify a vertex (x, y coord)
glVertex2f(200.0,200.0);
glVertex2f(400.0,200.0);
glVertex2f(400.0, 400.0);
// glBegin and glEnd delimit the vertices that define a primitive or a group of like
primitives.
// glBegin accepts a single argument that specifies in which of ten ways the vertices
are interpreted.
glEnd();
// force execution of GL commands in finite time
glFlush();
// dreptunghi jos
glColor3f (0.0, 1.0, 0.0);
glBegin(GL_POLYGON);
glVertex2f(0.0,0.0);
glVertex2f(50.0,0.0);
glVertex2f(50.0, 60.0);
glVertex2f(0.0, 60.0);
glEnd();
glFlush();
// patrat sus
glColor3f (0.0, 0.0, 1.0);
glBegin(GL_POLYGON);
glVertex2f(0.0,500.0);
glVertex2f(100.0,500.0);
glVertex2f(100.0, 600.0);
glVertex2f(0.0, 600.0);
glEnd();
glFlush();
// cerc in jurul triunghiului
glColor3f (1, 1, 0); glPointSize(10.0);
glBegin(GL_POINTS);
glVertex2f(300, 300); // un punct in centru
for (int i=0; i<360; ++i) {
// 141 = raza cercului + 1 pixel
glVertex2f(300 + sin(i) * 141, 300 + cos(i) * 141);
}
glEnd();
glFlush();
}
void reshape (int w, int h) {
// Stabilirea viewportului la dimensiunea ferestrei
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
// specify which matrix is the current matrix
glMatrixMode (GL_PROJECTION);
grafica pe calculator

60

// replace the current matrix with the identity matrix


glLoadIdentity ();
gluOrtho2D (0.0, (GLdouble) w, 0.0, (GLdouble) h);
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
// seteaza dimensiunea ferestrei
glutInitWindowSize (600, 600);
// seteaza pozitia initiala
glutInitWindowPosition (100,100);
glutCreateWindow ("TESTE");
init ();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}

grafica pe calculator

61

Unitatea de invatare 3 - Java 2D


https://docs.oracle.com/javase/tutorial/2d/geometry/index.html
Java 2D
API ofera posibilitatea de a desena figuri geometrice si completarea lor cu o culoare,
gradienti sau texturi, de a desena text, de a desena imagini cat si aplicarea unor operatii
complexe precum compunere si transformari.
API-ul Java 2D asigura toate aceste capabilitati pe baza extinderii framework-ului AWT
(Abstract Windowing Toolkit). Obiectele Java 2D exista intr-un spatiu plan denumit: spatiu
de coordonate utilizator sau pe scurt spatiu utilizator user space.
In momentul redarii rendering phase obiectelor pe ecran sau la nivelul unei imprimante
coordonatele din spatiul utilizator sunt tranformate in coordonate specifice dispozitivului
device space coordinates.
Java3D grafica 3D
Java 3D uses the following programming conventions:
The default coordinate system is right-handed, with +Y being up, +X horizontal to the
right, and +Z directed toward the viewer.
All angles or rotational representations are in radians.
All distances are expressed in units or fractions of meters.
http://docs.oracle.com/cd/E17802_01/j2se/javase/technologies/desktop/java3d/forDevelopers/
j3dguide/j3dTOC.doc.html
grafica pe calculator

Clasele de baza in Java 2D sunt:


Graphics - http://docs.oracle.com/javase/7/docs/api/java/awt/Graphics.html
Graphics2 D - http://docs.oracle.com/javase/7/docs/api/java/awt/Graphics.html
http://docs.oracle.com/javase/7/docs/api/java/awt/Graphics2D.html
Prin intermediul claselor din Java 2D API se asigura urmatoarele capabilitati:
un mode uniform de redare pentru dispositive de afisare si printare
un set amplu de primitive geometrice
mecanisme de detectare a evenimentelor generate pe figuri, text sau imagini
un modele de compunere si organizare care permite controlul precis asupra modului de
redare a obiectelor grafice suprapuse
control asupra redarii culorilor cat si suport pentru printarea documentelor complexe
Pentru redarea grafica in Java 2D API-ul Java 2D asigura, la nivelul unui set variat de
dispozitive un model uniform de redare a elementelor grafice. Astfel din perspectiva
dezvoltarii, la nivelul aplicatiei, se asigura acelasi mecanism de redare indiferent de
dispozitivul care va prelua si reda acele elemente grafice.
Din structura ierarhica a componentelor grafice a componentelor incluse in Java 2D (fie ea
partea a Swing API sau a Java2D API) rezulta ca aceste extinde java.awt.Component.
La nivelul clasei Component sunt definite o serie de metode utilizate in redarea entitatii
grafice create. Astfel, in contextul redarii grafice, ori de cate ori trebuie evaluata si afisata o
parte grafica a unei entitati de tip Component (ce extinde Component) se apeleaza una din
metodele paint(..) sau update(..) sau variante supraincarcate ale acestora. Acest tip de
metode primesc ca parametru contextul grafic in care se realizeaza redarea, context
62

reprezentat prin obiecte de tip Graphics sau o extensie Graphics2D.


Pe langa metodele de redare a elementele grafice, entitatile de tip Graphics2D permit
metode care afiseaza o anumita forma geometrica sau metode care afecteaza/influenteaza
redarea obiectului grafic. Aceste metode se refera la:
desenarea conturului oricarei primitive geometrice (metode de tip draw)
desenarea oricarei primitive geometrice (metode de tip fill)
redarea unui text (metode de tip drawString)
redarea unor imagini (metode de tip drawImage)
specificarea aspectului liniei de contur stroke
specificarea modului de imbinare a capetelor de contur
specificarea unei zone restranse asupra careia sa se aplice elemente simecanisme de
redare/transformare grafica
metode de transformare: translatie, rotatie, scalare, forfecare
definirea culorilor si a tiparelor de umplere
definirea metodelor de compunere intr-un spatiu 2D a mai multor obiect (efect de colaj)
Metoda Component.paint(Graphics g) se specifica oricarei componente grafice si are ca
argument un elemnt de tip Graphics. Pentru a accesa toate functionalitatile enumerate mai
sus se obtine un element Graphics2D printr-o operatie de conversie explicita astfel:
@Override
public void paint(Graphics g) {
Graphics2D g2D = (Graphics2D) g;
}
Clasa Graphics contine o serie de primitive de desenare. Ele pot fi impartite in doua mari
categorii: cele fara umplere - traseaza doar conturul obiectului grafic, respectiv cele cu
umplere - traseaza doar interiorul. Pentru a obtine o figura cu un contur si un interior in culori
diferite se va utiliza o pereche corespunzatoare dintre aceste functii.
Functii fara umplere:
void draw3DRect(int x, int y, int width, int height, boolean raised)
void drawArc(int x, int y, int width, int height, int startAngle, int angle)
void drawLine(int x1, int y1, int x2, int y2)
void drawOval(int x, int y, int width, int height)
void drawPolygon(int[] xPoints, int[] yPoints, int nPoints)
void drawPolyline(int[] xPoints, int[] yPoints, int nPoints)
void drawRect(int x, int y, int width, int height)
void drawRoundRect(int x, int y, int width, int height, int arcW, int arcH)
void drawString(String str, int x, int y)
Primitive de desenare cu umplere:
void fill3DRect(int x, int y, int width, int height, boolean raised)
void fillArc(int x, int y, int width, int height, int startAngle, int angle)
void fillOval(int x, int y, int width, int height)
void fillPolygon(int[] xPoints, int[] yPoints, int nPoints)
void fillRect(int x, int y, int width, int height)
void fillRoundRect(int x, int y, int width, int height, int arcW, int a
de studiat:
http://docs.oracle.com/javase/7/docs/api/java/awt/Graphics.html
Clasa Graphics2 D
All Known Implementing Classes:
Arc2D, Arc2D.Double, Arc2D.Float, Area, BasicTextUI.BasicCaret, CubicCurve2D,
CubicCurve2D.Double,
CubicCurve2D.Float,
DefaultCaret,
Ellipse2D,
Ellipse2D.Double, Ellipse2D.Float, GeneralPath, Line2D, Line2D.Double,
grafica pe calculator

63

Line2D.Float, Path2D, Path2D.Double, Path2D.Float, Polygon, QuadCurve2D,


QuadCurve2D.Double,
QuadCurve2D.Float,
Rectangle,
Rectangle2D,
Rectangle2D.Double, Rectangle2D.Float, RectangularShape, RoundRectangle2D,
RoundRectangle2D.Double, RoundRectangle2D.Float
Painting este folosit la umplerea interiorul unei forme si este un proces n dou etape :
1. spune lui Graphics2D cum s umple formele cu un apel la setPaint().
Aceasta metoda accept orice obiect care implementeaza interfata
java.awt.Paint 2D API vine cu trei tipuri de culori : culori solide , un
gradient de culoare liniar , i o textur .
2. umple forma folosind metoda fill(e)
Exemple de culorile solide:
public static final Color white;
public static final Color lightGray;
public static final Color gray;
public static final Color darkGray;
public static final Color black;
public static final Color red;
public static final Color pink;
public static final Color orange;
public static final Color yellow;
public static final Color green;
public static final Color magenta;
public static final Color cyan;
public static final Color blue;
Definirea culorilor se realizeaza:
public Color(int r, int g, int b)
Acest constructor creeaz o nou culoare utiliznd valorile specificate pentru ro u, verde i
albastru. Valorile trebuie s varieze la 0 la 255, inclusiv.
public Color(float r, float g, float b)
Acest constructor creeaz o nou culoare utiliznd valorile specificate pentru ro u, verde i
albastru. Valorile trebuie s varieze 0.0 ---- 1.0, inclusiv.
n API 2D un apel la setColor (c) pe o componenta Graphics2D este echivalent cu apelarea
setPaint (c).
grafica pe calculator

public Arc2D.Float(float x, float y, float w, float h, float start, float extent, int type)
Constructs a new arc, initialized to the specified location, size, angular extents, and closure
type.
Parameters:
x - The X coordinate of the upper-left corner of the arc's framing rectangle.
y - The Y coordinate of the upper-left corner of the arc's framing rectangle.
w - The overall width of the full ellipse of which this arc is a partial section.
h - The overall height of the full ellipse of which this arc is a partial section.
start
The
starting
angle
of
the
arc
in
degrees.
extent
The
angular
extent
of
the
arc
in
degrees.
type - The closure type for the arc: Float.OPEN, Float.CHORD, or Float.PIE.

64

Exemplu
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
public class ex2
extends JFrame {
public static void main(String[] args) {
ex2 f = new ex2();
f.setTitle("Aplicatie 2d Apli");
f.setSize(300, 300);//setLocation
f.setVisible(true);
}
public void paint(Graphics g)
{//conversie la Graphics 2D
Graphics2D g2 = (Graphics2D)g;
//definire arc de cerc,poligon,elipsa
Arc2D pie = new Arc2D.Float(0, 50, 150, 150, -30, 90, Arc2D.PIE);
//definirea culorii de umplere a primitivei
g2.setPaint(Color.blue);
//aplicarea metodei setPaint asupra ptimitivei
g2.fill(pie);
grafica pe calculator

Graphics2D g3 = (Graphics2D)g;
Arc2D pie1 = new Arc2D.Float(80, 150, 50, 50, 0,-180, Arc2D.PIE);
g3.setPaint(Color.GRAY);
g3.fill(pie1);
}
}
Color Chooser Dialog
Dac dorii ca utilizatorii s poat alege culorile in aplicaie se poate folosi clasa
javax.swing.JcolorChooser astfel:
public static Color showDialog(Component component, String title, Color initialColor)
Exemplu :
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class RedTown
extends JFrame {
public static void main(String[] args) {
65

RedTown redTown = new RedTown();


}
public RedTown() {
super("RedTown v1.0");
createUI();
setVisible(true);
}
private void createUI() {
setSize(400, 400);
setLocation(100, 100);
getContentPane().setLayout(new GridBagLayout());
JButton colorButton = new JButton("Choose a color...");
getContentPane().add(colorButton);
colorButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
Color c = JColorChooser.showDialog(
RedTown.this, "Choose a color...", getBackground());
if (c != null) getContentPane().setBackground(c);
}
});
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent we) {
System.exit(0);
}
});
grafica pe calculator

}
}

GradientPaint
Un gradient este o tranziie lin de la o culoare la alta. API ofer o implementare a unui
gradient de culoare simplu, numit java.awt.GradientPaint.
Aceasta clasa defineste un gradient de culoare utiliznd dou puncte i dou culori. Gradientul
de lin trece de la o culoare la alta pe msur ce trece de-a lungul liniei care leag cele dou
puncte.
66

GradientPaint creeaz benzi paralele de culoare, perpendicular pe linia de pant. In figura


alaturata este un gradient care trece de la alb la gri nchis. Linia de pant i obiective sale sunt,
de asemenea, afiate.
Exemplu
GradientPaint(75, 75, Color.white, 95, 95, Color.gray, true);
Exemplu:

import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
public class GradientPaintFill
extends JFrame {
public static void main(String[] args) {
GradientPaintFill f = new GradientPaintFill();
f.setTitle("GradientPaintFill v1.0");
f.setSize(200, 200);
f.setVisible(true);
}
grafica pe calculator

public void paint(Graphics g) {


Graphics2D g2 = (Graphics2D)g;
Ellipse2D e = new Ellipse2D.Float(40, 40, 120, 120);
GradientPaint gp = new GradientPaint(85, 75, Color.MAGENTA,
95, 95, Color.gray, true);
g2.setPaint(gp);
g2.fill(e);
}
}
Stroking
Stroking is the process of drawing the outline of a shape. Stroking is similar to painting:
1. First, tell the Graphics2D how you want the outline to be drawn by
calling setStroke(). This method accepts any object that implements
the java.awt.Stroke interface.
The
2D
API
comes
with
a
class, java.awt.BasicStroke, that implements common stroking options.
2. Use setPaint() to tell the Graphics2D how the outline itself should be drawn.
Outlines, like the interior of shapes, can be drawn using a color, a gradient, a
texture, or anything else that implements the Paint interface.
67

3. Draw the outline of the shape using Graphics2D's draw() method.


The Graphics2D uses the Stroke from step 1 to determine what the outline
looks like. The Paint from step 2 is used to actually render the outline.
Stroke
Graphics2D uses a Stroke to figure out what the outline of a particular shape looks like. When
you ask Graphics2D to draw() a shape, it asks its Stroke what the outline of the shape should
look like. Interestingly, Stroke returns the stroked outline as another shape:
public abstract Shape createStrokedShape(Shape p)
This method returns a Shape that represents the stroked outline of the supplied
shape.
This is the only method in Stroke. Usually, you won't call it yourself--a Graphics2D will call
it on your behalf when you draw() a shape.
At first glance, it seems strange that the outline of a Shape is also a Shape. It may help to
think of the outline of a Shape as an infinitesimally thin line--to actually draw the outline, you
need to give it some area, which is the process of stroking. Once you have the stroked outline,
you can fill it in to draw the original shape's outline. In fact, calling draw() on
a Graphics2D is equivalent to the following code:
public void longwindedDraw(Graphics2D g2, Shape s) {
Stroke stroke = g2.getStroke();
Shape strokedOutline = stroke.createStrokedShape(s);
g2.fill(strokedOutline);
}
BasicStroke
The 2D API comes with a Stroke implementation called java.awt.BasicStroke. This class
supports solid and dashed lines of any width. BasicStroke also handles two details of drawing
thick lines: end styles and join styles.
End styles
There are several ways to draw the end of a thick line. BasicStroke supports three styles,
represented by constants. Figure 4-7 shows an example of each end style.
Figure 4-7. End styles
grafica pe calculator

public static final int CAP_BUTT


This end style adds no decoration to the end of line segments. Straight line
segments stroked using this end style appear as rectangles.
public static final int CAP_ROUND
This end style caps a line segment with a semicircle whose radius is half the
line width.
public static final int CAP_SQUARE
This end style extends the end of the line with a rectangle whose length is half
the line width.
Note that these end styles apply to the ends of any line segment, straight or curved.
Dashes
BasicStroke uses a dash array and a dash phase to stroke dashed lines. The dash array is an
array of floats that represent the length of the solid and clear sections of the line. For example,
an array consisting of { 12, 12 } would produce a line that was visible for 12 units and
68

invisible for 12 units. The even elements of the array (starting at index 0) determine where the
line is visible, while the odd elements determine where it's invisible. Figure 4-11 shows
a GeneralPath stroked with two varieties of dotted lines. The shape on the left has been
stroked with a solid line. In the middle, the shape has been stroked using a dash array of { 12,
12 }. The same shape is stroked again on the right, using a dash array of { 4, 4, 12, 4 }.
Figure 4-11. Stroking dashed lines

The end style is used on each dash in a dashed line. Figure 4-12 shows the same dashed line
drawn using the CAP_BUTT, CAP_ROUND, and CAP_SQUARE end styles.
Figure 4-12. End styles apply to dashes, too

The dash phase acts as an offset into the dash pattern. Consider, for example, the dash
array { 12, 12 }. When the dash phase is 0, lines stroked with this dash pattern will begin with
12 units of visible outline followed by 12 units that are invisible. Suppose, instead, that the
dash phase is set to 8. Now, lines stroked with the dash pattern will begin with 4 units of
visible line, followed by 12 units of invisible, followed by 12 of visible, and so forth. Figure
4-13 shows how this works for two straight lines.
Figure 4-13. Same dashes, different dash phases
grafica pe calculator

Overlap
What happens if you both stroke and paint a shape? Interestingly, the results depend on
whether you stroke or paint first. A shape's outline actually overlaps its interior, as shown
in Figure 4-14. The shape's real outline, strictly speaking, is an infinitesimally thin line,
shown black in the figure. The process of stroking creates an outline shape around the real
outline. Some of the stroked outline extends outside the shape, and some of the stroked
outline overlaps with the shape's interior.
Figure 4-14. The stroked outline and interior of a circle

69

If you're using opaque colors, then you'll get different results depending on the order in which
you do things. If you use partially transparent colors, then you'll be able to observe the
overlap of stroked outlines and filled interiors in your results. The following shows how this
happens in practice. First, it strokes the outline and fills the interior of a circle using a partially
transparent color:
Color smokey = new Color(128, 128, 128, 128);
g2.setPaint(smokey);
g2.fill(e);
g2.draw(e);
Then, in a different location, it strokes the circle's outline using a solid black color and fills
the interior using a solid gray:
g2.setPaint(Color.black);
g2.draw(e);
g2.setPaint(Color.gray);
g2.fill(e);
Finally, it fills the circle with gray and then strokes the outline with black:
g2.setPaint(Color.gray);
g2.fill(e);
g2.setPaint(Color.black);
g2.draw(e);
grafica pe calculator

de studiat:
http://www.javadocexamples.com/java/awt/geom/Rectangle2D/setFrame%28double
%20x,double%20y,double%20w,double%20h%29.html
http://www.javadocexamples.com/java/awt/geom/Arc2D/setFrame%28double%20x,double
%20y,double%20w,double%20h%29.html
Exemplu: sa se deseneze un cerc umplut cu un gradient, in mijloc, conturul acela i cercul este
desenat cu o linie groas cu o culoare solid iar in dreapta, conturul cercului este desenat cu
aceeai linie groas folosind gradient de culoare.

import java.awt.*;
import java.awt.geom.*;
import java.util.Locale;
70

import javax.swing.JFrame;
public class PaintingAndStroking
extends JFrame {
public static void main(String[] args) {
PaintingAndStroking f = new PaintingAndStroking();
f.setTitle("PaintingAndStroking v1.0");
f.setSize(500, 550);
f.setLocation(50,50);
f.setVisible(true);
}
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
double x = 15, y = 50, w = 70, h = 70;
Ellipse2D e = new Ellipse2D.Double(x, y, w, h);
GradientPaint gp = new GradientPaint(75, 75, Color.white,
95, 95, Color.gray, true);
// Fill with a gradient.
g2.setPaint(gp);
g2.fill(e);
// Stroke with a solid color.
e.setFrame(x + 100, y, w, h);
g2.setPaint(Color.GREEN);
g2.setStroke(new BasicStroke(8));
g2.draw(e);
// Stroke with a gradient.
// setFrame(double x, double y, double w, double h)
//Sets the location and size of the framing rectangle of this Shape to the specified rectangular
values.
// http://docs.oracle.com/javase/7/docs/api/java/awt/geom/Ellipse2D.Double.html
e.setFrame(x + 200, y, w, h);
g2.setPaint(gp);
g2.draw(e);
}
}
grafica pe calculator

import java.awt.*;
import java.awt.geom.*;
import javax.swing.JFrame;
public class Overlap
71

extends JFrame {
public static void main(String[] args) {
Overlap f = new Overlap();
f.setTitle("Exemple 2d");
f.setSize(300, 150);
f.setLocation(20,20);
f.setVisible(true);
}
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
double x = 15, y = 50, w = 70, h = 70;
Ellipse2D e = new Ellipse2D.Double(x, y, w, h);
g2.setStroke(new BasicStroke(25));
// Stroke and paint.
Color smokey = new Color(128, 128, 8, 50);
g2.setPaint(smokey);
g2.fill(e);
g2.draw(e);
// Stroke, then paint.
e.setFrame(x + 100, y, w, h);
g2.setPaint(Color.MAGENTA);
g2.draw(e);
g2.setPaint(Color.gray);
g2.fill(e);
// Paint, then stroke.
e.setFrame(x + 200, y, w, h);
g2.setPaint(Color.gray);
g2.fill(e);
g2.setPaint(Color.black);
g2.draw(e);

grafica pe calculator

}
}
Aplicatii propuse

72

grafica pe calculator

73

grafica pe calculator

74

Unitatea de invatare 4 - Unity Game Engine


https://unity3d.com/learn
Unity Game Engine
Unity este un game engine cu ajutorul caruia putem realiza jocuri 2D cat si 3D pentru PC,
console, telefoane mobile si website. Acesta a fost lansat in 2005 si este scris in C,C++ si C#.
Initial acest game engine a fost lansat doar pentru Sistemele de operare Mac, iar in versiunea
lansata initial continea shadere orientate OpenGL. In urmatoarele versiuni de Unity 1.x s-a
inclus suport pentru rularea jocurilor pe sistemul de operare Windows.
Link de descarcare : https://unity3d.com/get-unity
Unity este un game engine care a evoluat mult de-a lungul anilor, reusind sa isi extinda aria
ca dispozitive target. A devenit mult mai usor de utilizat, oferind programatorului cat si
amatorului programator posibilitatea de a creea jocuri 2D cat si 3D cu un bagaj mic de
cunostinte. Cu timpul a devenit tot mai popular, tot mai cunoscut prin jocurile create si s-a
format o intreaga comunitate de developeri amatori si profesionisti care pot pune la dispozitie
raspunsuri la intrebarile utilizatorilor. De asemena pe site-ul official (www.unity3d.com) se
gasesc o multime de tutoriale inclusive live, cu scopul de a demonstra cat de practic si
puternic poate fi acest game engine, iar ca un plus, noua versiune lansata in acest an Unity 5,
este gratuita. Unity suporta 3 limbaje diferite ( C#, JavaScript si Boo), oferind programatorilor
posibilitatea sa lucreze in limbajul preferat. In acest moment C# este limbajul cel mai utilizat,
Boo insa este un limbaj de programare aflat inca in umbra folosit de o parte mica a
programatorilor in Unity.
In Unity se lucreaza in Monodevelop, ceea ce este o versiune customizata pentru Unity.
Monodevelop este un mediu de lucru open source pentru Linux si Windows. Contine functii
similare cu Microsoft Visual Studio si NetBeans precum completarea automata a codului sau
crearea interfetelor grafice (GUI), suporta Boo, C#, JavaScript etc. Unity game engine are o
interfata simpla si intuitiva, ferestrele cu care interactionezi cel mai des sunt urmatoarele:
1. Scena - reprezinta toate componentele pe care le ai in joc (fiecare scena contine o camera);
2. Game - reprezinta fereastra cu jocul si este ceea ce camera ta vede in scena;
3. Ierarhie contine structurate obiectele din scena;
4. Proiect - reprezinta proiectul utilizatorului si contine scripturile, prefaburi, materiale,
texture, assets etc.
5. Consola pentru a obtine informatii legate de proiectul curent, daca sunt anumite erori de
compilare, de sintaxa in cod precum si zona in care se va putea urmari comportamentul
variabilelor , adica un debug.
6.Inspectorul - aici apare fiecare componenta a obiectului tau (fiecare obiect este considerat
un GameObject), se poate modifica fiecare parametru droit.
Foarte important este faptul ca forma, obiect contine 3 componente fara de care nu am putea
randat obiectul. Cele trei componente sunt:
-Material
-Mesh Filter
-Mesh Renderer
Ca prim exemplu al unei componente care poate fi adaugat il reprezinta componenta
Rigidbody, ce permite obiectului sa interactioneze cu mediul inconjurator.
grafica pe calculator

75

Unity este un game engine ce iti ofera posibilitatea dea a iti porta jocul pe o platforma dorita
de tine, iti pune la dispozitie o multime de pachete ce acopera totul incepand de la texturi si
animatii pana la intregi proiecte drept model. Aceste pachete sunt produse de catre Unity
Technologies dar si de catre membrii ai comunitatii, care le pot posta gratuit sau vinde.
Unele din cele mai des utilizate functii din clasa Monobehaviour sunt :
Awake (){
// Fiecare instructiune este rulata inca de la incarcarea scriptului,chiar daca componenta de
script nu este activata
}
Start(){
// Functia Start este apelata dupa functia Awake si doar atunci cand scriptul este activat.
}
Update(){
//Functie care este apelata la fiecare frame, si in aceasta functie sunt introduse comenzile de
control.
}
FixedUpdate(){
//Functie care este apelata la un numar de frameuri constante, pot fi folosite pentru a adauga o
forta unui obiect, la fiecare miscare a obiectului functia FiexUpdate este apelata.
}

grafica pe calculator

LateUpdate(){
Functie apelata la finalul rularii instructiunilor din Update()
}
Coroutine(){
/*Aceste functii sunt folosite atunci cand ai nevoie de realizarea unei actiuni la un anumit
moment din joc,coroutinele sunt apelate cu StartCoroutine(functie) si este de forma :
76

IEnumerator functie(){
Instructiuni
Yield return new WaitForSeconds(1.4f);
Instructiuni

}
astfel ai controlul asupra derularii unor actiuni.
*/
}
OnGui(){
//Putem creea butoane, ferestre, o interfata cu care utilizatorul sa interactioneze. Aceasta
functie este apelata la fel ca si functia Update(), la fiecare frame.
}
De la lansarea lui Unity 4.6 dezvoltatorii de jocuri au accesul la un UI Tool care nu necesita
scrierea de foarte mult cod. Creearea unei interfete cu care utilizatorul sa interactioneze nu a
fost niciodata mai usor. Exemplu:

grafica pe calculator

https://unity3d.com/learn/tutorials/modules/beginner/live-training-archive/the-new-ui
In Unity avem la dispozitie Animator Controller care ne ajuta sa mentinem anumite animatii
pe un obiect si sa le controlam in functie de anumite conditii. De asemenea in Unity putem
creea propriile animatii ca de exemplu deschiderea unei usi, etc.
Link spre galeria cu jocurile create in Unity :
https://unity3d.com/showcase/gallery/games
http://www.unitygamesbox.com/page/11

77

MODEL BILET 1
1. Caracterizati grafica digital (2 pct).
2. Caracterizati grafica vectorial (2 pct).
3. Explicati modelele de culori RGB si CMYK (2 pct).
4. Sa se explice fiecare functie OpenGl utilizata in programul urmator (1.5 pct).
20.
glViewport (0, 0, (GLsizei) w,
(GLsizei) h);
1.
#include <GL/glut.h>
21.
glMatrixMode
2.
void init()
(GL_PROJECTION);
3.
{
22.
glLoadIdentity ();
4.
glClearColor (0.0, 0.0, 0.0, 0.0);
23.
gluOrtho2D (0.0, (GLdouble) w,
5.
glShadeModel (GL_FLAT);
0.0, (GLdouble) h);
6.
}
24.
}
7.
void display()
25.
int main(int argc, char** argv)
8.
{
26.
{
9.
glClear
27.
glutInit(&argc, argv);
(GL_COLOR_BUFFER_BIT);
28.
glutInitDisplayMode
10.
glColor3f (1.0, 0.0, 0.0);
(GLUT_SINGLE | GLUT_RGB);
11.
glBegin(GL_POLYGON);
29.
glutInitWindowSize (600, 600);
12.
glVertex2f(200.0,200.0);
30.
glutInitWindowPosition
13.
glVertex2f(400.0,200.0);
(100,100);
14.
glVertex2f(400.0, 400.0);
31.
glutCreateWindow (argv[0]);
15.
glEnd();
32.
init ();
16.
glFlush ();
33.
glutDisplayFunc(display);
17.
}
34.
glutReshapeFunc(reshape);
18.
void reshape (int w, int h)
35.
glutMainLoop();
19.
{
36.
return 0;
37.
}
grafica pe calculator

5. Sa se scrie setul de comenzi (utilizand OpenGl) care, in urma executiei, vor conduce la
fereastra din figura alaturata (1.5 pct).

78

Model bilet 2
1. Prezentati cel putin 4 idei principale din referatul intocmit (2 pct).
2. Caracterizati grafica vectorial (2 pct).
3. Explicati modelele de culori RGB si CMYK (1 pct).
4. Sa se explice fiecare functie OpenGl utilizata in programul urmator (2 pct).
1.
#include <GL/glut.h>
21.
glMatrixMode
2.
void init()
(GL_PROJECTION);
3.
{
22.
glLoadIdentity ();
4.
glClearColor (0.0, 0.0, 0.0, 0.0);
23.
gluOrtho2D (0.0, (GLdouble) w,
5.
glShadeModel (GL_FLAT);
0.0, (GLdouble) h);
6.
}
24.
}
7.
void display()
25.
int main(int argc, char** argv)
8.
{
26.
{
9.
glClear
27.
glutInit(&argc, argv);
(GL_COLOR_BUFFER_BIT);
28.
glutInitDisplayMode
10.
glColor3f (1.0, 0.0, 0.0);
(GLUT_SINGLE | GLUT_RGB);
11.
glBegin(GL_POLYGON);
29.
glutInitWindowSize (600, 600);
12.
glVertex2f(200.0,200.0);
30.
glutInitWindowPosition
13.
glVertex2f(400.0,200.0);
(100,100);
14.
glVertex2f(400.0, 400.0);
31.
glutCreateWindow (argv[0]);
15.
glEnd();
32.
init ();
16.
glFlush ();
33.
glutDisplayFunc(display);
17.
}
34.
glutReshapeFunc(reshape);
18.
void reshape (int w, int h)
35.
glutMainLoop();
19.
{
36.
return 0;
20.
glViewport (0, 0, (GLsizei) w,
37.
}
(GLsizei) h);
grafica pe calculator

5. Explicati ce rezulta in urma testarii setului de comenzi (2 pct).


1.
#include <GL/glut.h>
iv. }
2.
#include <stdlib.h>
e. glEnd();
3.
#include <math.h>
f. glFlush();
4.
void Display(void)
g. }
a. {
b. glClear(GL_COLOR_BU
5.
int main(void)
FFER_BIT);
a. {
b. glutCreateWindow("mode
c. glBegin(GL_LINES);
l");
d. for(int i=0;i<100;++i)
c. glutDisplayFunc(Display);
i. {
d. glColor3f(1,1,0);
ii. glVertex3f(0,0,0);
e. glutMainLoop();
iii. glVertex3f(1f. return 0;
i/100.0,i/100.0,0);
g. }

79

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