You are on page 1of 18

OpenGL (Open Graphics Library, http://www.opengl.

org/, konkurencja dla Direct3D Mircrosoftu) jest specyfikacj API suc do generowania grafiki 3D, uywan obecnie w wielu aplikacjach, m. in. takich jak: aplikacje CAD, gry, programy do modelowania 3D i tworzenia efektw w filmach. OpenGL dziaa w architekturze klient -serwer, dziki czemu implementacja (zalena od sprztu) jest oddzielona od samej aplikacji korzystajcej z API. Implementacj specyfikacji zazwyczaj dostarczaj producenci kart graficznych ra zem ze sterownikami (istnieje te zupenie niezalena implementacja Mesa3D). Obecnie OpenGL rozwijane jest wsplnie przez wikszo firm zwizanych z produkcj kart graficznych i grafik w ramach Khronos Group (od lipca 2006, wczeniej w ramach zrzeszenia ARB). W skad grupy wchodz m. in. nVidia, AMD/ATI, Intel, SGI, Google. Swj pocztek OpenGL miao w formie biblioteki IRIS GL stworzonej przez firm Silicon Graphics na potrzeby stacji roboczych IRIS. OpenGL jest rezultatem prac firmy nad popraw przenaszalnoci IRIS GL. W lipcu 1992 powsta pierwsza wersja OpenGL 1.0. Obecnie biblioteka ta jest w peni otwarta i dostpna dla wielu platform systemowych. Umoliwia rysowanie punktw, odcinkw i wieloktw w trzech wymiarach, ponadto obsuguje owietlenie, c ieniowanie, mapowanie tekstur, animacje oraz dodatkowe efekty specjalne. OpenGL nie zawiera adnych funkcji przeznaczonych do zarzdzania oknami, interakcj z uytkownikiem czy operacji

wejcia/wyjcia, dlatego naley je zaimplementowa wasnorcznie lub skorzysta z gotowych bibliotek pomocniczych . GLUT (OpenGL Utility Toolkit) jest wanie jedn z takich bibliotek. Udostpniany jest na wikszo systemw operacyjnych, pozwalajc na napisanie jednego, uniwersalnego kodu aplikacji. Cecha ta przyczynia si do bardzo duej popularnoci GLUT'a. Biblioteka zostaa napisana przez Marka J. Kilgarda w celu zwikszenia przenaszalnoci kodu oraz uatwienia nauki OpenGL'a. Poniewa GLUT nie zosta udostpniony na wolnej licencji (Kilgard nadal posiada prawa autorskie) powstao kilka projektw alternatywnych implementacji GLUT'a. w peni

