12.07.2015 Views

Grafika 3D - OpenGL

Grafika 3D - OpenGL

Grafika 3D - OpenGL

SHOW MORE
SHOW LESS
  • No tags were found...

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Grafika</strong> <strong>3D</strong> - <strong>OpenGL</strong><strong>OpenGL</strong> API<strong>OpenGL</strong> API (Application Programming Interface - interfejs programowaniaaplikacji) podzielone jest na trzy osobne biblioteki:1. właściwa biblioteka <strong>OpenGL</strong> obejmuje funkcje zatwierdzone przez <strong>OpenGL</strong>Architecture Review Board. Nazwy funkcji pochodzących z tej bibliotekirozpoczynają się przedrostkiem gl.2. biblioteka pomocnicza GLU (Utility Library) została stworzona przy użyciufunkcji <strong>OpenGL</strong>. Zawiera funkcje ułatwiające rysowanie kul, cylindrów iobiektów NURBS. Nazwy funkcji w tej bibliotece są poprzedzoneprzedrostkiem glu.3. AUX (Auxiliary) zawiera zestaw narzędzi do realizacji zadao zależnych dosystemu operacyjnego (np. tworzenie okien). Obecnie zamiast biblioteki AUXzalecane jest stosowanie interfejsu GLUT.Laboratorium Grafiki i Multimediów3


<strong>Grafika</strong> <strong>3D</strong> - <strong>OpenGL</strong><strong>OpenGL</strong> – układ współrzędnychPrawoskrętnyukład współrzędnychV Laboratorium Grafiki i Multimediów4


<strong>Grafika</strong> <strong>3D</strong> - <strong>OpenGL</strong><strong>OpenGL</strong> – nazewnictwo funkcjiglColor3f(...)Biblioteka(<strong>OpenGL</strong>)NazwafunkcjiLiczbaargumentówTypargumentówLaboratorium Grafiki i Multimediów5


<strong>Grafika</strong> <strong>3D</strong> - <strong>OpenGL</strong>GLFW, GLEWGLFW (An <strong>OpenGL</strong> Framework) – wieloplatformowa biblioteka wspomagającatworzenie aplikacji <strong>OpenGL</strong> (okna, mysz, klawiatura, wątki), aktualna wersja 2.6http://glfw.sourceforge.net/GLEW – wieloplatformowa biblioteka wspomagająca używanie rozszerzeodostępnych na specyficznych platformach sprzętowych (różnych akceleratorachgraficznych) przez aplikacje <strong>OpenGL</strong>, aktualna wersja 1.5.0http://glew.sourceforge.net/Laboratorium Grafiki i Multimediów6


<strong>Grafika</strong> <strong>3D</strong> - <strong>OpenGL</strong>GLUTGLUT (<strong>OpenGL</strong> Utility Toolkit) jest biblioteką użytkową, która wykonuje głównieoperacje wejścia/wyjścia na poziomie systemu operacyjnego.http://www.opengl.org/resources/libraries/glut/Głównymi dwoma celami, dla których powstała biblioteka GLUT są:1. umożliwienie pisania prostego, przenośnego kodu na wiele platform (GLUTjest niezależny od platformy)2. ułatwienie procesu uczenia się <strong>OpenGL</strong>-a.Funkcje biblioteki GLUT zaczynają się od prefiksu glut.Laboratorium Grafiki i Multimediów7


<strong>Grafika</strong> <strong>3D</strong> - <strong>OpenGL</strong>GLUTUwaga !Istnieje wiele bibliotek okienkowych przystosowanych do łatwej obsługi <strong>OpenGL</strong>,jednak w fazie początkowej nauki programowania w <strong>OpenGL</strong> powinno sie używadbiblioteki maksymalnie prostej.Punkt ciężkości musi byd skierowany na naukę programowania grafiki, a nie nauczenie się skomplikowanych bibliotek okienkowych !GLUT wymaga niewielu linii kodu źródłowego aby uruchomid prosty program zwykorzystaniem biblioteki <strong>OpenGL</strong>Laboratorium Grafiki i Multimediów8


