Temat: Transformacje 3D

Podobne dokumenty
Elementarne obiekty geometryczne, bufory. Dorota Smorawa

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

Grafika 3D OpenGL część II

Oprogramowanie i wykorzystanie stacji roboczych. Wykład 6

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

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

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

3 Przygotował: mgr inż. Maciej Lasota

6 Przygotował: mgr inż. Maciej Lasota

2 Przygotował: mgr inż. Maciej Lasota

Temat: Wprowadzenie do OpenGL i GLUT

GRAFIKA CZASU RZECZYWISTEGO Wprowadzenie do OpenGL

Wprowadzenie do programowania z wykorzystaniem biblioteki OpenGL. Dorota Smorawa

Oświetlenie w OpenGL. Oprogramowanie i wykorzystanie stacji roboczych. Wykład 8. Światło otaczajace. Światło rozproszone.

Rzutowanie DOROTA SMORAWA

Janusz Ganczarski. OpenGL Pierwszy program

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

Przekształcenia geometryczne. Dorota Smorawa

Materiały. Dorota Smorawa

GRAFIKA KOMPUTEROWA 7: Kolory i cieniowanie

OPENGL PRZEKSZTAŁCENIA GEOMETRYCZNE

Wprowadzenie do klas w C++ oraz biblioteki opengl

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

1. Prymitywy graficzne

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

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

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

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

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

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

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

8 Przygotował: mgr inż. Maciej Lasota

IRONCAD. TriBall IRONCAD Narzędzie pozycjonujące

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

Systemy wirtualnej rzeczywistości. Komponenty i serwisy

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

Oprogramowanie i wykorzystanie stacji roboczych. Wykład 5

Janusz Ganczarski. OpenGL Definiowanie sceny 3D

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

Grafika Komputerowa, Informatyka, I Rok

4.2. Program i jego konfiguracja

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

Allegro5 3/x. Przykład wklejamy go do dev'a zamiast kodu domyślnego dal programu z allegro i kompilujemy.

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

Księgarnia PWN: Andrzej Jaskulski - AutoCAD 2010/LT Podstawy projektowania parametrycznego i nieparametrycznego

Bufor koloru cd. Czyszczenie bufora koloru glclearcolor( )

Programowanie Procesorów Graficznych

Laboratorium Programowanie urządzeń mobilnych

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

Systemy wirtualnej rzeczywistości. Podstawy grafiki 3D

Wprowadzenie do QT OpenGL

Misja#3. Robimy film animowany.

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

Rysowanie precyzyjne. Polecenie:

Mapowanie sześcienne otoczenia (cubic environment mapping)

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

Wybrane aspekty teorii grafiki komputerowej - dążenie do wizualnego realizmu. Mirosław Głowacki

1 Temat: Vertex Shader

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

Opis ikon OPIS IKON. Ikony w pionowym pasku narzędzi: Ikony te używane są przy edycji mapy. ta ikona otwiera szereg kolejnych ikon, które pozwalają na

Animowana grafika 3D. Opracowanie: J. Kęsik.

Przekształcenia geometryczne. Mirosław Głowacki Wydział Inżynierii Metali i Informatyki Przemysłowej

Spis treści CZĘŚĆ I. NIEPARAMETRYCZNE PROJEKTOWANIE 2D...31

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

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

DARMOWA PRZEGLĄDARKA MODELI IFC

1 Wstęp teoretyczny. Temat: Obcinanie odcinków do prostokąta. Grafika komputerowa 2D. Instrukcja laboratoryjna Prostokąt obcinający

Badanie ruchu złożenia

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

Mieszanie kolorów. Dorota Smorawa

Zajęcia z grafiki komputerowej Pov Ray część 2

Przekształcenia geometryczne w grafice komputerowej. Marek Badura

Studia Podyplomowe Grafika Komputerowa i Techniki Multimedialne, 2017, semestr II Modelowanie 3D - Podstawy druku 3D. Ćwiczenie nr 4.

ANDROID. OpenGL ES 1.0. Tomasz Dzieniak

11.3 Definiowanie granic obszaru przeznaczonego do kreskowania

GRAFIKA KOMPUTEROWA 10: Antyaliasing

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

Zad. 6: Sterowanie robotem mobilnym

OpenGL model oświetlenia