Najwaniejszym jest freeGLUT (http://freeglut.sourceforge.net/), ktry jest kompatybilny z oryginaln bibliotek GLUT.

Wszystkie nazwy funkcji wykorzystywane w bibliotekach OpenGL i GLUT posiadaj przedrostki pozwalajce na identyfikacj, z ktrej biblioteki pochodz: gl dla OpenGL glut dla GLUT Przykadowo:

Dodatkowa litera v po typie argumentu informuje, e funkcja przyjmuje tablic argumentw, glVertex4fv(GLfloat arg[4]); Biblioteka OpenGL, w celu penej przenonoci kodu midzy rnymi platformami wprowadza swoje wasne typy danych, np.:

Najwaniejsze funkcje biblioteki GLUT:

#include <stdlib.h> #include <GL/glut.h> // kod, ktry zostanie narysowany w obszarze widzenia void display() { //wyczyszczenie buforw glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 0.0, 0.0); glBegin(GL_QUADS); glVertex2f(270, 190); glVertex2f(370, 190); glVertex2f(370, 290); glVertex2f(270, 290); glEnd(); glutSwapBuffers(); } // kod odpowiedzialny za ustawienie rzutowania oraz okna widoku void reshape(int w, int h) { glViewport(0, 0, (GLsizei) w, (GLsizei) h); // ustawienie prostokta glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0, (GLdouble) w, 0.0, (GLdouble) h, 100, -100); // ustawienie rzutu glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } // funkcja obsugi klawiatury void klawiatura(unsigned char key, int x, int y){ switch (key) { case 27 : case 'q': exit(0); break; } } // funkcja main int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); // ustawienie podwjnego buforowania i kolorw RGB glutInitWindowSize(640, 480); // rozmiar okna glutCreateWindow(argv[0]); glutDisplayFunc(display); // ustawienie funkcji odpowiedzialnej za rysowanie glutReshapeFunc(reshape); // ustawienie funkcji wywoywanej przy zmianie rozmiaru okna glutKeyboardFunc(klawiatura); // ustawienie funkcji obsugi klawiatury glutMainLoop(); // wejcie do gwnej ptli programu return 0; }

Podstawy rysowania Rysowanie w aplikacjach korzystajcych z GLUT'a odbywa si zawsze w oddzielnej funkcji typu void, nieprzyjmujcej parametrw. Podczas konfigurowania GLUT'a naley poinformowa go, ktra z funkcji bdzie suya do wywietlania (o tym w nastpnym podrozdziale). Standardowy proces wywietlania obrazu skada si z nastpujcych krokw: ustawienie koloru, jakim bdzie wypeniany ekran przy czyszczeniu

(R, G, B, alfa), np. kolor czarny: glClearColor(0.0, 0.0, 0.0, 1.0); wyczyszczenie buforw na pocztek wystarczy wyczyci jedynie bufor kolor w: glClear(GL_COLOR_BUFFER_BIT); narysowanie obiektu/obiektw narysowanie kwadratu polega na podaniu czterech wierzchokw (glVertex2f(x, y)) i wybraniu typu obiektu jako GL_QUADS. Wicej informacji na ten temat zostanie podanych w dalszych instrukcjach. glColor3f(1.0, 0.0, 0.0); // ustawienie koloru na czerwony glBegin(GL_QUADS); glVertex2f(270, 190); glVertex2f(370, 190); glVertex2f(370, 290); glVertex2f(270, 290); glEnd(); W powyszym przykadzie prostokt jest rysowany z pominiciem wsprzdnej z. Dla rysowania obrazu w peni trjwymiarowego naley uy glVertex3f(x, y, z). Trjkt mona narysowa za pomoc GL_TRIANGLES: glBegin(GL_TRIANGLES); glVertex2f(270, 190); glVertex2f(370, 190); glVertex2f(370, 290); glEnd();

wywietlenie obrazu powysze instrukcje oczekuj w kolejce do wykonania, naley poinformowa OpenGL, e skoczylimy rysowa i obraz mona wywietli na ekran. Za wykonanie tej operacji odpowiedzialna jest funkcja glFlush(). W przypadku, gdy korzystamy z podwjnego buforowania (ktre jest zalecane), naley uy funkcji glutSwapBuffers(), ktra podmieni bufory i wywietli obraz na ekranie. Prymitywy proste figury geometryczne, z ktrych moliwe jest tworzenie bardziej zaawansowanych obiektw. W OpenGL nale do nich: punkt, linie, linie amane, linie amane zamknite, trjkty, pasek z trjktw i wachlarz z trjktw, czworokt, poczone czworokty i wielokt o dowolnej liczbie wierzchokw. Podstawy rysowania prymityww Podstawowymi funkcjami wykorzystywanymi podczas rysowania prym ityww s: glBegin(typ_prymitywu), glEnd() oraz funkcje z rodziny glVertex (najczciej wykorzystywane to glVertex2f oraz glVertex3f). Funkcja glBegin(typ_prymitywu) suy do poinformowania biblioteki o rozpoczciu rysowania prymitywu podanego w parametrze. Nastpnie naley poda kolejne wierzchoki figury, np. za pomoc glVertex3f(x, y, z). Po podaniu wszystkich wierzchokw figury, naley zakoczy rysowanie za pomoc glEnd(). Zatem standardowe rysowanie prymityww wyglda nastpujco: glBegin(typ_prymitywu); podanie wierzchokw glEnd(); Nie mona zagniedza w sobie funkcji glBegin i glEnd, tzn. uycie np. poniszej konstrukcji jest niepoprawne: glBegin(typ_prymitywu1); podanie wierzchokw figury 1 glBegin(typ_prymitywu2); podanie wierzchokw figury 2 glEnd(); glEnd(); LE!!! Punkty Rysowanie punktw jest najprostszym przykadem rysowania prymitywu, poniewa jest to najmniejsza, a zarazem najprostsza figura. W celu jej narysowania w funkcji glBegin uywa si typu GL_POINTS. Przykad 1: glBegin(GL_POINTS); glVertex3f(5.0f, 5.0f, 5.0f); glEnd(); Przykad 2: float pozycja[] = {5.0f, 5.0f, 5.0f}; glBegin(GL_POINTS); glVertex3fv(pozycja); glEnd(); Moliwe jest rwnie narysowanie wikszej liczby punktw w jednym bloku glBegin glEnd:

Przykad 3: glBegin(GL_POINTS); glVertex3f(5.0f, 5.0f, 5.0f); glVertex3f(15.0f, 5.0f, 5.0f); glVertex3f(25.0f, 25.0f, 5.0f); glEnd(); Moliwe jest rwnie ustawienie rozmiaru punktu na ekranie za pomoc poniszej funkcji: void glPointSize(GLfloat rozmiar) Przyjmuje ona tylko je den parametr, ktrym jest nowy rozmiar punktu. Dodatkowo zmiana jest wprowadzona na stae, tzn. kady punkt rysowany po wywoaniu tej funkcji bdzie mia podany rozmiar, a do ponownego wywoania glPointSize z innym rozmiarem. Kolor kadego z punktw (rwnie wierzchokw figur) mona ustawi za pomoc funkcji glColor3f(glFloat r, glFloat g, glFloat b). Parametry r, g oraz b przyjmuj wartoci od 0 do 1 (1 odpowiednik 255 z allegro). Istnieje rwnie funkcja glColor4f(glFloat r, glFloat g, glFloat b, glFloat a), ktrej dodatkowy parametr okrela wspczynnik alfa. Linie (odcinki), amane, amane zamknite Linie w bibliotece OpenGL, s odpowiednikami odcinkw w matematyce - skadaj si z dwch punktw oraz czcej je linii. Rysuje si je z uyciem typu GL_LINES. Do obowizkw programisty naley jedynie podanie dwch punktw (np. za pomoc glVertex3f), natomiast reszt zajmuje si ju biblioteka. Przykad 4: glBegin(GL_POINTS); glVertex3f(-200, 200, 0); glVertex3f(-150, 220, 0); glEnd(); Podobnie jak dla punktw, moliwe jest narysowanie wikszej liczby linii w jednym bloku glBegin...glEnd. Naley wtedy podawa kolejno po dwa wierzchoki na odcinek. Przykad 5: glBegin(GL_LINES); glVertex3f(-200, 200, 0); // pierwszy punkt - pierwsza linia glVertex3f(-150, 220, 0); // drugi punkt - pierwsza linia glVertex3f(-100, 200, 0); // trzeci punkt - druga linia glVertex3f(-50, 220, 0); // czwarty punkt - druga linia glEnd(); amane tworzone s w sposb bardzo zbliony do linii. W funkcji glBegin naley uy typu GL_LINE_STRIP, a nastpnie poda kolejne punkty amanej (punkty pocztkowy, kocowy i wszelkie zagicia):

Przykad 6: glBegin(GL_LINE_STRIP); glVertex3f(-200, 150, 0); // pierwszy punkt glVertex3f(-150, 170, 0); // drugi punkt glVertex3f(-100, 150, 0); // trzeci punkt glVertex3f(-50, 170, 0); // czwarty punkt glEnd(); amana zamknita jest identyczna w obsudze ze zwyk aman, z drobn rnic ostatni punkt jest czony z pierwszym, dziki czemu uzyskujemy wielokt. Typ jaki naley uy to GL_LOOP. Przykad 7: glBegin(GL_LINE_LOOP); glVertex3f(-200, 80, 0); // pierwszy punkt glVertex3f(-150, 100, 0); // drugi punkt glVertex3f(-100, 80, 0); // trzeci punkt glVertex3f(-50, 100, 0); // czwarty punkt glEnd(); Moliwe jest rwnie ustawienie gruboci linii, za pomoc funkcji: void glLineWidth(GLfloat rozmiar); Jako jedyny parametr przyjmuje ona nowy rozmiar i podobnie jak glPointSize() ustawia rozmiar linii na stae, a do ponownego wywoania. Trjkty Trjkty s najczciej wykorzystywanymi prymitywami (je st to standard w grafice 3D), poniewa z ich pomoc mona atwo budowa bardziej skomplikowane obiekty (np. teapot, sfer itp.). Trjkty s rwnie pierwszymi z omawianych prymityww, ktre s wypenione. W celu narysowania trjkta naley uy typu GL_TRIANGLES oraz poda 3 wierzchoki: Przykad 8: glBegin(GL_TRIANGLES); glVertex3f(0, 200, 0); // pierwszy punkt glColor3f(0.0, 1.0, 1.0); glVertex3f(50, 220, 0); // drugi punkt glColor3f(1.0, 1.0, 1.0); glVertex3f(100, 200, 0); // trzeci punkt glEnd(); Podobnie jak wczeniej moliwe jest narysowanie wikszej liczby trjktw w jednym bloku glBegin...glEnd: Przykad 9: glBegin(GL_TRIANGLES); glVertex3f(0, 200, 0); // pierwszy punkt glColor3f(0.0, 1.0, 1.0); glVertex3f(50, 220, 0); // drugi punkt glColor3f(1.0, 1.0, 1.0); glVertex3f(100, 200, 0); // trzeci punkt glColor3f(1, 1, 0); glVertex3f(120, 220, 0); // czwarty punkt

glColor3f(1, 0, 1); glVertex3f(170, 240, 0); // pity punkt glColor3f(0.5, 0.5, 0.5); glVertex3f(220, 220, 0); // szsty punkt glEnd(); Pozostae prymitywy Nazwa Typ Pasek trjktw GL_TRIANGLE_STRIP Wachlarz trjktw GL_TRIANGLE_FAN Czworokt GL_QUADS Poczone czworokty GL_QUAD_STRIP Wielokt o dowolnej liczbie wierzchokw GL_POLYGON Kierunek rysowania Podczas podawania wierzchokw bardzo wane jest zachowywanie zawsze tego samego kierunku: zgodnego lub przeciwnego do wskazwek zegara. Jest to o tyle wane, e OpenGL w ten sposb rozpoznaje, czy ciana ma by przednia (zewntrzna, widoczna), czy tylna (wewntrzna, niewidoczna). Do okrelenia, ktry z kierunkw bdzie oznacza cian przedni, a ktry tyln suy funkcja glFrontFace. Przyjmuje ona jeden parametr okrelajcy kierunek rysowania, zgodny z ruchem wskazwek zegara GL_CW, lub kierunek przeciwny do ruchu wskazwek zegara GL_CCW. Czyszczenie bufora kolorw oraz gbi W OpenGL wyrniamy cztery rodzaje buforw: bufor koloru, gbi, szablonu (wzorca) i akumulacyjny. Najczciej stosowane s dwa pierwsze czyli bufor kolorw odpowiedzialny za prawidowe wywietlanie kolorw oraz bufor gbi odpowiedzialny za poprawne renderowanie obiektw w przestrzeni 3D. Za czyszczenie buforw odpowiedzialna jest funkcja: void glClear(GLbitfield mask) Parametrem tej funkcji s stae okrelajce rodzaj bufora (GL_COLOR_BUFFER_BIT, GL_DEPTH_BUFFER_BIT, GL_ACCUM_BUFFER_BIT, GL_STENCIL_BUFFER_BIT), ktry chcemy wyczyci. Bufory mona czy za pomoc operacji OR (operator | ). Dodatkowo do czyszczenie bufora kolorw na wybrany kolor suy funkcja: void glClearColor(GLfloat R, GLfloat G, GLfloat B, GLfloat A) Przyjmuje ona cztery parametry okrelajce kolor w formacie RGBA na jaki ma zosta wyczyszczony bufor. Antialiasing Antialiasing umoliwia wygadzenie ostrych krawdzi punktw lub linii. W OpenGL wczenie antialiasingu polega na aktywowaniu opcji GL_POINT_SMOOTH dla punktw lub GL_LINE_SMOOTH dla linii. Aktywowane odpowiednich funkcji dokonywane jest za pomoc funkcji: void glEnable(GLenum mode) Wyczenie opcji odbywa si przez wywoanie funkcji: void glDisable(GLenum mode)

Przykad 10: glEnable(GL_POINT_SMOOTH); Cieniowanie W przypadku kolorowania wieloktw, kolory okrelane s dla wierzchokw, a nie dla wieloktw. O tym, czy wielokt bdzie posiada jednolity kolor (kolor okrelony dla ostatniego wierzchoka), czy ten kolor bdzie si zmienia pynnie od wierzchoka do wierzchoka, decyduje model cieniowania. Aby ustawi odpowiedni model cieniowania wykorzystywana jest funkcja: void glShadeModel(GLenum mode) Funkcja przyjmuje jeden z dwch parametrw GL_FLAT okrelajcy model cieniowania jednolitego (paskiego) oraz GL_SMOOTH model cieniowania pynnego przejcia. Cieniowanie jest bardzo wanym elementem wizualizacji. Wykorzystywane jest m. in. przy obliczeniach zwizanych ze wiatem.

Biblioteka GLUT oprcz tworzenia okien i obsugi I/O posiada rwnie funkcje wywietlajce na ekranie najczciej uywane bryy geometryczne stworzone z trjktw. Wystarczy je wywoa w czci odpowiedzialnej za rysowanie obiektw, wszystkie figury s rysowane w rodku ekranu:

Obsuga klawiatury W bibliotece OpenGL obsuga klawiszy zostaa podzielona na dwie czci: obsug klawiszy zwykych (znaki ASCII) Klawiatura obsugiwana jest podobnie jak rysowanie w programie powinna zosta zadeklarowana funkcja o odpowiednich parametrach. Przy konfigurowaniu biblioteki GLUT naley ustali, ktra funkcja bdzie suya do obsugi klawiszy. Przykad (nacinicie klawisz ESC lub q bdzie skutkowao wyjciem z programu): void klawiatura(unsigned char key, int x, int y) { switch (key) { case 27 : case 'q': exit(0); break; } } W przypadku, gdyby zaistniaa potrzeba odmalowania ekranu po wciniciu klawisza, mona uy funkcji glutPostRedisplay(). obsug klawiszy specjalnych (strzaki, F1-F12 itp.) Obsuga klawiszy specjalnych realizowana jest w sposb analogiczny do obsugi zwykych klawiszy naley zadeklarowa funkcj o ustalonych parametrach, a nastpnie powiadomi o niej bibliotek GLUT. Szablon funkcji wyglda nastpujco (warto zwrci uwag na parametr key, ktry jest typu int; dla zwykych klawiszy uywany jest unsigned char): void keyboardSpecialKeys(int key, int x, int y) { switch(key) { case GLUT_KEY_UP : puts("Nacinito strzak do gry") break; } } Nastpnie naley powiadomi bibliotek, ktra z funkcji bdzie odpowiadaa za obsug klawiszy specjalnych: glutSpecialFunc(keyboardSpecialKeys); Oto najczciej uywane klawisze specjalne: GLUT_KEY_F1, GLUT_KEY_F2, ..., GLUT_KEY_F12 klawisze funkcyjne (F1 do F12) GLUT_KEY_PAGE_UP, GLUT_KEY_PAGE_DOWN klawisze Page Up i Page Down GLUT_KEY_HOME, GLUT_KEY_END klawisze Home i End GLUT_KEY_LEFT, GLUT_KEY_RIGHT, GLUT_KEY_UP, GLUT_KEY_DOWN klawisze strzaek GLUT_KEY_INSERT - klawisz Insert

Ukad wsprzdnych W grafice komputerowej 3D wykorzystuje si dwa ukady wsprzdnych: 1. lewoskrtny 2. prawoskrtny Rnica pomidzy nimi polega na innym traktowaniu kierunku wsprzdnej Z: w ukadzie lewoskrtnym wartoci na osi Z rosn w gb ekranu, natomiast w prawoskrtnym malej (zobrazowane na poniszych rysunkach). Biblioteka OpenGL posiada obsug jedynie ukadu prawoskrtnego (w DirectX moliwe jest korzystanie z obydwu typw). Fizyczne zamienienie jednego ukadu w drugi nie jest moliwe. Moliwe jest natomiast udawanie ukadu lewoskrtnego i odwrotnie poprzez umieszczanie przed kad wsprzdn wierzchoka osi Z znaku minusa.

Rzutowanie Rzutowanie jest operacj polegajc na tym, aby odpowiednie piksele na paskim ekranie byy wywietlane w taki sposb, by sprawia wraenie trjwymiarowej gbi (przestrzeni 3D) . Rzutowanie rwnie pozwala tworzy przestrze dwuwymiarow 2D dziki odpowiedniemu przeksztaceniu. OpenGL wyposaony jest w specjalne funkcje, dziki ktrym mona uzyska odpowiedni efekt rzutowania. Wyrniamy dwa typy rzutowania: 1. rzutowanie perspektywiczne (wykorzystywane w grach 3D), 2. rzutowanie ortogonalne (wykorzystywane w programach typu CAD/CAM). Rzutowanie perspektywiczne W rzutowaniu perspektywicznym obiekty pooone dalej od kamery s mniejsze od tych pooonych bliej. OpenGL udostpnia specjaln funkcj, ktra tworzy odpowiedni macierz perspektywy. void gluPerspective(GLdouble n, GLdouble a, GLdouble zN, GLdouble zF) Funkcja przyjmuje cztery parametry. Pierwszy parametr okrela kt widzenia (w stopniach, zalecana warto 60 stopni) w pionie. Drugi parametr okrela stosunek szerokoci do wysokoci okna (zazwyczaj podaje si szeroko okna, w ktrym wywietlana jest grafika podzielon przez wysoko). Dwa ostatnie parametry okrelaj granic przedni i tyln, z reguy parametr zN przyjmuje warto 1.0. Widok perspektywiczny tworzy stoek widzenia, ktrego granicami s wanie granica przednia i tylna. Wszystko co jest w stoku pojawia si na ekranie, obiekty znajdujce si poza stokiem nie s wywietlane.

Funkcja gluPerspective jak mona zauway, nie naley do biblioteki OpenGL. Jest ona czci biblioteki GLU (biblioteki pomocniczej). Oryginaln funkcj suc do ustawiania rzutowania perspektywicznego w bibliotece OpenGL jest glFrustum, gluPerspective jest jedynie nakadk na t funkcje. void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zN, GLdouble zF)