<strong>Grafika</strong> <strong>3D</strong> - <strong>OpenGL</strong>GLUT – callbackCallback (wywołanie zwrotne) jest to technika programowania będącaodwrotnością wywołania funkcji.Zwykle korzystanie z właściwości konkretnej biblioteki polega na wywołaniufunkcji (podprogramów) dostarczanych przez tę bibliotekę.W tym przypadku jest odwrotnie: użytkownik jedynie rejestruje funkcję dopóźniejszego wywołania, natomiast funkcje biblioteki wywołają ją w stosownymdla siebie czasie.GLUT korzysta z mechanizmów callback m.in. do obsługi klawiatury, myszy,renderowania.10Laboratorium Grafiki i Multimediów


<strong>Grafika</strong> <strong>3D</strong> - <strong>OpenGL</strong>GLUT – minimalny program#include void RenderScene(void) {glClearColor(0.0f,0.0f,1.0f,1.0f);glClear(GL_COLOR_BUFFER_BIT);glFlush();}void main(int argc, char** argv) {glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowSize(800,600);glutInitWindowPosition(10,10);glutCreateWindow("<strong>OpenGL</strong>");glutDisplayFunc(RenderScene);glutMainLoop();}11Laboratorium Grafiki i Multimediów


<strong>Grafika</strong> <strong>3D</strong> - <strong>OpenGL</strong>GLUT – fullscreen i gamemodeFullscreen – tryb pełnoekranowyglutFullScreen();Powrót z trybu pełnoekranowego do oknaglutReshapeWindow(800,600);Gamemode – tryb pełnoekranowy inaczejglutGameModeString("800x600:32");if (glutGameModeGet(GLUT_GAME_MODE_POSSIBLE))glutEnterGameMode();else exit(1);Powrót z trybu gamemodeglutLeaveGameMode();12Laboratorium Grafiki i Multimediów


<strong>Grafika</strong> <strong>3D</strong> - <strong>OpenGL</strong><strong>OpenGL</strong> – rzutowaniepromienie rzutującerzutniaRzutowanie perspektywiczneRzutowanie równoległe13Laboratorium Grafiki i Multimediów


<strong>Grafika</strong> <strong>3D</strong> - <strong>OpenGL</strong><strong>OpenGL</strong> – rzutowanie perspektywicznegluPerspective(kat,ratio,zNear,zFar);glFrustum(l,p,d,g,zNear,zFar);kat – kąt widzenia w pionie (zalecana wartośd 60°)ratio – stosunek szerokości do wysokości oknazNear, zFar – płaszczyzny obcinania (przednia i tylna)l,p,d,g – położenie krawędzi przedniej płaszczyzny obcinaniaostrosłup widzeniatylna płaszczyzna obcinania (zFar)przednia płaszczyzna obcinania (zNear)14Laboratorium Grafiki i Multimediów


<strong>Grafika</strong> <strong>3D</strong> - <strong>OpenGL</strong><strong>OpenGL</strong> – rzutowanie ortogonalneglOrtho(l,p,d,g,zNear,zFar);zNear, zFar – płaszczyzny obcinania (przednia i tylna)l,p,d,g – położenie krawędzi przedniej płaszczyzny obcinaniaFunkcja wyznacza prostopadłościan widzenia.Rzutowanie ortogonalne zachowuje kształt i rozmiar (wykorzystywane jest częstow rysunku technicznym i programach typu CAD)Rzutowanie perspektywiczne odzwierciedla sposób widzenia człowieka (dlategojest najczęstszym rzutowaniem wykorzystywanym w grafice <strong>3D</strong>).Wielkośd rzutuzmniejsza się przy wzroście odległości między środkiem rzutowania a obiektem.Zniekształcane są kształty i wymiary obiektów.15Laboratorium Grafiki i Multimediów


<strong>Grafika</strong> <strong>3D</strong> - <strong>OpenGL</strong><strong>OpenGL</strong> – kameragluLookAt(poz_x,poz_y,poz_z,look_x,look_y,look_z,ux,uy,uz);Wektor pionupoz_x,poz_y,poz_z – wyznaczają położenie kamery w przestrzenilook_x,look_y,look_z – wyznaczają punkt na który „patrzy” kameraux,uy,uz – wyznaczają wektor pionu kamery (najczęściej )16Laboratorium Grafiki i Multimediów


<strong>Grafika</strong> <strong>3D</strong> - <strong>OpenGL</strong>GLUT – rzutowanie i ustawienie kameryvoid widok(int s,int w) {glViewPort(0,0,s,w);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(60.0f,(float)s/(float)w,1.0f,1000.0f);glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(0.0f, 0.0f, 10.0f,0.0f, 0.0f, 0.0f,0.0f, 1.0f, 0.0f);}...glutReshapeFunc(widok);17Laboratorium Grafiki i Multimediów