GLKit. Wykład 10. Programowanie aplikacji mobilnych na urządzenia Apple (IOS i ObjectiveC) #import "Fraction.h" #import <stdio.h>

Tworzenie nowego rysunku Bezpośrednio po uruchomieniu programu zostanie otwarte okno kreatora Nowego Rysunku.

Zad. 5: Rotacje 3D. 1 Cel ćwiczenia. 2 Program zajęć. 3 Opis zadania programowego

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

Zegary. Zegary (timers) umożliwiają cykliczne w danych odstępach czasu wykonać określone operacje.

Zad. 3: Rotacje 2D. Demonstracja przykładu problemu skończonej reprezentacji binarnej liczb

AUTOCAD MIERZENIE I PODZIAŁ

Maskowanie i selekcja

Rysowanie punktów na powierzchni graficznej

1. Opis okna podstawowego programu TPrezenter.

Wstawianie nowej strony

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

Zad. 4: Rotacje 2D. 1 Cel ćwiczenia. 2 Program zajęć. 3 Opis zadania programowego

Grafika komputerowa i wizualizacja. dr Wojciech Pałubicki

Animacje z zastosowaniem suwaka i przycisku

Wyświetlacz alfanumeryczny LCD zbudowany na sterowniku HD44780

DesignCAD 3D Max 24.0 PL

Słowa kluczowe Sterowanie klawiaturą, klawiatura, klawisze funkcyjne, przesuwanie obiektów ekranowych, wydawanie poleceń za pomocą klawiatury

Uruchamianie programu

Rzutowanie z 4D na 3D

WASM AppInventor Lab 3. Rysowanie i animacja po kanwie PODSTAWY PRACY Z KANWAMI

Transkrypt:

Instrukcja laboratoryjna 11 Grafika komputerowa 3D Temat: Transformacje 3D Przygotował: dr inż. Grzegorz Łukawski, mgr inż. Maciej Lasota, mgr inż. Tomasz Michno 1 Wstęp teoretyczny Bardzo często programując grafikę 3D występuje potrzeba dokonywania przekształceń obiektów (przesuwanie, obracanie, skalowanie itp.). W bibliotece OpenGL, w celu dostarczenia tych funkcjonalności, zastosowano technikę polegającą na modyfikowaniu całego układu współrzędnych, dzięki czemu przekształcenia nakładają się na siebie. Od strony programisty operacja ta polega na modyfikowaniu macierzy modelowania, zazwyczaj za pomocą dostarczanych funkcji, opisanych w dalszej części instrukcji. 1.1 Przekształcenia 1.1.1 Translacja Translacja jest przekształceniem polegającym na przesunięciu obiektu o podany wektor (mówiąc ściślej przesunięciu całego układu współrzędnych). W bibliotece OpenGL realizowane jest to za pomocą funkcji: void gltranslatef(glfloat x, GLfloat y, GLfloat z) void gltranslated(gldouble x, GLdouble y, GLdouble z) Obie funkcje przyjmują 3 parametry: x, y oraz z, które informują bibliotekę o ile jednostek przesunąć obiekt na osiach OX, OY oraz OZ. Funkcja mnoży bieżąca macierz modelowania (widoku modelu) przez macierz translacji. Następnie nowa macierz staje się bieżącą macierzą modelowania. Przykład 1. Przesunięcie trójkąta o wektor [-250, -100, -100]: void display() { glclear(gl_color_buffer_bit GL_DEPTH_BUFFER_BIT); glloadidentity(); glcolor3f(0.0, 0.0, 1.0); 1/7

gltranslatef(-250, -100, -100); /* <===== translacja, każdy obiekt po tym wywołaniu będzie przesunięty o ten wektor [-250, -100, -100] */ glbegin(gl_triangles); glvertex3f(0, 200, 0); glcolor3f(0.0, 1.0, 1.0); glvertex3f(50, 220, 0); glcolor3f(1.0, 1.0, 1.0); glvertex3f(100, 200, 0); glend(); glutswapbuffers(); } 1.1.2 Skalowanie Skalowanie, podobnie jak w bibliotece Allegro, polega na zmniejszeniu lub powiększeniu obiektu o zadany współczynnik, zdefiniowany dla każdej z osi: void glscalef(glfloat x, GLfloat y, GLfloat z) void glscaled(gldouble x, GLdouble y, GLdouble z) Funkcje przyjmują współczynniki skalowania dla kolejnych osi. Wartość współczynnika równa 1 oznacza pozostawienie figury bez zmian. Przykład 2. Zmniejszenie obiektu w osi OX o połowę: glscalef(0.5, 1, 1); // zwykłe rysowanie trójkątów glbegin(gl_triangles); glvertex3f(0, 200, 0); // pierwszy punkt glcolor3f(0.0, 1.0, 1.0); glvertex3f(50, 220, 0); // drugi punkt 2/7