Funkcja przyjmuje sze parametrw. Pierwsze dwa parametry okrela praw i lew wsprzdn pionowej linii obcinania. Kolejne dwa parametry okrelaj grna i doln wsprzdn poziomej linii obcinania. Dwa ostatnie parametry okrelaj granic przedni i tyln. Rzutowanie ortogonalne Nazywane inaczej rzutowaniem prostoktnym lub rwnolegym. Polega ono na tym, e kady obiekt znajdujcy si w obszarze rysowania niezalenie od swojej odlegoci od kamery ma dokadnie t sam wielko. W OpenGL dostpna jest specjalna funkcja, ktra tworzy rzutowanie ortogonalne. void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far) Funkcja glOrtho tworzy tzw. bry widzenia (bry obcinania). Parametry left oraz right okrelaj szeroko bryy, parametry bottom oraz top jej wysoko. Dwa ostatnie parametry near i far okrelaj gbi. W obrbie bryy widzenia tworzone s obiekty, ktre s wywietlane na ekranie. To czy obiekt pojawi si na ekranie zaley od tego czy znajdzie si on w obszarze prostopadocianu. Rzutowanie ortogonalne wykorzystywane jest czsto w grach 2D oraz programach typu CAD/CAM.

Kamera Oprcz samego rzutowania w OpenGL bardzo wan rzecz jest kamera. Kamera okrela pooenie obserwatora (w przestrzeni 3D) wzgldem obserwowanych obiektw. OpenGL posiada funkcj tworzc macierz kamery. void gluLookAt(GLdouble x, GLdouble y, GLdouble z, GLdouble centerx, GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz) Funkcja przyjmuje dziewi argumentw. Pierwsze trzy argumenty (x,y,z) okrelaj pooenie kamery w przestrzeni trjwymiarowej. Kolejne trzy argumenty (center x, centery, centerz) okrelaj punkt na ktry skierowana jest kamera (patrzy kamera). Ostatnie trzy argumenty (upx, upy, upz) okrelaj wektor pionu kamery, dziki tym parametrom moliwe jest obracanie kamery. Macierz rzutowania i modelowania OpenGL oblicza wedug nastpujcego wzoru pozycj punktu w przestrzeni: [WYJCIOWA POZYCJA PUNKTU] = [MACIERZ RZUTOWANIA] * [MACIERZ MODELOWANIA] * [WEJSCIOWA POZYCJA PUNKTU] Dodatkowo w skad macierzy modelowania wchodz dwie osobne macierze (traktowane jako cao). Pierwsz z nich jest macierz przeksztace (zwizana z translacj, rotacj i skalowaniem), drug za macierz kamery. Macierz rzutowania (projekcji) Jak sama nazwa wskazuje zwizana jest z rzutowaniem. Aby umoliwi rzutowanie perspektywiczne lub ortogona lne naley przeczy si na macierz rzutowania. Do tego celu suy odpowiednia funkcja. void glMatrixMode(GL_PROJECTION) Zawsze po zaadowaniu macierzy rzutowania naley w OpenGL wywoa funkcje odpowiedzialn za zaadowanie tzw. macierzy tosamoci glLoa dIdentity (jest to funkcja bezparametrowa). Dopiero po tym moemy ustawi rzutowanie perspektywiczne lub ortogonalne za pomoc odpowiedniej funkcji gluPerspective, glOrtho. Macierz modelowania (widoku modelu) W identyczny sposb przeczamy si na macierz modelowania (widoku modelu), naley pamita o tym, e macierz modelowania zawiera w sobie dwie macierze (przeksztace i kamery). OpenGL zajmuje si nimi jako jedn caoci. void glMatrixMode(GL_MODELVIEW) Funkcja okna widoku Dziki tej funkcji moliwe jest ustalenie konkretnego okna widoku, czyli obszaru gdzie bdzie odbywa si renderowanie (rysowanie). Do tego celu suy funkcja. void glViewport(GLint x, GLint y, GLsizei width, GLsizei height) Przyjmuje ona cztery parametry, dwa pierwsza okrelaj wsprzdne lewego dolnego naronika, kolejne dwa wysoko i szeroko obszaru renderowania. Zazwyczaj definiuje si obszar na cae okno, wiec jako pierwsze dwa parametry podaje si (0,0), natomiast kolejne dwa ustawie si na szerokoci i wysoko okna.