<strong>Grafika</strong> <strong>3D</strong> - <strong>OpenGL</strong><strong>OpenGL</strong> - prymitywyPrymityw - ogólne określenie najprostszych elementów grafiki <strong>3D</strong>.Takimi elementami są m.in.: punkt, linia, trójkąt, czworokąt.W <strong>OpenGL</strong> dostępne są następujące prymitywy:• punkt (GL_POINTS)• linia (GL_LINES)• łamana (GL_LINE_STRIP)• łamana zamknięta (GL_LINE_LOOP)• wielokąt (GL_POLYGON)• trójkąt, paski trójkątów, wachlarz trójkątów• czworokąt, paski czworokątów18Laboratorium Grafiki i Multimediów


<strong>Grafika</strong> <strong>3D</strong> - <strong>OpenGL</strong><strong>OpenGL</strong> – renderowanie prymitywówRenderowanie prymitywów rozpoczyna się wywołaniem glBegin() z odpowiednimparametrem, następnie podaje się odpowiednio listę wierzchołków i kooczywywołaniem glEnd();Przykład:glBegin(GL_LINES);glVertex3f(-3.0f, 0.0f, 0.0f);glVertex3f( 3.0f, 0.0f, 0.0f);glEnd();19Laboratorium Grafiki i Multimediów


<strong>Grafika</strong> <strong>3D</strong> - <strong>OpenGL</strong><strong>OpenGL</strong> – paski trójkątów GL_TRIANGLE_STRIPPaski trójkątów są używane gdy przy tworzeniu obiektu z siatki trójkątów niektórewierzchołki są wspólne dla niektórych trójkątów. Paski pozwalają zaoszczędzidliczbę wywołao funkcji glVertex3f.w2w4w2w3w5w1w3w5w1w420Laboratorium Grafiki i Multimediów


<strong>Grafika</strong> <strong>3D</strong> - <strong>OpenGL</strong><strong>OpenGL</strong> – wachlarze trójkątów GL_TRIANGLE_FANWachlarze trójkątów są podobne do pasków trójkątów. Tworzy się jedenwierzchołek, a następnie wyznacza współrzędne trójkątów, które będą go otaczad.Za pomocą wachlarzy można bardzo wygodnie tworzyd koła i okręgi.w2w3w4w1w5w7w621Laboratorium Grafiki i Multimediów


<strong>Grafika</strong> <strong>3D</strong> - <strong>OpenGL</strong><strong>OpenGL</strong> – paski czworokątów GL_QUAD_STRIPPaski czworokątów podobnie jak paski trójkątów pozwalają zaoszczędzidna wywołaniach funkcji glVertex3f. Kolejne czworokąty powstają z dwóchpoprzednich wierzchołków oraz dwóch nowych wierzchołków.w2w4w6w1w3w522Laboratorium Grafiki i Multimediów


<strong>Grafika</strong> <strong>3D</strong> - <strong>OpenGL</strong><strong>OpenGL</strong> – przekształcenia geometryczneTranslacja (przesunięcie o wektor)glTranslatef(x,y,z);gdzie x,y,z to wektor przesunięciaObrót o zadany kątglRotatef(kat,x,y,z);gdzie x,y,z to wektor wyznaczający oś obrotu, kat to kąt obrotuSkalowanieglScalef(αx,βy,γz);gdzie αx,βy,γz to współczynniki skalowania w osiach OX, OY, OZ23Laboratorium Grafiki i Multimediów


<strong>Grafika</strong> <strong>3D</strong> - <strong>OpenGL</strong>GLUT - animacjaAnimacja przy pomocy biblioteki GLUT jest bardzo prosta do zrealizowania.1. Należy utworzyd okno w trybie podwójnego buforowaniaglutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);2. Za pomocą odkładania macierzy na stos w funkcji odpowiedzialnej zarenderowanie zdefiniowad przekształcenia geometryczne (animację):glPushMatrix();glRotatef(kat,0,1,0);//nasz obiekt/obiektyglPopMatrix();glutSwapBuffers();kat+=0.2f;3. Wykorzystując funkcję glutIdleFunc() i mechanizm callback należyzarejestrowad funkcję renderującą (spowoduje to nieskooczonewywoływanie funkcji renderującej)24Laboratorium Grafiki i Multimediów

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!