Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Wprowadzenie do grafiki komputerowej Podstawy OpenGL OpenGL Transformacje i rzutowanie (podejście klasyczne 2.1)

Podobne prezentacje


Prezentacja na temat: "Wprowadzenie do grafiki komputerowej Podstawy OpenGL OpenGL Transformacje i rzutowanie (podejście klasyczne 2.1)"— Zapis prezentacji:

1 Wprowadzenie do grafiki komputerowej Podstawy OpenGL OpenGL Transformacje i rzutowanie (podejście klasyczne 2.1)

2 Transformacje geometryczne Podstawy OpenGL Całość przekształceń geometrycznych składa się z czterech etapów Transformacje widoku określają położenie kamery Transformacje modelowania przemieszczają obiekty na scenie Transformacje rzutowania definiują bryłę widoku i płaszczyzny obcięcia Mapowanie na okno

3 Analogia z aparatem fotograficznym Podstawy OpenGL

4 Analogia, c.d. Podstawy OpenGL

5 Od czego zacząć transformacje? Transformacje polegają na zmianie obiektów na scenie – ich położenia, proporcji, w pewnym zakresie kształtu poprzez zmianę położenia współrzędnych wierzchołków Podstawowe transformacje w 2D na początek: scale, shear, rotation skalowanie, ścinanie, obrót W dalszej kolejności Składanie transformacji Transformacje w 3D

6 Skalowanie Możemy to zapisać macierzowo:

7

8

9 Transformacje jako operacje macierzowe Podstawy OpenGL Chcemy przedstawić transformację wierzchołków w postaci:

10 Transformowanie modelu, macierze transformacji... Podstawy OpenGL geometrycznych we współrzędnych jednorodnych w 3D – potraktowane ogólnie, niekoniecznie w kontekście OpenGL: Macierz translacji Macierz skalowania

11 Macierze rzutowania Podstawy OpenGL Macierz translacji

12 Transformowanie modelu, macierze transformacji... Podstawy OpenGL geometrycznych we współrzędnych jednorodnych w 3D – potraktowane ogólnie, niekoniecznie w kontekście OpenGL: Macierze obrotów

13 Transformacje można składać... Podstawy OpenGL np. obrót o 90 o wokół osi x i translacja o 10 jednostek w głąb wzdłuż osi z:

14 Cztery podstawowe funkcje transformacji w OpenGL Podstawy OpenGL void glMatrixMode(Glenum mode) mode = GL_MODELVIEW | GL_PROJECTION void glLoadIdentity(void) void glLoadMatrix{fd}(const TYPE *m) void glMultMatrix{fd}(const TYPE *m) glMultMatrix() mnoży bieżącą macierz transformacji przez macierz wskazaną argumentem

15 Jak myśleć o transformacjach? Podstawy OpenGL Kolejność transformacji ma znaczenie!

16 Kolejność transformacji Podstawy OpenGL Przykład: glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glMultMatrixf(N); /*transformation N */ glMultMatrixf(M); /*transformation M */ glMultMatrixf(L); /*transformation L */ glBegin(GL_POINTS); glVertex3f(v); /*rysuj vertex v */ glEnd();

17 Nieruchomy układ współrzędnych Podstawy OpenGL Przykład: glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glMultMatrixf(T); /* translation */ glMultMatrixf(R); /* rotation */ draw_the_object(); A co z układem lokalnym?

18 Nieruchomy, a lokalny układ Podstawy OpenGL Układ lokalny – związany z obiektami. Stosujemy go przy wielu związanych z sobą (często poruszających się obiektach). Np. robot, układ słoneczny. Zapis instrukcji pozostaje taki sam, ale interpretacja jest inna. glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glMultMatrixf(T); /* translation */ glMultMatrixf(R); /* rotation */ draw_the_object();

19 Spójrzmy jeszcze na translację Podstawy OpenGL wynik translacji: w jest zazwyczaj ustawiane na 1, można jednak nadać mu inną wartość; wtedy w pełni funkcje skalującą, np.:

20 Jeszcze o składaniu przekształceń... Podstawy OpenGL p jest punktem, który należy obrócić wokół prostej A przechodzącej przez początek układu współrzędnych o kąt R y : obróć wokół osi Y o kąt R x : obróć wokół osi X o kąt R z : obróć wokół osi Z o kąt R x -1 : cofnij obrót wokół osi X o kąt R y -1 : cofnij obrót wokół osi Y by W jakiej kolejności mnożymy?

21 Składanie transformacji c.d. Podstawy OpenGL p = R y -1 R x -1 R z R x R y p Zauważmy, że macierze obrotów są ortonormalne: (Dla przypomnienia: wektory są liniowo niezależne i mają jednostkową długość) Takie macierze łatwo odwracać:

22 Transformacje w OpenGL Podstawy OpenGL void glTranslate{fd}(TYPE x, TYPE y, TYPE z) void glRotate{fd}(TYPE angle TYPE x, TYPE y, TYPE z) void glScale{fd}(TYPE x, TYPE y, TYPE z) Na później zostawiamy sobie: void glPushMatrix(void) void glPopMatrix(void)

23 Rzutowanie Podstawy OpenGL W OpenGL pracujemy w jednym z dwóch trybów: wyświetlania i transformowania obiektów na scenie rzutowania sceny na płaszczyznę Tryb rzutowania uaktywnia się po wywołaniu: glMatrixMode(GL_PROJECTION) (widać z wywołania, że ma związek macierzami – omówimy to później) Jeśli nie dokonaliśmy żadnych przesunięć, to położenie obserwatora jest w początku układu współrzędnych; obserwator patrzy w kierunku ujemnej osi z.

24 Rzutowanie ortogonalne (ang. orthographic ) Podstawy OpenGL void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far) void glOrtho2D(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top)