glcolor3f(1.0, 1.0, 1.0); glvertex3f(100, 200, 0); // trzeci punkt glend(); 1.1.3 Rotacja Rotacja w OpenGL polega na obrocie układu współrzędnych wokół podanego wektora (np. wektor [0, 1, 0] obróci nam wokół osi OY): void glrotatef(glfloat angle, GLfloat x, GLfloat y, GLfloat z) void glrotated(gldouble angle, GLdouble x, GLdouble y, GLdouble z) Parametr angle określa o jaki kąt (w stopniach) będzie dokonywany obrót, natomiast x, y i z są to poszczególne składowe wektora. Funkcja mnoży bieżącą macierz modelowania (widoku modelu) przez macierz obrotu. Kąt obrotu określany jest w kierunku przeciwnym do ruchu wskazówek zegara, sam obrót dokonywany jest wokół osi wyznaczonej przez wektor o początku w układzie współrzędnych i końcu w punkcie (x,y,z). Nowa macierz staje się bieżącą macierzą modelowania. 1.1.4 Własne mnożenie macierzy Istnieje również możliwość własnego, ręcznego wykonania wymienionych (i niewymienionych) przekształceń, za pomocą mnożenia bieżącej macierzy przez drugą macierz. Odpowiedzialna za to jest funkcja: void glmultmatrixd(const GLdouble * m); void glmultmatrixf(const GLfloat * m); Więcej informacji można znaleźć pod poniższym adresem: http://www.opengl.org/sdk/docs/man/xhtml/glmultmatrix.xml 1.2 Inne przydatne funkcje Poniżej zostały zebrane funkcje, które czasami są przydatne w aplikacjach z przekształceniami obiektów. 1.2.1 Resetowanie macierzy Na początku funkcji rysującej należy zawsze wczytać początkowe wartości do macierzy 3/7

modelowania. Dzięki temu unikniemy sytuacji, w której przekształcenia będą się nakładały na siebie w nieskończoność. Aby zresetować macierz widoku należy wywołać funkcję: void glloadidentity( void); Funkcja ta ładuje macierz jednostkową, dzięki czemu układ współrzędnych zostaje ustawiony na domyślnym położeniu. Oprócz macierzy modelowania, glloadidentity() można stosować do innych macierzy (tak na prawdę glloadidentity po prostu wczytuje macierz jednostkową do aktualnie używanej macierzy). Przełączanie pomiędzy macierzami wykonuje się za pomocą glmatrixmode: glmatrixmode(gl_projection); // Macierz projekcji glmatrixmode(gl_modelview); // macierz modelowania 1.2.2 Tryb wypełniania Tryb wypełniania wielokątów umożliwia decydowanie o tym, jak ma być wypełniona przednia, a jak tylna strona wielokąta. Do ustawia trybu wypełniania wielokątów służy funkcja: void glpolygonmode(glenum face, GLenum mode) Jej pierwszy parametr określa, których ścian będzie dotyczyć operacja (GL_FRONT, GL_BACK, GL_FRONT_AND_BACK). Drugi parametr określa styl wypełniania ścian wielokąta (GL_LINE, GL_POINT, GL_FILL). Domyślnie jest ustawiony GL_FILL czyli wypełnianie całego wielokąta. GL_LINE oznacza że będą widocznie jedynie linie tzw. tryb wireframe (druciak), GL_POINT oznacza, że będą widoczne jedynie punkty wielokąta. 1.2.3 Widoczność i ukrywanie krawędzi Często niepotrzebne jest rysowanie wewnętrznych ścian obiektów, rysowanie takie zajmuje jedynie dodatkową moc obliczeniową komputera. OpenGL umożliwia automatyczne usuwanie niewidocznych ścian. Aby ukryć niewidoczne ściany należy włączyć opcję ukrywania niewidocznych powierzchni wielokątów za pomocą funkcji glenable z parametrem GL_CULL_FACE. Następnie należy wywołać funkcję glcullface. void glcullface(glenum face) Funkcja ta przyjmuje jeden z trzech parametrów GL_FRONT (ściana przednia), GL_BACK (ściana tylna), GL_FRONT_AND_BACK (ściana przednia i tylna). 4/7