Przeksztacenia Bardzo czsto programujc grafik 3D wystpuje potrzeba dokonywania przeksztace obiektw (przesuwanie, obracanie, skalowanie itp.). W bibliotece OpenGL, w celu dostarczenia tych funkcjonalnoci, zastosowano technik polegajc na modyfikowaniu caego ukadu wsprzdnych, dziki czemu przeksztacenia nakadaj si na siebie. Od strony programisty operacja ta polega na modyfikowaniu macierzy modelowania, zazwyczaj za pomoc dostarczanych funkcji, opisanych w dalszej czci instrukcji. Translacja Translacja jest przeksztaceniem polegajcym na przesuniciu obiektu o podany wektor (mwic cilej przesuniciu caego ukadu wsprzdnych). W bibliotece OpenGL realizowane jest to za pomoc funkcji: void glTranslatef(GLfloat x, GLfloat y, GLfloat z) void glTranslated(GLdouble x, GLdouble y, GLdouble z) Obie funkcje przyjmuj 3 parametry: x, y oraz z, ktre informuj bibliotek o ile jednostek przesun obiekt na osiach OX, OY oraz OZ. Funkcja mnoy bieca macierz modelowania (widoku modelu) przez macierz translacji. Nastpnie nowa macierz staje si biec macierz modelowania. Przykad 1. Przesunicie trjkta o wektor [-250, -100, -100]: void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glColor3f(0.0, 0.0, 1.0); glTranslatef(-250, -100, -100); /* <===== translacja, kady obiekt po tym wywoaniu bdzie przesunity o ten wektor [-250, -100, -100] */ glBegin(GL_TRIANGLES); glVertex3f(0, 200, 0); glColor3f(0.0, 1.0, 1.0); glVertex3f(50, 220, 0); glColor3f(1.0, 1.0, 1.0); glVertex3f(100, 200, 0); glEnd(); glutSwapBuffers(); } Skalowanie Skalowanie, podobnie jak w bibliotece Allegro, polega na zmniejszeniu lub powikszeniu obiektu o zadany wspczynnik, zdefiniowany dla kadej z osi: void glScalef(GLfloat x, GLfloat y, GLfloat z) void glScaled(GLdouble x, GLdouble y, GLdouble z) Funkcje przyjmuj wspczynniki skalowania dla kolejnych osi. Warto wspczynnika rwna 1 oznacza pozostawienie figury bez zmian.

