Prosty program- cpp. #include <GL/glut.h>

Podobne dokumenty
Janusz Ganczarski. OpenGL Definiowanie sceny 3D

Rzutowanie DOROTA SMORAWA

1 Wstęp teoretyczny. Temat: Manipulowanie przestrzenią. Grafika komputerowa 3D. Instrukcja laboratoryjna Układ współrzędnych

Bufor koloru cd. Czyszczenie bufora koloru glclearcolor( )

OPENGL PRZEKSZTAŁCENIA GEOMETRYCZNE

Wprowadzenie do programowania z wykorzystaniem biblioteki OpenGL. Dorota Smorawa

2 Przygotował: mgr inż. Maciej Lasota

Janusz Ganczarski. OpenGL Pierwszy program

Temat: Transformacje 3D

Temat: Wprowadzenie do OpenGL i GLUT

Przekształcenia geometryczne. Dorota Smorawa

Grafika 3D OpenGL część II

Oprogramowanie i wykorzystanie stacji roboczych. Wykład 6

Grafika komputerowa INSTRUKCJA DO LABORATORIUM 2: operacje przestrzenne oraz obsługa klawiatury i myszki

Grafika komputerowa Wstęp do OpenGL

Grafika komputerowa Wstęp do OpenGL

GRAFIKA CZASU RZECZYWISTEGO Wprowadzenie do OpenGL

Wizualizacja 3D. dr inż. Marcin Gabryel

Elementarne obiekty geometryczne, bufory. Dorota Smorawa

Laboratorium 1. Część I. Podstawy biblioteki graficznej OpenGL.

OpenGL - maszyna stanu. Oprogramowanie i wykorzystanie stacji roboczych. Wykład 7. Grupy atrybutów. Zmienne stanu.

Oprogramowanie i wykorzystanie stacji roboczych. Wykład 5

Wykład 12. Wprowadzenie do malarstwa, str. 1 OpenGL Open Graphics Library. OpenGL składa się z

Co to jest OpenGL? Oprogramowanie i wykorzystanie stacji roboczych. Wykład 5. OpenGL - Achitektura. OpenGL - zalety. olas@icis.pcz.