25 Rzutowanie ortogonalne c.d Podstawy OpenGL Działanie glOrtho należy rozumieć następująco: Funkcja przygotowuje macierz równoległego rzutu ortogonalnego i mnoży ją przez bieżącą macierz rzutowania. Obszar rzutowania wzdłuż osi Z zawarty jest między wartościami –near i –far. Jeśli pominiemy wywołanie glOrtho to domyślna postać jest następująca: glOrtho(-1., 1.,-1.,1.,-1.,1.);

26 Rzutowanie na fragment okna - glViewPort Standardowo rzutowanie odbywa się na całe okno. Można powiedzieć, że domyślnie jest wywoływana funkcja glViewPort(0,0,w,h); Można za jej pomocą ograniczyć obszar rzutowania.

27 Rzut perspektywiczny Podstawy OpenGL void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far) left, right, bottom, top określają granicę współrzędnych okna, near, far określają odległość bliższej i dalszej płaszczyzny od znajdującego się w początku układu współrzędnych obserwatora; wartości near i far muszą być dodatnie; jeśli obserwator jest zwrócony w kierunku ujemnej osi z (default), to obie płaszczyzny przecinają oś z w punktach (0,0,-near) i (0,0,-far).

28 glFrustum Podstawy OpenGL glFrustum (-28.0/2, 28.0/2, -20.0/2, 20.0/2 80.0, 500.0

29 Rzut perspektywiczny c.d. Podstawy OpenGL Nieco wygodniejsze jest użycie, ale nie tożsame: void gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble near, GLdouble far) fovy – kąt widzenia w płaszczyźnie yz aspect – stosunek szerokości do wysokości pola widzenia

30 glFrustum, a gluPerspective Podstawy OpenGL W glFrustum bliższa płaszczyzna odcięcia jest jednocześnie płaszczyzną rzutowania (ekranu). W gluPerspective – nie. Jeżeli argumentowi near nadamy odpowiednio małą wartość (>0), to możemy teoretycznie oglądać obiekty między ekranem, a obserwatorem. Przykładowe ustawienie gluPerspective dla 15 monitora: gluPerspective(14.25, 1.4, 80.0, 500.0)

31 glFrustum, a GluPerspective Można stwierdzić, że glFrustum częściej jest używane przy nieruchomym obserwatorze, natomiast gluPerspective – przy poruszającym się. Nie jest to całkiem ścisłe. Jednak z gluPerspective na ogół łączy się funkcję transformacji widoku gluLookAt, która służy do przemieszczania kamery.

32 Transformowanie widoku Podstawy OpenGL void gluLookAt(…) Funkcja szczególnie przydatna, gdy chcemy zmieniać wygodnie położenie kamery i punkt, na który patrzy. Na przykład gdy chcemy wykonać przelot nad sceną.

33 Położenie obserwatora Podstawy OpenGL void gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx, GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz,)

34 Położenie obserwatora Podstawy OpenGL Domyślne położenie kamery: gluLookat (0.0, 0.0, 0.0, 0.0, 0.0, , 0.0, 1.0, 0.0); gluLookat należy do biblioteki GLU - bo zawiera złożenie kilku podstawowych operacji OpenGL

35 Przykład Podstawy OpenGL Przykład rzutowania ( )

36 Uwaga o transformacji widoku i transformacji modelu Podstawy OpenGL Transformowanie widoku (czyli położenia obserwatora w układzie współrzędnych) i transformowanie modelu dopełniają się. Możemy uzyskać identyczny widok sceny np. przesuwając obserwatora w prawo lub obiekt na scenie w lewo.

37 Podstawy OpenGL Przykład transformacji

38 Dwa uzupełnienia Podstawy OpenGL 1.Przykład animacji z czerwonej książki. 2.Elementarny przykład użycia stosu w transformacjach.

39 Pierwsza animacja (1/4) Podstawy OpenGL #include static GLfloat spin = 0.0; void init(void) { glClearColor(0.0, 0.0, 0.0, 0.0); glShadeModel (GL_FLAT); }

40 Pierwsza animacja (2/4) Podstawy OpenGL void display(void) { glClear (GL_COLOR_BUFFER_BIT); glPushMatrix(); glRotatef(spin, 0.0, 0.0, 1.0); glColor3f(1.0, 1.0, 1.0); glRectf(-25.0, -25.0, 25.0, 25.0); glPopMatrix(); glutSwapBuffers(); } void spinDisplay(void) { spin = spin + 2.0; if (spin > 360.0) spin = spin ; glutPostRedisplay(); }

41 Pierwsza animacja (3/4) Podstawy OpenGL void reshape(int w, int h) { glViewport(0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void mouse(int button, int state, int x, int y) { switch (button) { case GLUT_LEFT_BUTTON: if (state == GLUT_DOWN) glutIdleFunc(spinDisplay); break; case GLUT_MIDDLE_BUTTON: if (state == GLUT_DOWN) glutIdleFunc(NULL); break; default: break; }

42 Pierwsza animacja (4/4) Podstawy OpenGL /* * Request double buffer display mode, * Register mouse input callback functions */ int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize (250, 250); glutInitWindowPosition (100, 100); glutCreateWindow(argv[0]); init (); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMouseFunc(mouse); glutMainLoop(); return 0; }

43 Potok transformacji Podstawy OpenGL

44 Potok transformacji Podstawy OpenGL vertexvertex Modelview Matrix Projection Matrix Perspective Division Viewport Transform Modelview Projection object eye clip normalized device window


Pobierz ppt "Wprowadzenie do grafiki komputerowej Podstawy OpenGL OpenGL Transformacje i rzutowanie (podejście klasyczne 2.1)"

Podobne prezentacje


Reklamy Google