Rzutowanie DOROTA SMORAWA
Rzutowanie Rzutowanie jest operacja polegająca na tym, aby odpowiednie piksele na płaskim ekranie były wyświetlane w taki sposób, by sprawiać wrażenie trójwymiarowej głębi (przestrzeni 3D). Rzutowanie również pozwala tworzyć przestrzeń dwuwymiarowa 2D dzięki odpowiedniemu przekształceniu. Biblioteka OpenGL wyposażona jest w funkcje umożliwiające uzyskanie odpowiedniego efektu rzutowania. Wyróżniane są dwa typy rzutowania: - perspektywiczne - glfrustum oraz gluperspective, - ortogonalne (prostokątne) glortho.
Rzutowanie void Reshape( int width, int height ) { // obszar renderingu - całe okno glviewport (0,0,width,height); // wybór macierzy rzutowania glmatrixmode (GL_PROJECTION); // macierz rzutowania = macierz jednostkowa glloadidentity (); // ustawienie parametrów zakresu rzutni GLdouble aspect = 1; GLfloat zakres = 5.0f; GLfloat blisko = 1.0f; GLfloat daleko = 10.0f;
Rzutowanie ortogonalne if (rzut == ORTO) { if (skala == ASPECT_1_1) { if (width < height && width > 0) glortho (-zakres,zakres,-zakres*height/width,zakres*height/width,-zakres,zakres); else if (width >= height && height > 0) glortho (-zakres*width/height,zakres*width/height,-zakres,zakres,-zakres,zakres); } else glortho (-zakres,zakres,-zakres,zakres,-zakres,zakres); }
Rzutowanie perspektywiczne if (rzut==frust) { if (skala==aspect_1_1) { if (width < height && width > 0) glfrustum (-zakres,zakres,-zakres*height/width,zakres*height/width,blisko,daleko); else if (width >= height && height > 0) glfrustum (-zakres*width/height,zakres*width/height,-zakres,zakres,blisko,daleko); } else glfrustum (-zakres,zakres,-zakres,zakres,blisko,daleko); }
Rzutowanie perspektywiczne if (rzut==persp) { if (height > 0) aspect = width/(gldouble)height; gluperspective (fovy,aspect,blisko,daleko); } } // generowanie sceny 3D Display();
Funkcja menu void Menu( int value ) { switch (value) { // wyjście case EXIT: exit (0); case FULL_WINDOW: skala=full_window; Reshape (glutget (GLUT_WINDOW_WIDTH),glutGet (GLUT_WINDOW_HEIGHT)); break;
Funkcja menu case ASPECT_1_1: skala=aspect_1_1; Reshape (glutget (GLUT_WINDOW_WIDTH),glutGet (GLUT_WINDOW_HEIGHT)); break; case ORTO: rzut=orto; Reshape (glutget (GLUT_WINDOW_WIDTH),glutGet (GLUT_WINDOW_HEIGHT)); break;
Funkcja menu case FRUST: rzut=frust; Reshape (glutget (GLUT_WINDOW_WIDTH),glutGet (GLUT_WINDOW_HEIGHT)); break; case PERSP: rzut=persp; Reshape (glutget (GLUT_WINDOW_WIDTH),glutGet (GLUT_WINDOW_HEIGHT)); } break; }
Menu Uzupełniamy w funkcji main wywołanie funkcji menu o kolejne pola: glutcreatemenu( Menu ); // dodadnie pozycji do menu podręcznego glutaddmenuentry ("Rodzaj skalowania - całe okno",full_window); glutaddmenuentry ("Rodzaj skalowania - skala 1:1",ASPECT_1_1); glutaddmenuentry ("Rzutowanie ortogonalne", ORTO); glutaddmenuentry ("Rzutowanie frustum", FRUST); glutaddmenuentry ("Rzutowanie perspective", PERSP); glutaddmenuentry ("Wyjście",EXIT);
Funkcja klawiatury Biblioteka OpenGL umożliwia nam posługiwanie się klawiszami podstawowymi klawiatury. Do obsługi klawiszy należy zdefiniować funkcję realizującą polecenia wywoływane wciskaniem poszczególnych klawiszy. Funkcję klawiatury wywołujemy w funkcji main za pomocą polecenia: // dołączenie funkcji obsługi klawiatury glutkeyboardfunc (Funkcja_klawiatury);
Funkcja klawiatury void Funkcja_klawiatury (unsigned char key, int x, int y) { // klawisz + if (key == 'l') { xx=0; yx=1; zx=0; obrot_x=obrot_x+5; }
Funkcja klawiatury if (key == 'r') { xx=0; yx=1; zx=0; obrot_x=obrot_x-5; }
Funkcja klawiatury if (key == 'u') { xy=1; yy=0; zy=0; obrot_y=obrot_y+5; }
Funkcja klawiatury if (key == 'd') { xy=1; yy=0; zy=0; obrot_y=obrot_y-5; } // odrysowanie okna Reshape (glutget (GLUT_WINDOW_WIDTH),glutGet (GLUT_WINDOW_HEIGHT)); }
Obrót i przesunięcie Ustaliliśmy sobie w ten sposób, co ma się dziać po wciśnięciu klawiszy u,d,l,r, czyli u to obrót do góry, d to obrót na dół, l to obrót w lewo, a r to obrót w prawo. Funkcje odpowiadające za obrót umieszczamy przed zdefiniowaniem obiektu, którym chcemy obracać, a więc albo w funkcji rysującej wszystkie obiekty na scenie i wywoływanej w funkcji sceny, albo, jeśli obiekty rysujemy bezpośrednio w funkcji sceny, tuż przed zdefiniowaniem takiego obiektu. Do obrotu służy funkcja glrotate: // obrót wokół osi y dla klawiszy l i r glrotatef(obrot_x, 0.0f, 1.0f, 0.0f); // obrót wokół osi x dla klawiszy u i d glrotatef(obrot_y, xy, yy, zy);
Obrót i przesunięcie Możemy dokonywać przesuwania obiektów za pomocą funkcji gltranslate. Możemy również konfigurować początkowe położenie obserwatora poprzez przesunięcie całego układy kartezjańskiego współrzędnych. // przesunięcie obiektu o wektor [0,0,-3] gltranslatef (0.0f,0.0f,-3.0f);
Opis funkcji glmatrixmode składnia Określa aktualnie używaną macierz. Pozwala określić, który stos macierzy będzie stosowany w czasie manipulacji na macierzach void glmatrixmode (GLenum mode) parametry mode określa stos macierzy: GL_MODELVIEW stos macierzy modelwidok (do przemieszczania obiektów na scenie), GL_PROJECTION stos macierzy rzutowania (do definiowania przestrzeni ograniczającej), GL_TEXTURE stos macierzy tekstur (do manipulowania współrzędnymi tekstur)
Opis funkcji gltranslatef składnia parametry Mnoży aktualną macierz przez macierz przesunięcia. Powstała w ten sposób macierz staje się aktualną macierzą przekształceń void gltranslatef (GLfloat x, GLfloat y, GLfloat z) x, y, z współrzędne wektora przesunięcia
Opis funkcji glulookat składnia parametry Definiuje przekształcenie punktu widzenia. Na podstawie pozycji oka, środka sceny i wektora wskazującego górę perspektywy widza, funkcja tworzy przekształcenie punktu widzenia void glulookat (GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx, GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz) eyex, eyey, eyez współrzędne x, y, z oka, centerx, centery, centerz współrzędne x, y, z środka sceny, na którą patrzymy upx, upy, upz współrzędne x, y, z definiujące wektor wskazujący w górę
Opis funkcji glloadidentity składnia Nadaje aktualnej macierzy wartości macierzy jednostkowej. W ten sposób aktualny układ współrzędnych staje się zgodny z układem współrzędnych okna void glloadidentity (void)
Opis funkcji glortho składnia parametry Definiuje przestrzeń ograniczającą rzutowania prostopadłego. Obiekty znajdujące się daleko od widza nie są pomniejszane void glortho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far) left najbardziej wysunięta w lewą stronę współrzędna right najbardziej wysunięta w prawą stronę współrzędna bottom najbardziej wysunięta w dół współrzędna top najbardziej wysunięta w górę współrzędna near odległość od widza bliskiej płaszczyzny ograniczającej far odległość od widza odległej płaszczyzny ograniczającej
Opis funkcji glfrustum Tworzy macierz perspektywy, dzięki której można uzyskać rzutowanie perspektywiczne składnia void glfrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble znear, GLdouble zfar) parametry lef, right współrzędne lewej i prawej płaszczyzny ograniczającej bottom, top współrzędne dolnej i górnej płaszczyzny ograniczającej znear, zfar współrzędne bliskiej i dalekiej płaszczyzny ograniczającej. Obie wartości muszą być dodatnie.
Opis funkcji glutkeyboardfunc składnia Ustala dla aktualnego okna funkcję zwrotną zajmującą się obsługą klawiatury. Rejestruje funkcję zwrotną, gdy tylko zostanie naciśnięta kombinacja klawiszy generujących jakiś znak ASCII void glutkeyboardfunc (void (*func) (unsigned char key, int x, int y)) parametry func nazwa funkcji wywoływanej przez bibliotekę GLUT przy naciśnięciu klawisza
Opis funkcji glutspecialfunc Składnia parametry Dla aktualnego okna ustala funkcję zwrotną obsługującą naciśnięcia klawiszy niegenerujących znaków ASCII. Dodatkowo podawane są aktualne współrzędne x i y kursora myszy void glutspecialfunc (void (*func) (int key, int x, int y)) func nazwa funkcji wywoływanej przez bibliotekę GLUT przy naciśnięciu klawiszy niegenerujących znaków ASCII (GLUT_KEY_F1, GLUT_KEY_RIGHT itd.)
Opis funkcji glrotatef Wykonuje obrót aktualnej macierzy zgodnie z podaną macierzą obrotu składnia void glrotatef (GLdouble angle, GLdouble x, Gldouble y, GLdouble z) parametry angle podawany w stopniach kąt obrotu w kierunku przeciwnym do ruchu wskazówek zegara x, y, z wektor kierunku od początku układu współrzędnych stosowany jako oś obrotu
Opis funkcji gluperspective Definicja macierz rzutowania perspektywicznego Składnia void gluperspective(gldouble fove, GLdouble aspect, Gldouble znear, GLdouble zfar) Parametry fovy kąt widzenia w kierunku pionowym podawany w stopniach aspect współczynnik kształtu. Stosowany jest do definiowania kąta widzenia w kierunku poziomym znear, zfar - odległość od bliskiej i dalekiej płaszczyzny ograniczającej. Obie wartości muszą być dodatnie
Literatura - Richard S. Wright jr, Michael Sweet: OpenGL Księga eksperta Wydanie III, Helion2005 - Pomoce dydaktyczne i instrukcje, http://icis.pcz.pl/~mkubanek - Jackie Neider, Tom Davis, Mason Woo: OpenGL Programming Guide The RedBook - Kevin Hawkins, Dave Astle: OpenGL. Programowanie gier, Helion 2003 - The official OpenGL web page, http://www.opengl.org - http://januszg.hg.pl/opengl/