glwindowpos2d void DrawString (GLint x, GLint y, char *string) { glwindowpos2i (x,y); int len = strlen (string); for (int i = 0; i < len; i++)

Wykład 12. Wprowadzenie do malarstwa, str. 1 OpenGL Open Graphics Library. OpenGL składa się z

System graficzny. Potok graficzny 3D. Scena 3D Zbiór trójwymiarowych danych wejściowych wykorzystywanych do wygenerowania obrazu wyjściowego 2D.

Studium podyplomowe. Programowanie w OpenGL. Michał Turek, AGH Kraków

3 Przygotował: mgr inż. Maciej Lasota

Wprowadzenie do klas w C++ oraz biblioteki opengl

Zatem standardowe rysowanie prymitywów wygląda następująco:

Trójwymiarowa grafika komputerowa rzutowanie

Grafika Komputerowa, Informatyka, I Rok

OpenGL transformacje przestrzenne

Grafika Komputerowa Wykład 4. Synteza grafiki 3D. mgr inż. Michał Chwesiuk 1/30

OpenGL - charakterystyka

Bartosz Bazyluk Wprowadzenie Organizacja i tematyka zajęć, warunki zaliczenia.

Zadanie 1. Ściana. 1. Potrzebne zmienne w dołączonym do zadania kodzie źródłowym

OpenGL teksturowanie

Programowanie OpenGL

Wprowadzenie do rysowania w 3D. Praca w środowisku 3D

Ćwiczenie nr 1 Szkielet aplikacji wykorzystującej bibliotekę OpenGL dla środowiska Windows z wykorzystaniem Visual C++

Programowanie Równoległe wykład, CUDA, przykłady praktyczne 1. Maciej Matyka Instytut Fizyki Teoretycznej

OpenGL. Silicon Graphics (IRIS GL stacje graficzne)

OpenGL Zaawansowana grafika komputerowa

Efekt lustra 3D w OpenGL z wykorzystaniem bufora szablonowego (stencil buffer)

Laboratorium Programowanie urządzeń mobilnych

8 Przygotował: mgr inż. Maciej Lasota

Bartosz Bazyluk Wprowadzenie Organizacja i tematyka zajęć, warunki zaliczenia.

GRAFIKA KOMPUTEROWA 7: Kolory i cieniowanie

Grafika komputerowa. OpenGL. Podstawy

Ćwiczenia nr 4. TEMATYKA: Rzutowanie

Programowanie OpenGL

Rysowanie punktów na powierzchni graficznej

GEOMETRIA PRZESTRZENNA (STEREOMETRIA)

Bartosz Bazyluk Wprowadzenie Organizacja i tematyka zajęć, warunki zaliczenia.

BRYŁY PODSTAWOWE I OBIEKTY ELEMENTARNE

Wykład 10. Wprowadzene do malarstwa, str. 1 OpenGL Open Graphics Library. OpenGL składa się z

Rozdział 8 Wzory na macierze OpenGL

Światła i rodzaje świateł. Dorota Smorawa

GRAFIKA CZASU RZECZYWISTEGO Wstęp do programowania grafiki czasu rzeczywistego.

OpenGL. Biblioteka procedur graficznych. GLU = OpenGL Utility Library. GLX = OpenGL Extension to the X Window System [tm]

Transformacje obiektów 3D

Mieszanie kolorów. Dorota Smorawa

Laboratorium grafiki komputerowej i animacji. Ćwiczenie V - Biblioteka OpenGL - oświetlenie sceny

gdzie (4.20) (4.21) 4.3. Rzut równoległy

Matematyka z plusem dla szkoły ponadgimnazjalnej. ZAŁOŻENIA DO PLANU RALIZACJI MATERIAŁU NAUCZANIA MATEMATYKI W KLASIE III (zakres podstawowy)

6 Przygotował: mgr inż. Maciej Lasota

Układy współrzędnych GUW, LUW Polecenie LUW

STEREOMETRIA CZYLI GEOMETRIA W 3 WYMIARACH

Materiały. Dorota Smorawa

Wymagania na poszczególne oceny szkolne z. matematyki. dla uczniów klasy IIIa i IIIb. Gimnazjum im. Jana Pawła II w Mętowie. w roku szkolnym 2015/2016

OpenGL wprowadzenie. O.1 Informacje ogólne 286 O OPENGL WPROWADZENIE

Światło. W OpenGL można rozróżnić 3 rodzaje światła

GRAFIKA CZASU RZECZYWISTEGO Podstawy syntezy grafiki 3D i transformacji geometrycznych

Stereometria bryły. Wielościany. Wielościany foremne

Grafika komputerowa. Potok graficzny 3D. Radosław Mantiuk. Wydział Informatyki Zachodniopomorski Uniwersytet Technologiczny

Laboratorium Grafiki Komputerowej i Animacji. Ćwiczenie VI. Biblioteka OpenGL - teksturowanie

Przedmiotowe Zasady Oceniania

BLENDER- Laboratorium 1 opracował Michał Zakrzewski, 2014 r. Interfejs i poruszanie się po programie oraz podstawy edycji bryły

Wykład 4. Rendering (1) Informacje podstawowe

FIGURY I PRZEKSZTAŁCENIA GEOMETRYCZNE

Matematyka z plusem dla szkoły ponadgimnazjalnej. ZAŁOŻENIA DO PLANU RALIZACJI MATERIAŁU NAUCZANIA MATEMATYKI W KLASIE III (zakres podstawowy)

1. Prymitywy graficzne

Pytania do spr / Własności figur (płaskich i przestrzennych) (waga: 0,5 lub 0,3)

0. OpenGL ma układ współrzędnych taki, że oś y jest skierowana (względem monitora) a) w dół b) w górę c) w lewo d) w prawo e) w kierunku do

MAZOWIECKI PROGRAM STYPENDIALNY DLA UCZNIÓW SZCZEGÓLNIE UZDOLNIONYCH NAJLEPSZA INWESTYCJA W CZŁOWIEKA 2016/2017

ZAKRES PODSTAWOWY CZĘŚĆ II. Wyrażenia wymierne

Druga aplikacja Prymitywy, alpha blending, obracanie bitmap oraz mały zestaw przydatnych funkcji wyświetlających własnej roboty.

MATEMATYKA KLASY III gimnazjum LICZBY I WYRAŻENIA ALGEBRAICZNE

PLAN REALIZACJI MATERIAŁU NAUCZANIA MATEMATYKI W KLASIE III WRAZ Z PLANEM WYNIKOWYM (ZAKRES PODSTAWOWY)

GRK 2. dr Wojciech Palubicki

Symetria w fizyce materii