Ukrywanie krawędzi wykorzystywane jest w przypadku rysowania obiektów w trybie tzw. wireframe (siatki). Do ukrywani krawędzi służy specjalna funkcja OpenGL: void gledgeflag(glenum flag) Funkcja ta przyjmuje jeden z dwóch parametrów GL_TRUE (rysuj krawędź), GL_FALSE (nie rysuj krawędzi). Przykład 3: glpolygonmode(gl_front_and_back, GL_LINE); glbegin(gl_polygon); glcolor3f(0.5f, 0.5f, 0.5f); gledgeflag(gl_false); glvertex3f(0.0f, 2.0f, 0.0f); gledgeflag(gl_true); glvertex3f(2.0f, 2.0f, 0.0f); glvertex3f(2.0f, -2.0f, 0.0f); glvertex3f(-4.0f, -2.0f, 0.0f); glvertex3f(-5.0f, 0.0f, 0.0f); glend(); 1.2.4 Timer Czasami występuje potrzeba wykonywania kodu w pewnych, ustalonych odstępach czasu (np. animacja). W celu rozwiązania tego problemu programista/programiści biblioteki glut dodali do niej obsługę timerów. Timer jest funkcją, która wykonuje się co pewien zadany czas. Glut wymaga, aby funkcja ta miała ustalone parametry: void funkcjatimera(int value); Następnie należy zarejestrować ją (podobnie jak funkcje rysowania i klawiatury) za pomocą następującej funkcji: void gluttimerfunc(unsigned int msecs, void (*func)(int value), value); Parametry są następujące: 5/7

msecs czas w milisekundach, po którym zostanie wywołana funkcja timera func wskaźnik na funkcję timera value wartość przekazywana do funkcji timera (parametr value funkcji timera będzie ustawiany na tą wartość) Uwaga! Ustawienie timera w funkcji gluttimerfunc spowoduje tylko jednorazowe jego wywołanie. Dlatego w funkcji timera najlepiej jest użyć jej ponownie (patrz przykład 4). Glut umożliwia zadeklarowanie dowolnej liczby timerów (np. można zadeklarować dwa timery, które wykonują się o różnym czasie). Przykład 4: void funkcjatimera(int val) { // kod wykonywany w timerze //... // odrysowanie ekranu po wprowadzeniu zmian (jeśli jest taka potrzeba): glutpostredisplay(); // ponowne ustawienie timera (co 1000 ms = 1s): gluttimerfunc(1000, funkcjatimera, 0); } int main(int argc, char *argv[]) { glutinit(&argc, argv); /*... */ // ustawienie timera (wywoła funkcję funkcjatimera po 1000 ms = 1s): gluttimerfunc(1000, funkcjatimera, 0); glutmainloop(); 6/7

return(0); } 2 Zadania Napisz program, który będzie wykonywał animacje (z użyciem timera) kilku obiektów (dowolnych) z użyciem przedstawionych w instrukcji transformacji 3D (translacja, obrót, skalowanie), np. odbijające się od ścian okna obiekty dostarczane przez gluta. Aplikacja powinna używając timera zmieniać kolory obiektów (co 5 sekund) oraz zmieniać tryb wypełniania (co 8 sekund) można użyć dwóch timerów. Wskazówki i uwagi nie używaj funkcji glulookat(); ponieważ wprowadza przekształcenia sceny na końcu funkcji display() umieść wywołanie funkcji glutpostredisplay(); która odświeża zawartość ekranu do poprawnego wyświetlania obiektów należy prawidłowo obsłużyć bufor głębokości 1. Inicjalizacja trybu wyświetlania dodanie parametru GLUT_DEPTH 2. Włączenie testu głębokości parametr GL_DEPTH_TEST 3. Czyszczenie bufora głębokości przed rysowaniem param. GL_DEPTH_BUFFER_BIT 7/7