You are on page 1of 5

GLUT - BITMAP FONTOVI Bitmap(irani) font je uglavnom 2D font.

Ako ga prebacimo u 3D font, nee imati debljinu i nee moi da se rotira i skalira. ta vie font e uvek biti okrenut prema posmatrau, kao bilbord. Mada se ovo moe smatrati potencijalnim nedostatkom, u drugu ruku neemo morati da se brinemo oko orijentacije fonta ka posmatrau. U ovom odeljku predstavljamo GLUT funkcije za prikazivanje bitmap teksta na ekranu. U sutini potrebna je samo jedna funkcija: glutBitmapCharacter. Sintaksa je sledea: void glutBitmapCharacter(void *font, int character) Parametri: font: naziv (tip) fonta koji se koristi (videti ispod listu ponuenih fontova) character: ta se renderuje, slovo, simbol, broj Za font su na raspolaganju sledee opcije: GLUT_BITMAP_8_BY_13 GLUT_BITMAP_9_BY_15 GLUT_BITMAP_TIMES_ROMAN_10 GLUT_BITMAP_TIMES_ROMAN_24 GLUT_BITMAP_HELVETICA_10 GLUT_BITMAP_HELVETICA_12 GLUT_BITMAP_HELVETICA_18 Neki tipovi fontova su prepoznatljivi pa ete znati ta da oekujete, meutim, imate mogunost i da probate sve fontove u priloenoj aplikaciji preko pop-ap menija. Sledei red koda prikazuje pozivanje funkcije i prikazivanje odreenog znaka na trenutnoj raster poziciji glutBitmapCharacter(GLUT_HELVETICA_18,'3'); Bitna stvar koju treba znati je koja je trenutna raster pozicija. Ova pozicija se moe postaviti pomou klase funkcija glRasterPos iz OpenGL biblioteke, sintaksa dve funcije iz ove klase data je nie. void glRasterPos2f(float x, float y); void glRasterPos3f(float x, float y, float z); Parametri: x, y, z lokalne koordinate za tekst koji se pojavljuje Funkcija glutBitmapCharacter renderuje znak na zahtevanoj poziciji i poveava tekuu poziciju rastera za irinu znaka. Zbog toga da bi renderovali string upuuju se sukcesivni pozivi funkciji glutBitmapCharacter da bi dobili eljeni izlaz. Sledea funkcija renderuje string sa poetkom na navedenoj poziciji rastera. void renderBitmapString(

float x, float y, float z, void *font, char *string) { char *c; glRasterPos3f(x, y,z); for (c=string; *c != '\0'; c++) { glutBitmapCharacter(font, *c); }

Visual C projekat je arhiviran u fajl glutbmpfont.zip. Ovaj projekat deli kostur sa onim iz odeljka **Kretanje po svetu II , jedina znaajna razlika izmeu njih je poziv funkcije renderBitMapString. Obezbeen je GLUT pop-up meni za selekciju fonta. BITMAP FONTOVI I ORTOGONALNE PROJEKCIJE Opta namena bitmap fontova, s obzirom da su 2D, je da predstavljaju informacije korisniku. Na primer, jedan jednostavan primer bi bio kad elimo da prikaemo broj kadrova (frejmova) u sekundi aplikacije. Ova informacija bi trebala da ostane na istoj poziciji na ekranu iako korisnik pomera kameru unaokolo. ak ta vie, lake je izraunati ove pozicije koristei 2D ortogonalnu projekciju nego perspektivnu projekciju zato to moemo da specifikujemo poziciju u pikselima. Glavna stvar je da se nacrtaju stvari kako izgledaju u perspektivnoj projekciji a posle toga promeni u ortogonalnu projekciju i iscrta tekst. Posle ovoga trebalo bi davratimo originalnu perspektivu tako da se sledei kadar renderuje korektno. Nie je dat ablon funkcije da bi se postigao taj efekat. void renderScene() { // radi sve to je potrebno da renderuje svet kao to je uobiajeno setOrthographicProjection(); glPushMatrix(); glLoadIdentity(); renderBitmapString(5,30,GLUT_HELVETICA_18,"3D Tech"); glPopMatrix(); resetPerpectiveProjection(); glutSwapBuffers(); } Dve nove funkcije su predstavljene setOrthograpicProjection i resetPerpectiveProjection. Prva funkcija poinje promenom matrica (matrix) reima (moda) u GL_PROJECTION to znai da radimo sa kamerom. Potom, uvamo prethodno podeavanje, koje se u ovom sluaju odnosi na perspektivnu projekciju definisanu ranije. Onda resetujemo matricu sa funkcijom glLoadIdentity() i definiemo ortogonalnu projekciju koristei gluOrtho.

Argumenti ove funkcije pokazuju opseg za obe, x i y osu. Transformacije okreu tj. menjaju smer y ose, tj. pozitivna je nadole, i centar se nalazi u gornjem levom uglu. Ovo olakava pisanje teksta u skladu s koordinatama ekrana. Promenljive w i h se raunaju na drugom mestu (pogledajte funkciju changeSize u izvornom kodu) void setOrthographicProjection() { // prebacivanje na reim projekcije glMatrixMode(GL_PROJECTION); // snimanje prethodne matrice koja sadri //podeavanja za projekciju perspektive glPushMatrix(); // resetovanje matrice glLoadIdentity(); // postavljanje 2D ortografske projekcije gluOrtho2D(0, w, 0, h); // invertovanje y ose, pozitivna nadole glScalef(1, -1, 1); // pomeranje koordinatnog poetka iz donjeg levog ugla // u gornji levi glTranslatef(0, -h, 0); glMatrixMode(GL_MODELVIEW);

Ova funkcija je veoma jednostavna. Kako smo sauvali podeavanja za perspektivnu projekciju pre nego to podesimo ortogonalnu projekciju, sve to treba da uradimo je da promenimo matrini reim u GL_PROJECTION, izvuemo matricu, vratimo podeavanja i konano, ponovo promenimo matrini reim u GL_MODELVIEW. void resetPerspectiveProjection() { glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); } Prethodna funkcija e ispisivati znakove u kontinuitetu bez dodatnog razmaka osim ako se razmak pojavljuje u tekstu. Da bi dodali (dodatne) razmake moramo da pratimo gde se nalazi trenutna raster pozicija da bi mogli da dodamo razmak x koordinati, na primer. Postoji najmanje dva naina da bi pratili poziciju rastera; jedan je da se prorauna trenutna pozicija rastera posle iscrtavanja bitmape. Drugi nain obuhvata da se pita OpenGL maina stanja gde je pozicija rastera. Prvi nain zahteva da znamo dimenzije znaka. Dok je maksimalna visina uvek konstantna za odreeni font, debljina bi mogla da se razlikuje kod pojedinih fontova. Na sreu, GLUT obezbeuje funkciju koja vraa debljinu znaka. Ta funkcija je glutBitmapWidth a sintaksa je sledea: int glutBitmapWidth(void *font, int character); Parametri:

font: jedan od definisanih u GLUT-u, pogledaj prethodni odeljak za mogue vrednosti character: znak iju irinu elimo da saznamo Ako na primer, elimo da napravimo funkciju koja ispisuje string sa odreenim brojem piksela izmeu svakog znaka, napisaemo: void renderSpacedBitmapString( float x, float y, int spacing, void *font, char *string) { char *c; int x1=x; for (c=string; *c != '\0'; c++) { glRasterPos2f(x1,y); glutBitmapCharacter(font, *c); x1 = x1 + glutBitmapWidth(font,*c) + spacing; } } Slino, ako elimo da ispiemo vertikalan tekst uradiemo: void renderVerticalBitmapString( float x, float y, int bitmapHeight, void *font, char *string) { char *c; int i; for (c=string,i=0; *c != '\0'; i++,c++) { glRasterPos2f(x, y+bitmapHeight*i); glutBitmapCharacter(font, *c); } } Promenljiva bitmapHeight moe biti lako izraunata poto se zna maksimalna visina svakog fonta (pogledajte izvorni kd). GLUT ima jo jednu funkciju za bitmap fontove, to je glutBitMapLength i ona rauna duinu stringa u pikselima. Povratna vrednost ove funkcije je suma debljina svakog od znakova u stringu. Evo sintakse: int glutBitmapLength(void *font, char *string); Parametri: font - jedan od definisanih u GLUT-u, pogledaj prethodni odeljak za mogue vrednosti

string string iju duinu u pikselima elimo da odredimo U arhivi glutbmpfontortho.zip nalazi se primer koji ilustruje kako da koristimo prethodno navedene koncepte.

Pripremio Dragan Markovi

You might also like