PLAN WYNIKOWY Z MATEMATYKI DLA III KL. GIMNAZJUM do podręcznika GWO Matematyka z plusem. PODSTAWOWE Uczeń zna: LICZBY I WYRAŻENIA ALGEBRAICZNE

Część 4 życie programu

Grafika trójwymiarowa

DZIAŁ 1. STATYSTYKA DZIAŁ 2. FUNKCJE

KGGiBM GRAFIKA INŻYNIERSKA Rok III, sem. VI, sem IV SN WILiŚ Rok akademicki 2011/2012

Szybkie tworzenie grafiki w GcIde

Z ostatniego wzoru i zależności (3.20) można obliczyć n6. Otrzymujemy (3.23) 3.5. Transformacje geometryczne

Transkrypt:

Wizualizacje 3D

Prosty program- cpp #include <GL/gl.h> #include <GL/glu.h> #include <GL/glut.h> int main(int argc, char** argv) { glutinit(&argc, argv); glutinitdisplaymode( GLUT_DOUBLE GLUT_RGBA ); glutinitwindowsize(400, 400); glutinitwindowposition(100, 100) ; glutcreatewindow("opengl"); glutdisplayfunc( Display ); glutreshapefunc( Reshape); glutmainloop();

Prosty program cpp (2) void Display() { glclearcolor( 0.0, 0.0, 0.0, 0.0); glclear(gl_color_buffer_bit); glcolor3f( 1.0, 1.0, 1.0 ); glbegin( GL_TRIANGLES ); glvertex3f(-1, -1, -0.5); glvertex3f(-1, 1, -0.5); glvertex3f(1, 1, 1); glend(); glflush(); glutswapbuffers(); glutpostredisplay(); void Reshape(int w, int h) { Display();

Obszar renderingu void glviewport(glint x, GLint y, GLsizei width, GLsizei height) W aplikacjach pracujących w systemach okienkowych problem zmiany rozmiaru okna jest tak powszechny, że wymaga specjalnego potraktowania. Jednym z możliwych sposobów jego rozwiązania jest dynamiczna modyfikacja obszaru renderingu. Służy to tego właśnie ta funkcja. x, y współrzędne lewego dolnego narożnika obszaru renderingu względem lewego dolnego narożnika okna height wysokość okna renderingu width szerokość okna renderingu

Zastosowanie glviewport void Reshape (int w, int h) { if ( w < h ) { glviewport(0, (h-w)/2, w, w); else { glviewport((w-h)/2, 0, h, h); Display();

Macierze OpenGL zawiera kilka stosów macierzy, z których w przykładowym programie wykorzystamy stos macierzy rzutowania oraz stos macierzy modelowania. Wybór bieżącej macierzy umożliwia funkcja: void glmatrixmode (GLenum mode) Parametr mode może przyjąć jedna z wartości: GL_MODELVIEW - macierz modelowania, GL_PROJECTION - macierz rzutowania, GL_TEXTURE - macierz tekstury.

Macierz jednostkowa Ponieważ początkowa wartość wybranej macierzy jest nieokreślona, przed wykonaniem jakiejkolwiek czynności na macierzy należy przyporządkować macierz jednostkową. 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 void glloadidentity (void)

Rzutowanie prostokątne void glortho(gldouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far) Rozmiar bryły odcinania w rzutowaniu prostokątnym Parametry określają współrzędne punktów przecięcia płaszczyzn tworzących bryłę odcinania z osiami układu współrzędnych kartezjańskich

Rzutowanie prostokątne Domyślnie bryła ma postać sześcianu o bokach = 2 glortho(-1,1,-1,1,-1,1)

Rzutowanie prostokątne dla sceny 2D void gluortho2d (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top) Parametry left, right, bottom i top odpowiadaja parametrom funkcji glortho, a przednia (near) i tylna (far) płaszczyzna obcinania maja wartosci odpowiednio -1 i 1.

Przykład zastosowania rzutowania perspektywicznego void Display () { glclearcolor (1.0,1.0,1.0,1.0); glclear (GL_COLOR_BUFFER_BIT); glmatrixmode (GL_MODELVIEW); glloadidentity (); glcolor3f (0.0,0.0,0.0); glbegin (GL_LINES); glvertex3f (1.0, 1.0, 1.0); glvertex3f (1.0, -1.0, 1.0); glvertex3f (1.0, -1.0, 1.0); glvertex3f (1.0, -1.0, -1.0); glvertex3f (1.0, -1.0, -1.0); glvertex3f (1.0, 1.0, -1.0); glvertex3f (1.0, 1.0, -1.0); glvertex3f (1.0, 1.0, 1.0); glvertex3f (-1.0, 1.0, 1.0); glvertex3f (-1.0, -1.0, 1.0); glvertex3f (-1.0, -1.0, 1.0); glvertex3f (-1.0, -1.0, -1.0); glvertex3f (-1.0, -1.0, -1.0); glvertex3f (-1.0, 1.0, -1.0); glvertex3f (-1.0, 1.0, -1.0); glvertex3f (-1.0, 1.0, 1.0); glvertex3f (1.0, 1.0, 1.0); glvertex3f (-1.0, 1.0, 1.0); glvertex3f (1.0, -1.0, 1.0); glvertex3f (-1.0, -1.0, 1.0); glvertex3f (1.0, -1.0, -1.0); glvertex3f (-1.0, -1.0, -1.0); glvertex3f (1.0, 1.0, -1.0); glvertex3f (-1.0, 1.0, -1.0); glend (); glflush (); glutswapbuffers();

void Reshape(int w, int h) { if ( w < h ) { glviewport(0, (h-w)/2, w, w); else { glviewport((w-h)/2, 0, h, h); glmatrixmode (GL_PROJECTION); glloadidentity (); glortho (-2.0, 2.0, -2.0, 2.0, -2.0, 2.0); Display();

Rzutowanie perspektywiczne Rzutowanie perspektywiczne daje bardziej realistyczne efekty niż rzutowanie prostokątne, stąd jest szeroko stosowane np. w grach. Parametry bryły odcinania, która przy rzutowaniu perspektywicznym ma postać ostrosłupa ściętego o wierzchołku znajdującym się w początku układu współrzędnych.

Rzutowanie perspektywiczne (2) void glfrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far) Parametry left, right, bottom i top wyznaczaja rozmiary górnej podstawy bryły odcinania (jest to obszar bezposrednio odwzorowywany na obszar renderingu), a near i far wyznaczaja połozenie odpowiednio górnej i dolnej podstawy ostrosłupa (przedniej i tylnej płaszczyzny odcinania), które zawieraja sie w płaszczyznach o równaniach: z = near i z = far. Parametry near i far musza miec wartosci dodatnie.

Przekształcenia geometryczne (3) Macierz rzutowania perspektywicznego, tworzona przez funkcje glfrustum i mnożona przez aktualnie wybrana macierz, ma postać:

void Reshape (int w, int h) { if ( w < h ) { glviewport(0, (h-w)/2, w, w); else { glviewport((w-h)/2, 0, h, h); glmatrixmode (GL_PROJECTION); glloadidentity (); glfrustum(-2.0,2.0,-2.0,2.0,1.0,5.0); Display();

Przykład - glfrustum void Display () { glclearcolor (1.0,1.0,1.0,1.0); glclear (GL_COLOR_BUFFER_BIT); glmatrixmode (GL_MODELVIEW); glloadidentity (); gltranslatef (0, 0, -3.0); glcolor3f (0.0,0.0,0.0); glbegin (GL_LINES); glvertex3f (1.0, 1.0, 1.0); glvertex3f (1.0, -1.0, 1.0); glvertex3f (1.0, -1.0, 1.0); glvertex3f (1.0, -1.0, -1.0); glvertex3f (1.0, -1.0, -1.0); glvertex3f (1.0, 1.0, -1.0); glvertex3f (1.0, 1.0, -1.0); glvertex3f (1.0, 1.0, 1.0); glvertex3f (-1.0, 1.0, 1.0); glvertex3f (-1.0, -1.0, 1.0); glvertex3f (-1.0, -1.0, 1.0); glvertex3f (-1.0, -1.0, -1.0); glvertex3f (-1.0, -1.0, -1.0); glvertex3f (-1.0, 1.0, -1.0); glvertex3f (-1.0, 1.0, -1.0); glvertex3f (-1.0, 1.0, 1.0); glvertex3f (1.0, 1.0, 1.0); glvertex3f (-1.0, 1.0, 1.0); glvertex3f (1.0, -1.0, 1.0); glvertex3f (-1.0, -1.0, 1.0); glvertex3f (1.0, -1.0, -1.0); glvertex3f (-1.0, -1.0, -1.0); glvertex3f (1.0, 1.0, -1.0); glvertex3f (-1.0, 1.0, -1.0); glend (); glflush (); glutswapbuffers();

Rzutowanie perspektywiczne (4) Alternatywny sposób określania rzutu perspektywicznego umożliwia funkcja z biblioteki GLU: void gluperspective (GLdouble fovy, GLdouble aspect, GLdouble znear, GLdouble zfar) gdzie parametr fovy określa w stopniach kat widzenia obserwatora zawarty w płaszczyźnie YZ (kąt między top, 0, a bottom), a aspect jest stosunkiem szerokości do wysokości przedniej płaszczyzny odcinania, czyli górnej podstawy ostrosłupa ograniczającego scenę 3D. Parametry znear i zfar odpowiadają parametrom near i far funkcji glfrustum.

Rzutowanie perspektywiczne (5) Macierz rzutowania perspektywicznego, tworzona przez funkcje gluperspective i mnożoną przez aktualnie wybrana macierz, ma postać:

Rzutowanie perspektywiczne (6) Wewnętrznie funkcja gluperspective wykorzystuje do ustawienia macierzy rzutowania perspektywicznego funkcję glfrustum. Oto wzory przekształcenia parametrów funkcji gluperspective na parametry glfrustum:

Przykład - gluperspective

Obsługa klawiatury Podstawowa funkcja obsługi klawiatury ma trzy parametry: key - kod ASCII klawisza, x, y - współrzędne kursora myszki w chwili naciśnięcia przycisku klawiatury. Aby obsługa klawiatury działała, w części głównej programu należy włączyć funkcje obsługi klawiatury wywołując funkcje: void glutkeyboardfunc (void (*func)(unsigned char key, int x, int y))

Przykład #include <GL/glut.h> #include <stdlib.h> GLdouble fovy = 90; int main (int argc, char *argv[]) { glutinit (&argc,argv); glutinitdisplaymode (GLUT_DOUBLE GLUT_RGB); glutinitwindowsize (400,400); glutcreatewindow ("Szescian"); glutdisplayfunc (Display); glutreshapefunc (Reshape); glutkeyboardfunc (Keyboard); glutmainloop (); return 0;

void Reshape (int width, int height) { glviewport (0, 0, width, height); glmatrixmode (GL_PROJECTION); glloadidentity (); GLdouble aspect = 1; if (height > 0) aspect = width/(gldouble)height; gluperspective (fovy,aspect,1.0,5.0); Display ();

void Keyboard (unsigned char key, int x, int y) { if (key == '+' && fovy < 180) fovy++; else if (key == '-' && fovy > 0) fovy--; Reshape (glutget (GLUT_WINDOW_WIDTH), glutget (GLUT_WINDOW_HEIGHT));

Położenie obserwatora Biblioteka GLU zawiera funkcje glulookat, która pozwala na jednorazowe zdefiniowanie wszystkich parametrów opisujących obserwatora: void glulookat (GLdouble eyex, GLdouble eyey,gldouble eyez, GLdouble centerx, GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz) eyex, eyey, eyez - współrzedne połozenia obserwatora, centerx, centery, centerz - współrzedne punktu, w którego kierunku jest zwrócony obserwator, upx, upy, upz - współrzedne wektora okreslajacego kierunek do góry. Domyślne położenie obserwatora odpowiada wywołaniu: glulookat (0.0, 0.0, 0.0, 0.0, 0.0, -100.0, 0.0, 1.0, 0.0)

Obsługa klawiszy specjalnych W głównym programie można włączyć obsługę klawiszy kursora i klawiszy funkcyjnych wywołując funkcje: void glutspecialfunc (void (*func)(int key, int x, int y)) x, y - współrzędne kursora myszki w chwili naciśnięcia przycisku klawiatury. key - kod przycisku; zwracana jest jedna z poniższych wartości: GLUT_KEY_F1 - przycisk F1, GLUT_KEY_F2 - przycisk F2, ( ) GLUT_KEY_F11 - przycisk F11, GLUT_KEY_F12 - przycisk F12, GLUT_KEY_LEFT - kursor w lewo, GLUT_KEY_UP - kursor do góry, GLUT_KEY_RIGHT - kursor w prawo, GLUT_KEY_DOWN - kursor w dół, GLUT_KEY_PAGE UP - przycisk Page Up GLUT_KEY_PAGE DOWN - przycisk Page Down, GLUT_KEY_HOME - przycisk Home, GLUT_KEY_END - przycisk End, GLUT_KEY_INSERT - przycisk Insert.

Przykład - glulookat #include <GL/glut.h> #include <stdlib.h> GLdouble eyex = 0; GLdouble eyey = 0; GLdouble eyez = 3; GLdouble centerx = 0; GLdouble centery = 0; GLdouble centerz = -100; int main (int argc, char *argv[]) { glutinit (&argc,argv); glutinitdisplaymode (GLUT_DOUBLE GLUT_RGB); glutinitwindowsize (400,400); glutcreatewindow ("Szescian"); glutdisplayfunc (Display); glutreshapefunc (Reshape); glutkeyboardfunc (Keyboard); glutspecialfunc (SpecialKeys); glutmainloop (); return 0;

void Reshape (int w, int h) { if ( w < h ) { glviewport(0, (h-w)/2, w, w); else { glviewport((w-h)/2, 0, h, h); glmatrixmode(gl_projection); glloadidentity(); glfrustum (-2.0,2.0,-2.0,2.0,1.0,5.0); Display ();

void Keyboard (unsigned char key, int x, int y) { if (key == '+') else eyez -= 0.1; if (key == '-') eyez += 0.1; Reshape (glutget (GLUT_WINDOW_WIDTH),glutGet (GLUT_WINDOW_HEIGHT)); void SpecialKeys (int key, int x, int y) { switch (key) { case GLUT_KEY_LEFT: eyex += 0.1; break; case GLUT_KEY_UP: eyey -= 0.1; break; case GLUT_KEY_RIGHT: eyex -= 0.1; break; case GLUT_KEY_DOWN: eyey += 0.1; break; Reshape (glutget (GLUT_WINDOW_WIDTH),glutGet (GLUT_WINDOW_HEIGHT));

void Display () { glclearcolor (1.0,1.0,1.0,1.0); glclear (GL_COLOR_BUFFER_BIT); glmatrixmode (GL_MODELVIEW); glloadidentity (); glulookat(eyex,eyey,eyez, centerx,centery,centerz, 0,1,0); glcolor3f (0.0,0.0,0.0); glbegin (GL_LINES); glvertex3f (1.0, 1.0, 1.0); glvertex3f (1.0, -1.0, 1.0); glvertex3f (1.0, -1.0, 1.0); glvertex3f (1.0, -1.0, -1.0); glvertex3f (1.0, -1.0, -1.0); glvertex3f (1.0, 1.0, -1.0); glvertex3f (1.0, 1.0, -1.0); glvertex3f (1.0, 1.0, 1.0); glvertex3f (-1.0, 1.0, 1.0); glvertex3f (-1.0, -1.0, 1.0); glvertex3f (-1.0, -1.0, 1.0); glvertex3f (-1.0, -1.0, -1.0); glvertex3f (-1.0, -1.0, -1.0); glvertex3f (-1.0, 1.0, -1.0); glvertex3f (-1.0, 1.0, -1.0); glvertex3f (-1.0, 1.0, 1.0); glvertex3f (1.0, 1.0, 1.0); glvertex3f (-1.0, 1.0, 1.0); glvertex3f (1.0, -1.0, 1.0); glvertex3f (-1.0, -1.0, 1.0); glvertex3f (1.0, -1.0, -1.0); glvertex3f (-1.0, -1.0, -1.0); glvertex3f (1.0, 1.0, -1.0); glvertex3f (-1.0, 1.0, -1.0); glend (); glflush (); glutswapbuffers();

Przekształcenia geometryczne Obrót realizują funkcje: void glrotated (GLdouble angle, GLdouble x, GLdouble y, GLdouble z) void glrotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z) Gdzie: angle - kat obrotu w stopniach, x, y, z - współrzędne wektora określającego oś obrotu. Obrót realizowany jest w kierunku przeciwnym do ruchu wskazówek zegara w kierunku prostej wyznaczonej przez wektor [x, y, z] zaczepionym w początku układu współrzędnych.

Przekształcenia geometryczne cd. Funkcje glrotated i glrotatef mnożą bieżąca macierz przez macierz obrotu, która ma następująca postać

Przekształcenia geometryczne cd. Skalowanie void glscalef (GLfloat x, GLfloat y, GLfloat z) void glscalex (GLfixed x, GLfixed y, GLfixed z) gdzie x, y, z są współczynnikami skalowania względem kolejnych osi układu współrzędnych.

Przekształcenia geometryczne cd. Funkcje te mnożą bieżącą macierz przez macierz skalowania, która ma postać:

Przekształcenia geometryczne cd. Przesunięcie (translacja) void gltranslatef (GLfloat x, GLfloat y, GLfloat z) void gltranslatex (GLfixed x, GLfixed y, GLfixed z) gdzie x, y, z sa współrzednymi wektora przesuniecia.

Przekształcenia geometryczne cd. Funkcje mnożą bieżącą macierz przez macierz translacji, która ma postać:

Mnożenie macierzy przekształceń glmatrixmode(gl_model_v IEW); glloadidentity( ); gltranslatef(0.2,0.3,0.5); glscalef(1.5,1.5,0.5); glrotatef(30,1.0,0.0,0.0); glrotatef(45,0.0,1.0,0.0); glrotatef(-20,0.0,0.0,1.0); Kolejność wykonywania operacji Aktywacja pracy na macierzy przekształcania obiektów. Ładowanie macierzy jednostkowej Mnożenie macierzy jednostkowej przez macierz przesunięcia o wektor (0.2,0.3,0.5). Skalowanie obiektu: 1.5 raza w kierunku osi x i y oraz 0.5 raza w kierunku osi z. Obrót wokół osi x przeciwnie do ruchu wskazówek zegara o 30 stopni. Obrót wokół osi y przeciwnie do ruchu wskazówek zegara o 45 stopni. Obrót wokół osi z zgodnie z ruchem wskazówek zegara o 20 stopni.

Przykład #include <GL/glut.h> #include <stdlib.h> const GLdouble left = -10.0; const GLdouble right = 10.0; const GLdouble bottom = -10.0; const GLdouble top = 10.0; const GLdouble near_ = 50.0; const GLdouble far_ = 70.0; GLfloat scale = 1.0; GLfloat rotatex = 0.0; GLfloat rotatey = 0.0; GLfloat translatex = 0.0; GLfloat translatey = 0.0; int main (int argc, char *argv[]) { glutinit (&argc,argv); glutinitdisplaymode (GLUT_DOUBLE GLUT_RGB); glutinitwindowsize (400,400); glutcreatewindow ("Przeksztalcenia"); glutdisplayfunc (Display); glutreshapefunc (Reshape); glutkeyboardfunc (Keyboard); glutspecialfunc (SpecialKeys); glutmainloop (); return 0;

void Display () { glclearcolor (1.0,1.0,1.0,1.0); glclear (GL_COLOR_BUFFER_BIT); glmatrixmode (GL_MODELVIEW); glloadidentity (); gltranslatef (0,0,-(near_+far_)/2); gltranslatef (translatex,translatey,0.0); glscalef (scale,scale,scale); glrotatef (rotatex,1.0,0,0); glrotatef (rotatey,0,1.0,0); glcolor3f (0.0,0.0,0.0); glutwiresphere (1.0,20,10); glflush(); glutswapbuffers ();

void Reshape (int w, int h) { if ( w < h ) { glviewport(0, (h-w)/2, w, w); else { glviewport((w-h)/2, 0, h, h); glmatrixmode (GL_PROJECTION); glloadidentity (); glfrustum (left,right,bottom,top,near_,far_); Display ();

void Keyboard (unsigned char key, int x, int y) { if (key == '+') scale += 0.1; if (key == '-' && scale > 0.1) scale -= 0.1; if (key=='s') translatey -= 0.5; if (key=='w') translatey += 0.5; if (key=='a') translatex -= 0.5; if (key=='d') translatex += 0.5; Reshape (glutget (GLUT_WINDOW_WIDTH),glutGet (GLUT_WINDOW_HEIGHT)); void SpecialKeys (int key, int x, int y) { switch (key) { case GLUT_KEY_LEFT: rotatey -= 1; break; case GLUT_KEY_UP: rotatex -= 1; break; case GLUT_KEY_RIGHT: rotatey += 1; break; case GLUT_KEY_DOWN: rotatex += 1; break; Reshape (glutget (GLUT_WINDOW_WIDTH),glutGet (GLUT_WINDOW_HEIGHT));

Gotowe obiekty 3D z biblioteki GLUT Kula void glutwiresphere (GLdouble radius, GLint slices, GLint stacks) radius - promien kuli, slices - ilosc południków, stacks - ilosc równolezników. Sześcian void glutwirecube (GLdouble size) size długość boku

Gotowe obiekty 3D z biblioteki GLUT cd Stożek void glutwirecone (GLdouble base, GLdouble height, GLint slices, GLint stacks) base - promien podstawy stozka, height - wysokosc stozka, slices - ilosc tworzacych, stacks - ilosc południków Torus void glutwiretorus (GLdouble innerradius, GLdouble outerradius, GLint sides, GLint rings) innerradius - promien koła tworzacego torus, outerradius - promien torusa, sides - ilosc scian bocznych, z których składa sie pojedynczy walec, rings - ilosc walców, z których składa sie torus

Gotowe obiekty 3D z biblioteki GLUT cd. Dwunastościan void glutwiredodecahedron (void) Czajnik void glutwireteapot (GLdouble size) size wielkość Ośmiościan void glutwireoctahedron (void) Czworościan void glutwiretetrahedron (void) Dwudziestoscian void glutwireicosahedron (void)

Stos macierzy Można zapamiętać aktualny stan macierzy zapisując ją na stosie. Operacje odłożenia bieżącej macierzy na stos: void glpushmatrix (void) Operacje zdjęcia macierzy ze stosu: void glpopmatrix (void)

Przykład Trzy czajniki ustawione obok siebie obrócone o różne kąty glpushmatrix(); gltranslatef(-2,0,0); glrotatef(45,1,0,0); glutwireteapot(0.8); glpopmatrix(); glpushmatrix(); gltranslatef(0,0,0); glrotatef(45,0,0,1); glutwireteapot(0.8); glpopmatrix(); glpushmatrix(); gltranslatef(2,0,0); glrotatef(45,0,1,0); glutwireteapot(0.8); glpopmatrix();

Przykład 2 Poprzedni przykład bez korzystania ze stosu macierzy gltranslatef(-2,0,0); glrotatef(45,1,0,0); glutwireteapot(0.8); gltranslatef(0,0,0); glrotatef(45,0,0,1); glutwireteapot(0.8); gltranslatef(2,0,0); glrotatef(45,0,1,0); glutwireteapot(0.8);

Primitywy Definiowanie współrzędnych wierzchołków figur podstawowych musi zawierać się pomiędzy wywołaniami funkcji: void glbegin (GLenum mode) void glend (void) Gdzie parametr mode okresla rodzaj prymitywu.

Rodzaje prymitywów

Definiowane współrzędnych wierzchołków void glvertex2d (GLdouble x, GLdouble y) void glvertex2f (GLfloat x, GLfloat y) void glvertex2i (GLint x, GLint y) void glvertex2s (GLshort x, GLshort y) void glvertex2dv (const GLdouble *v) void glvertex2fv (const GLfloat *v) void glvertex2iv (const GLint *v) void glvertex2sv (const GLshort *v) void glvertex3d (GLdouble x, GLdouble y, GLdouble z) void glvertex3f (GLfloat x, GLfloat y, GLfloat z) void glvertex3i (GLint x, GLint y, GLint z) void glvertex3s (GLshort x, GLshort y, GLshort z) void glvertex3dv (const GLdouble *v) void glvertex3fv (const GLfloat *v) void glvertex3iv (const GLint *v) void glvertex3sv (const GLshort *v)

Prostokąty Prostokąt rysowany jest na płaszczyźnie o równaniu Z=0, a jego boki są równoległe do osi układu współrzędnych. void glrectd (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2) void glrectf (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2) void glrecti (GLint x1, GLint y1, GLint x2, GLint y2) void glrects (GLshort x1, GLshort y1, GLshort x2, GLshort y2) void glrectdv (const GLdouble *v1, const GLdouble *v2) void glrectfv (const GLfloat *v1, const GLfloat *v2 ) void glrectiv (const GLint *v1, const GLint *v2) void glrectsv (const GLshort *v1, const GLshort *v2)

Punkty Rozmiar pojedynczego punktu void glpointsize (GLfloat size) size określa średnice punktu i jego wartość musi być większa od 0.

Linie Grubość (szerokość) linii void gllinewidth (GLfloat width) Parametr określa grubość linii i musi być większy od 0. Określenie wzoru jakim będzie rysowana linia void gllinestipple (GLint factor, GLushort pattern) pattern to 16-bitowa liczba całkowita zawierajaca wzór rysowanej linii factor określa zwielokrotnienie bitów wzoru. Włączenie mechanizmu rysowania linii ze wzorem wymaga wywołania funkcji glenable z parametrem GL_LINE_STIPPLE. glenable(gl_line_stipple); Wyłączenie mechanizmu rysowania linii ze wzorem wymaga wywołania funkcji gldisable(gl_line_stipple);

Timer Obsługa timera systemowego void gluttimerfunc(unsigned int milis, void(*func)(intvalue), value) Obsługa bezczynności void glutidlefunc(void(*func)(void))