Przykad 2. Zmniejszenie obiektu w osi OX o poow: glScalef(0.5, 1, 1); // zwyke rysowanie trjktw glBegin(GL_TRIANGLES); glVertex3f(0, 200, 0); // pierwszy punkt glColor3f(0.0, 1.0, 1.0); glVertex3f(50, 220, 0); // drugi punkt 2/7 glColor3f(1.0, 1.0, 1.0); glVertex3f(100, 200, 0); // trzeci punkt glEnd(); Rotacja Rotacja w OpenGL polega na obrocie ukadu wsprzdnych wok podanego wektora (np. wektor [0, 1, 0] obrci nam wok osi OY): void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z) void glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z) Parametr angle okrela o jaki kt (w stopniach) bdzie dokonywany obrt, natomiast x, y i z s to poszczeglne skadowe wektora. Funkcja mnoy biec macierz modelowania (widoku modelu) przez macierz obrotu. Kt obrotu okrelany jest w kierunku przeciwnym do ruchu wskazwek zegara, sam obrt dokonywany jest wok osi wyznaczonej przez wektor o pocztku w ukadzie wsprzdnych i kocu w punkcie (x,y,z). Nowa macierz staje si biec macierz modelowania. Wasne mnoenie macierzy Istnieje rwnie moliwo wasnego, rcznego wykonania wymienionych (i niewymienionych) przeksztace, za pomoc mnoenia biecej macierzy przez drug macierz. Odpowiedzialna za to jest funkcja: void glMultMatrixd(const GLdouble * m); void glMultMatrixf(const GLfloat * m); Inne przydatne funkcje Poniej zostay zebrane funkcje, ktre czasami s przydatne w aplikacjach z przeksztaceniami obiektw. Resetowanie macierzy Na pocztku funkcji rysujcej naley zawsze wczyta pocztkowe wartoci do macierzy modelowania. Dziki temu unikniemy sytuacji, w ktrej przeksztacenia bd si nakaday na siebie w nieskoczono. Aby zresetowa macierz widoku naley wywoa funkcj: void glLoadIdentity( void); Funkcja ta aduje macierz jednostkow, dziki czemu ukad wsprzdnych zostaje ustawiony na domylnym pooeniu. Oprcz macierzy modelowania, glLoadIdentity() mona stosowa do innych macierzy (tak na prawd glLoadIdentity po prostu wczytuje macierz jednostkow do aktualnie uywanej macierzy). Przeczanie pomidzy macierzami wykonuje si za pomoc glMatrixMode:

glMatrixMode(GL_PROJECTION); // Macierz projekcji glMatrixMode(GL_MODELVIEW); // macierz modelowania Tryb wypeniania Tryb wypeniania wieloktw umoliwia decydowanie o tym, jak ma by wypeniona przednia, a jak tylna strona wielokta. Do ustawia trybu wypeniania wieloktw suy funkcja: void glPolygonMode(GLenum face, GLenum mode) Jej pierwszy parametr okrela, ktrych cian bdzie dotyczy operacja (GL_FRONT, GL_BACK, GL_FRONT_AND_BACK). Drugi parametr okrela styl wypeniania cian wielokta (GL_LINE, GL_POINT, GL_FILL). Domylnie jest ustawiony GL_FILL czyli wypenianie caego wielokta. GL_LINE oznacza e bd widocznie jedynie linie tzw. tryb wireframe (druciak), GL_POINT oznacza, e bd widoczne jedynie punkty wielokta. Widoczno i ukrywanie krawdzi Czsto niepotrzebne jest rysowanie wewntrznych cian obiektw, rysowanie takie zajmuje jedynie dodatkow moc obliczeniow komputera. OpenGL umoliwia automatyczne usuwanie niewidocznych cian. Aby ukry niewidoczne ciany naley wczy opcj ukrywania niewidocznych powierzchni wieloktw za pomoc funkcji glEn able z parametrem GL_CULL_FACE. Nastpnie naley wywoa funkcj glCullFace. void glCullFace(GLenum face) Funkcja ta przyjmuje jeden z trzech parametrw GL_FRONT (ciana przednia), GL_BACK (ciana tylna), GL_FRONT_AND_BACK (ciana przednia i tylna). Ukrywanie krawdzi wykorzystywane jest w przypadku rysowania obiektw w trybie tzw. wireframe (siatki). Do ukrywani krawdzi suy specjalna funkcja OpenGL: void glEdgeFlag(GLenum flag) Funkcja ta przyjmuje jeden z dwch parametrw GL_TRUE (rysuj krawd), G L_FALSE (nie rysuj krawdzi). Przykad 3: glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glBegin(GL_POLYGON); glColor3f(0.5f, 0.5f, 0.5f); glEdgeFlag(GL_FALSE); glVertex3f(0.0f, 2.0f, 0.0f); glEdgeFlag(GL_TRUE); glVertex3f(2.0f, 2.0f, 0.0f); glVertex3f(2.0f, -2.0f, 0.0f); glVertex3f(-4.0f, -2.0f, 0.0f); glVertex3f(-5.0f, 0.0f, 0.0f); glEnd(); Timer Czasami wystpuje potrzeba wykonywania kodu w pewnych, ustalonych odstpach czasu (np. animacja). W celu rozwizania tego problemu programista/programici bibl ioteki glut dodali do niej obsug timerw. Timer jest funkcj, ktra wykonuje si co pewien zadany czas. Glut wymaga, aby funkcja ta miaa ustalone parametry: void funkcjaTimera(int value); Nastpnie naley zarejestrowa j (podobnie jak funkcje rysowania i klawiatury) za pomoc nastpujcej funkcji:

void glutTimerFunc(unsigned int msecs, void (*func)(int value), value); Parametry s nastpujce: msecs czas w milisekundach, po ktrym zostanie wywoana funkcja timera func wskanik na funkcj timera value warto przekazywana do funkcji timera (parametr value funkcji timera bdzie ustawiany na t warto) Uwaga! Ustawienie timera w funkcji glutTimerFunc spowoduje tylko jednorazowe jego wywoanie. Dlatego w funkcji timera najlepiej jest uy jej ponownie (patrz przykad 4). Glut umoliwia zadeklarowanie dowolnej liczby timerw (np. mona zadeklarowa dwa timery, ktre wykonuj si o rnym czasie). Przykad 4: void funkcjaTimera(int val) { // kod wykonywany w timerze //... // odrysowanie ekranu po wprowadzeniu zmian (jeli jest taka potrzeba): glutPostRedisplay(); // ponowne ustawienie timera (co 1000 ms = 1s): glutTimerFunc(1000, funkcjaTimera, 0); } int main(int argc, char *argv[]) { glutInit(&argc, argv); /* ... */ // ustawienie timera (wywoa funkcj funkcjaTimera po 1000 ms = 1s): glutTimerFunc(1000, funkcjaTimera, 0); glutMainLoop(); return(0); }

You might also like