#include <windows.h> #include <gl/glut.h> #include <gl/glu.h> float kat=0.0f; void renderujscene(void) { glclearcolor(1.0f,1.0f,1.0f,1.0f); glclear(gl_color_buffer_bit); glpushmatrix(); glrotatef(kat,0,0,1); glbegin(gl_quads); glcolor3f(1.0f,0.0f,0.0f); glvertex3f(-1.0f,-1.0f,-5.0f); glcolor3f(0.0f,0.0f,1.0f); glvertex3f(1.0f,-1.0f,-5.0f); glcolor3f(0.0f,1.0f,0.0f); glvertex3f(1.0f,1.0f,-5.0f); glcolor3f(1.0f,1.0f,0.0f); glvertex3f(-1.0f,1.0f,-5.0f); glend(); glpopmatrix(); kat+=0.2f; glutswapbuffers(); } Grafika 3D OpenGL część II Przód i tył wielokąta, tryb siatki wielokątów, bryły, bufor głębi, kwadryki, obiekty GLUT, obsługa klawiatury i myszy. Michał Dudkiewicz jaymz@mat.umk.pl
OpenGL przód i tył wielokąta CULLFACE OpenGL pozwala określid gdzie znajduje się przód a gdzie tył wielokąta, następnie możliwe jest wyłączenie renderowania niewidocznej strony wielokąta. Znacząco zwiększa to wydajnośd generowania grafiki 3D. Proces ukrywania krawędzi odbywa się przy pomocy 3 funkcji: 1. Zdefiniowania, która strona wielokąta jest przednia, a która tylna glfrontface(gl_cw); GL_CCW czyli strona przednia to ta, której wierzchołki ułożone są przeciwnie do ruchu wskazówek zegara GL_CW czyli przednia strona to ta, której wierzchołki ułożone są zgodnie z ruchem wskazówek zegara 2
OpenGL przód i tył wielokąta CULLFACE 2. Zdefiniowania, której strony wielokąta nie renderowad glcullface(gl_front); GL_FRONT nie renderowad strony przedniej GL_BACK nie renderowad strony tylnej GL_FRONT_AND_BACK nie renderowad żadnej ze stron 3. Włączenie ukrywania niewidocznych powierzchni glenable(gl_cull_face ); Wyłączenie ukrywania niewidocznych powierzchni gldisable(gl_cull_face ); 3
OpenGL przód i tył wielokąta CULLFACE OpenGL pozwala włączyd zamiast pełnego renderowania tak zwany tryb siatki wielokątów. Włączenie odbywa się przy pomocy funkcji: glpolygonmode(gl_front_and_back, GL_LINE); Powrót do trybu pełnego renderowania glpolygonmode(gl_front_and_back, GL_FILL); GL_FRONT przednia strona GL_BACK strony tylna GL_FRONT_AND_BACK obie strony 4
OpenGL Z-bufor (bufor głębi) Zadaniem Z-bufora jest ukrywanie (usuwanie) niewidocznych (przysłanianych) elementów renderowanej sceny. Prawidłowe włączenie bufora głębokości wymaga: 1. W przypadku biblioteki GLUT - dodania stałej GLUT_DEPTH glutinitdisplaymode(glut_double GLUT_RGB GLUT_DEPTH); 2. Włącznie algorytmu Z-bufora glenable(gl_depth_test); 3. Wyczyszczenie zawartości Z-bufora glclear(gl_color_buffer_bit GL_DEPTH_BUFFER_BIT); 5
OpenGL kwadryki Biblioteka pomocnicza GLU udostępnia kilka gotowych funkcji renderujących popularne bryły geometryczne (kwadryki): dyski, cylindry, sfery. Tworzenie obiektu kwadryki wymaga: 1. Zadeklarowania zmiennej typu GLUquadricObj GLUquadricObj *kwadryka; 2. Przydzielenia pamięci dla obiektu kwadryki kwadryka = glunewquadric(); 3. Utworzenia konkretnej kwadryki (dysku, cylindra, sfery) 6
OpenGL kwadryki (dysk) gludisc(kwadryka,r1,r2,a,b); r1 promieo wewnętrznego dysku który będzie wycięty w dysku zewnętrznych (gdy r1 = 0.0f to dysk jest kołem) r2 promieo zewnętrznego dysku a,b - definiują gęstośd siatki na której rozpięty będzie dysk Im większy parametr a tym bardziej okrągły będzie dysk Im większy parametr b tym dysk będzie ładniej wyglądał po dodaniu światła 7
OpenGL kwadryki (wycinek dysku) glupartialdisc(kwadryka,r1,r2,a,b,kat_p,kat_k); r1 promieo wewnętrznego dysku który będzie wycięty w dysku zewnętrznych (gdy r1 = 0.0f to dysk jest kołem) r2 promieo zewnętrznego dysku a,b - definiują gęstośd siatki na której rozpięty będzie dysk Im większy parametr a tym bardziej okrągły będzie dysk Im większy parametr b tym dysk będzie ładniej wyglądał po dodaniu światła kat_p,kat_k kąt początkowy i koocowy 8
OpenGL kwadryki (cylinder) r1 promieo dolnej podstawy r2 promieo górnej podstawy glucylider(kwadryka,r1,r2,h,a,b); a,b - definiują gęstośd siatki na której rozpięty będzie dysk h wysokośd cylindra Im większy parametr a tym bardziej okrągły będzie dysk Im większy parametr b tym dysk będzie ładniej wyglądał po dodaniu światła 9
OpenGL kwadryki (sfera) i inne bryły r promieo sfery glusphere(kwadryka,r,a,b); a,b - definiują gęstośd siatki na której rozpięty będzie dysk Uwaga! Należy ostrożnie podawad wartości rozpiętości siatki (parametry a,b) zbyt duże wartości mogą bardzo spowolnid renderowanie. Aby narysowad inne bryły np.: sześcian należy je skonstruowad z wielokątów. Sześcian uzyskamy rysując 6 odpowiednio ułożonych kwadratów. 10
OpenGL obiekty GLUT Biblioteka GLUT udostępnia kilka gotowych funkcji renderujących obiekty trójwymiarowe: czajnik, kula, stożek, czworościan, sześcian, ośmiościan, dwunastościan, dwudziestościan. Czajnik: Kula: glutsolidteapot(rozmiar); glutwireteapot(rozmiar); glutsolidsphere(rozmiar,a,b); glutwiresphere(rozmiar,a,b); rozmiar określa wielkośd obiektu a,b definiują gęstośd siatki na której rozpięty będzie dysk 11
OpenGL obiekty GLUT Stożek: glutsolidcone(rozmiar,wysokosc,a,b); glutwirecone(rozmiar,wysokosc,a,b); Czworościan foremny: glutsolidtetrahedron(); glutwiretetrahedron(); Sześcian: glutsolidcube(rozmiar); glutwirecube(rozmiar); rozmiar określa wielkośd obiektu, wysokosc określa wysokośd obiektu a,b definiują gęstośd siatki na której rozpięta jest bryła 12
OpenGL obiekty GLUT Ośmiościan foremny: glutsolidoctahedron(); glutwireoctahedron(); Dwunastościan foremny: glutsoliddodecahedron(); glutwiredodecahedron(); Dwudziestościan foremny: glutsolidicosahedron(); glutwireicosahedron(); 13
GLUT klawiatura glutkeyboardfunc(klawiatura) funkcja odpowiedzialna za zarejestrowanie funkcji obsługującej znaki ASCII a na klawiaturze void klawiatura(const char c, int x, int y) { switch(c) { case 1 : //zrób coś break; case 2 : //zrób coś innego break; } glutpostredisplay(); } 14
GLUT klawiatura glutspecialfunc(klawiatura) funkcja odpowiedzialna za zarejestrowanie funkcji obsługującej znaki specjalne na klawiaturze void klawiatura(int c, int x, int y) { switch(c) { case GLUT_KEY_F1: //zrób coś break; case GLUT_KEY_PAGE_UP: //zrób coś innego break; } glutpostredisplay(); } 15
GLUT mysz Funkcja glutmousefunc(mysz) odpowiada za obsługę zdarzeo wciśnięcia i zwolnienia danego przycisku myszy. Parametr mysz musi byd funkcją o następującym nagłówku: void mysz(int przycisk, int stan, int x, int y); przycisk może przyjąd jedną z wartośdi: GLUT_LEFT_BUTTON, GLUT_RIGHT_BUTTON, GLUT_MIDDLE_BUTTON stan może przyjąd jedną z wartości: GLUT_DOWN, GLUT_UP x,y przekazują współrzędne położenia kursora myszy w oknie 16
GLUT mysz Funkcja glutpassivemotionfunc(mysz) odpowiada za obsługę zdarzeo ruchu kursora myszy bez wciśnięcia jakiegokolwiek przycisku myszy. Funkcja glutmotionfunc(mysz) odpowiada za obsługę zdarzeo ruchu kursora myszy przy wciśniętym danym przycisku myszy. W obu przypadkach parametr mysz musi byd funkcją o następującym nagłówku: void mysz(int x, int y); x,y przekazują współrzędne położenia kursora myszy w oknie 17