1 Współrzędne jednorodneWykład z grafiki komputerowej II (3D) Jacek Matulewski ( Grafika 3D Współrzędne jednorodne Wersja: 15 listopada 2007
2 Transformacje Podstawowe pojęcia grafiki 3D:Transformacje – określane we współrzędnych sceny 3D translacja (glTranslatef), obrót (glRotatef) skalowanie (glScalef), pochylenie złożenie – dowolna macierz 4x4 (glMultMatrixf) Transformacje muszą być ustalone przed narysowaniem wierzchołka, np..: glRotatef(45.0f, 0.0f, 1.0f, 0.0f); //kąt, kierunek osi glVertex3f(…);
3 Transformacje Współrzędne jednorodne (homogenous coordinates)Wprowadzone w 1946 przez E. Maxwella (rzutowanie) W 1965 L. Roberts użył ich do zunifikowania zapisu wszystkich transformacji: translacji, obrotów, skalowanie i pochylania Opis punktów n-wymiarowej przestrzeni za pomocą n+1 współrzędnych Obcinanie we współrzędnych jednorodnych może odbywać się w sześcianie zamiast w ściętym ostrosłupie (znacznie efektywniejsze numerycznie)
4 Transformacje We współrzędnych kartezjańskich (2D) obrót i translacja mogą być zapisane: We współrzędnych jednorodnych:
5 Macierze w C++ Należy pamiętać, że macierze w C++ zapisywane są kolumnami (M[nr kolumny+rozmiar*nr wiersza]) Oznacza to, że macierz możemy zadeklarować instrukcją float I[4][4]={{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, A, B}, {C, D, E, F}}; float I[16]={0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F}; W OpenGL macierze 1D
6 Macierze w C++ Jeżeli chcemy ułatwić sobie życie, możemy zdefiniować funkcję wykonującą transpozycję:
7 Macierze w C++ float* Transpozycja(float* M,int rozmiar=4) { for(int kolumna=0;kolumna
8 Funkcja glMultMatrix Funkcja OpenGL glMultMatrixf wykonuje mnożenie bieżącej macierzy M (np. model-widok) przez macierz H podaną w argumencie tj. M → M·H (postmultiplication) Przykład użycia – mnożenie przez macierz jednostkową glMatrixMode(GL_MODELVIEW); glLoadIdentity(); float I[16]={1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1}; glMultMatrixf(Transpozycja(I)); W szablonie zmiany wprowadzać w funkcji TForm1::RysujScene przed rysowaniem figury
9 Funkcja glMultMatrix Efekt mnożenia przez macierz I: żadnych zmian
10 Skalowanie Macierz skalowania we współrzędnych jednorodnychglScalef(0.5,1,2); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); float S[16]={0.5,0,0,0, 0,1,0,0, 0,0,2,0, 0,0,0,1}; glMultMatrixf(Transpozycja(S));
11 Skalowanie Macierz skalowania jednorodnego we wszystkich kier.glMatrixMode(GL_MODELVIEW); glLoadIdentity(); float S[16]={1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,2}; glMultMatrixf(Transpozycja(S));
12 Odbicie Odbicie = „ujemne skalowanie” glMatrixMode(GL_MODELVIEW);glLoadIdentity(); float S[16]={-1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1}; glMultMatrixf(Transpozycja(S));
13 Obrót Macierz obrotu we współrzędnych jednorodnych rozkładana jest na obroty wokół osi (kąty Eulera): Obrót o kąt g wokół osi Z kąt a cos a sin a 0° 1 30° 0.8660 0.5 45° 0.7071 60° 90° Obrót wokół osi X Obrót wokół osi Y
14 Obrót Obrót wokół osi Z o kąt 45° glRotatef(45,0,0,1);float Rz[16]={0.7071, ,0,0, 0.7071, ,0,0, 0,0,1,0, 0,0,0,1}; glMultMatrixf(Transpozycja(Rz));
15 Obrót Obrót wokół osi X o kąt a: #include
16 Pochylenie Macierz pochylenia (ang. skew) Elementy pozadiagonalneNie ma odpowiednika w funkcjach OpenGL
17 Translacja Macierz translacji we współrzędnych jednorodnychglTranslatef(1.5,0.5,1); float T[16]={1,0,0,1.5, 0,1,0,0.5, 0,0,1,1, 0,0,0,1}; glMultMatrixf(Transpozycja(T));
18 Składanie transformacjiZłożenie translacji w kier. X i obrotu wokół osi Z Złożenie translacji w kier. X i obrotu wokół osi Z
19 Obrót wokół wyznaczonego punktuObrót o 45° w płaszczyźnie XY wokół punktu (2,0,0): Translacja o wektor [2,0,0] glRotatef(45,0,0,1); 2) Obrót wokół osi Z o 45° glTranslatef(-2,0,0); 3) Przesunięcie o wektor [-2,0,0] glTranslatef(2,0,0);
20 Obrót wokół wyznaczonego punktuObrót o 45° w płaszczyźnie XY wokół punktu (2,0,0): Translacja o wektor [2,0,0] 2) Obrót wokół osi Z o 45° 3) Przesunięcie o wektor [-2,0,0]
21 Rzutowania Rzutowanie równoległe na płaszczyznę XY (glOrtho)Rzutowanie perspektywiczne (glFrustum)