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

Podobne dokumenty
Temat: Transformacje 3D

Janusz Ganczarski. OpenGL Pierwszy program

Baltie 3. Podręcznik do nauki programowania dla klas I III gimnazjum. Tadeusz Sołtys, Bohumír Soukup

2 Przygotował: mgr inż. Maciej Lasota

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

Ćwiczenie 1 Automatyczna animacja ruchu

54. Układy współrzędnych

Maskowanie i selekcja

Przekształcenia geometryczne. Dorota Smorawa

Grafika 3D OpenGL część II

Celem ćwiczenia jest zapoznanie się z podstawowymi funkcjami i pojęciami związanymi ze środowiskiem AutoCAD 2012 w polskiej wersji językowej.

3 Przygotował: mgr inż. Maciej Lasota

1. Prymitywy graficzne

Elementarne obiekty geometryczne, bufory. Dorota Smorawa

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

Ćwiczenie 6 Animacja trójwymiarowa

Wprowadzenie do programowania z wykorzystaniem biblioteki OpenGL. Dorota Smorawa

Systemy wirtualnej rzeczywistości. Komponenty i serwisy

Cykl lekcji informatyki w klasie IV szkoły podstawowej. Wstęp

Rysowanie precyzyjne. Polecenie:

Simba 3D LOGO. Cele zajęć: - Poznanie zasad i sposobów tworzenia procedur z parametrami. - Poznanie zasad wywoływania procedur z parametrami.

Rzutowanie DOROTA SMORAWA

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

Kopiowanie, przenoszenie plików i folderów

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

Skalowanie i ustawianie arkuszy/układów wydruku w AutoCAD autor: M. Motylewicz, 2012

RYSUNEK TECHNICZNY I GEOMETRIA WYKREŚLNA INSTRUKCJA DOM Z DRABINĄ I KOMINEM W 2D

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

Instrukcja wprowadzania graficznych harmonogramów pracy w SZOI Wg stanu na r.

Logo Komeniusz. Gimnazjum w Tęgoborzy. Mgr Zofia Czech

1. Opis okna podstawowego programu TPrezenter.

narzędzie Linia. 2. W polu koloru kliknij kolor, którego chcesz użyć. 3. Aby coś narysować, przeciągnij wskaźnikiem w obszarze rysowania.

3D Analyst. Zapoznanie się z ArcScene, Praca z danymi trójwymiarowymi - Wizualizacja 3D drapowanie obrazów na powierzchnie terenu.

IRONCAD. TriBall IRONCAD Narzędzie pozycjonujące

6.4. Efekty specjalne

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

Spora część kodu programu jest dla nas nieprzydatna. Dokonaj zmian tak, aby kod miał postać:

Grafika Komputerowa Materiały Laboratoryjne

Expo Composer Garncarska Szczecin tel.: info@doittechnology.pl. Dokumentacja użytkownika

Rysunek 1: Okno timeline wykorzystywane do tworzenia animacji.

- biegunowy(kołowy) - kursor wykonuje skok w kierunku tymczasowych linii konstrukcyjnych;

Przedrostkowa i przyrostkowa inkrementacja i dekrementacja

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Zad. 6: Sterowanie robotem mobilnym

Część XVII C++ Funkcje. Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład.

CorelDRAW. 1. Rysunek rastrowy a wektorowy. 2. Opis okna programu

Programowanie strukturalne i obiektowe. Funkcje

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

Rys 3-1. Rysunek wałka

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

Wprowadzenie do QT OpenGL

37. Podstawy techniki bloków

1 Podstawy c++ w pigułce.

Misja#3. Robimy film animowany.

1 Podstawy c++ w pigułce.

DARMOWA PRZEGLĄDARKA MODELI IFC

Menu Narzędzia w Edytorze symboli i Edytorze Widoku aparatów

SPOSOBY POMIARU KĄTÓW W PROGRAMIE AutoCAD

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

Laboratorium z Grafiki InŜynierskiej CAD. Rozpoczęcie pracy z AutoCAD-em. Uruchomienie programu

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Praktyka programowania projekt

Tworzenie gier na urządzenia mobilne

Użycie przestrzeni papieru i odnośników - ćwiczenie

Systemy multimedialne 2015

CorelDraw - podstawowe operacje na obiektach graficznych

po wykonaniu instrukcji wartość zmiennej x zostanie zwiększona o 50,a

Rysowanie punktów na powierzchni graficznej

Następnie zdefiniujemy utworzony szkic jako blok, wybieramy zatem jak poniżej

Grafika 3D program POV-Ray

przedmiot kilka razy, wystarczy kliknąć przycisk Wyczaruj ostatni,

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

1. Wybierz polecenie rysowania linii, np. poprzez kliknięcie ikony W wierszu poleceń pojawi się pytanie o punkt początkowy rysowanej linii:

GRAFIKA CZASU RZECZYWISTEGO Wprowadzenie do OpenGL

Programowanie obiektowe

Ćwiczenie 14 Dmuchawce

Część XII C++ Warunki zagnieżdżone Ćwiczenie 1 nazwisko40 2. nie przepisując komentarzy!

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

OPENGL PRZEKSZTAŁCENIA GEOMETRYCZNE

Scenariusz lekcji opartej na programie Program nauczania informatyki w gimnazjum DKW /99

(1,10) (1,7) (5,5) (5,4) (2,1) (0,0) Grafika 3D program POV-Ray

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

Jak napisać program obliczający pola powierzchni różnych figur płaskich?

Utworzenie pliku. Dowiesz się:

TWORZENIE SZEŚCIANU. Sześcian to trójwymiarowa bryła, w której każdy z sześciu boków jest kwadratem. Sześcian

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

Informatyka Arkusz kalkulacyjny Excel 2010 dla WINDOWS cz. 1

Programowanie Obiektowe GUI

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

Praca w programie Power Draft

6. Wciśnij Shift+F12 lub wybierz odpowiednią ikonę z paska narzędziowego (patrz wcześniejsze odcinki). 7. [rys.1] Klub IKS

Prezentacja multimedialna MS PowerPoint 2010 (podstawy)

Połączenie AutoCad'a z bazą danych

TWORZENIE OBIEKTÓW GRAFICZNYCH

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

Modelowanie dłoni. 1. Obraz referencyjny

OPROGRAMOWANIE UŻYTKOWE

Podręczna pomoc Microsoft Power Point 2007

2. Korzystając z ikony Warstwy stwórz nowe warstwy według podanego schematu:

Przy dużej wielkości głębokości uzyskamy wrażenie nieskończoności: Dla głębokości zerowej uzyskamy tekst płaski:

Transkrypt:

Laboratorium 1 Część I Podstawy biblioteki graficznej OpenGL. I. Konfiguracja środowiska 1. Ściągamy bibliotekę freeglut i rozpakujemy do głównego folderu dysku systemowego np. C:\freeglut 2. Uruchamiamy Dev-C++ i tworzymy nowy pusty plik źródłowy. - z górnego menu klikamy Narzędzia->Opcje Kompilatora - do wiersza poleceń kompilatora dodajemy opcję: -DFREEGLUT_STATIC - do wiersza poleceń konsolidatora dodajemy opcje: -static-libgcc -lfreeglut_static -lopengl32 -lwinmm -lgdi32 - klikamy zakładkę "Katalogi" i uzupełniamy wszystkie brakujące ścieżki do katalogów np: C:\freeglut\bin, C:\freeglut\include oraz C:\freeglut\lib (pamiętając o kliknięciu przycisku "Dodaj" za każdym razem gdy wpiszemy katalog. II. Pierwszy program OpenGL. 1. Ściągnij przykładowy program a następnie skompiluj i uruchom. 2. Przeanalizuj procedury programu jest to szkielet aplikacji, który będziemy wykorzystywać w kolejnych zadaniach. Jego właściwe zrozumienie jest ważną rzeczą w kontekście dalszych poleceń. 3. Zmień zawartość funkcji renderującej na poniższy kod, po czym skompiluj i uruchom program. void DrawScene(void) // Czyścimy okno aktualnym (domyślnym) kolorem glclear(gl_color_buffer_bit); // Ustawiamy grubość linii gllinewidth(5.0f); // Tworzenie prymitywów graficznych zawsze ograniczamy funkcjami glbegin i glend glbegin(gl_lines); // Ustawiamy bieżący kolor rysowania na czerwony glcolor3f(1.0f, 0.0f, 0.0f); // Dwa końce pierwszego odcinka glvertex2f(-50.0f, 0.0f); glvertex2f(0.0f, 50.0f); // Zmieniamy kolor rysowania na zielony glcolor3f(0.0f, 1.0f, 0.0f); // Dwa końce drugiego odcinka glvertex2f(0.0f, 50.0f); glvertex2f(50.0f, 0.0f); // Zmieniamy kolor rysowania na niebieski glcolor3f(0.0f, 0.0f, 1.0f); // Dwa końce drugiego odcinka glvertex2f(50.0f, 0.0f);

glend(); glvertex2f(-50.0f, 0.0f); // Komenda wykonania poleceń rysujących glflush(); 4. Po uruchomieniu programu na ekranie powinieneś zobaczyć trzy odcinki o różnych kolorach uformowane na kształt trójkąta. Przeanalizuj powyższy kod. Za rysowanie prymitywów (podstawowych obiektów OpenGLa) odpowiedzialna jest para funkcji glbegin i glend. Dowiedz się jakie obiekty mogą być rysowane tą parą. 5. Zmodyfikuj funkcję renderującą tak aby rysowała trójkąt wypełniony kolorem interpolowanym pomiędzy czerwonym, zielonym i niebieskim. 6. Napisz program rysujący zdeformowany dywan Sierpińskiego. W programie należy uwzględnić podawaną przez użytkownika liczbę iteracji. Algorytm jest następujący: a. Dany jest kwadrat o boku a. b. Kwadrat dzielimy na 9 mniejszych kwadratów o bokach a/3 i środkowy usuwamy. c. Następnie, każdy z kwadratów dzielimy na 9 mniejszych kwadratów i usuwamy środki. d. Procedurę powtarzamy iteracyjnie.

Część II Celem ćwiczenia jest zaznajomienie się ze sposobami interpretacji przestrzeni 2D oraz 3D przez środowisko biblioteki graficznej OpenGL. Dodatkowo zostanie pokazany sposób na interakcje z programem poprzez klawiaturę. Pokazany zostanie również prosty sposób animacji. Przestrzeń obiektu (inaczej przestrzeń modelu) jest to układ współrzędnych obiektu, w którym ten obiekt jest definiowany. Przykładowo: dla sfery jej przestrzenią obiektu może być układ współrzędnych, którego środek jest środkiem sfery; dla walca środek układu może leżeć w środku podstawy, a kierunek osi z jest zgodny z kierunkiem osi symetrii tego walca. Położenie wierzchołków w przestrzeni obiektów jest określone jako wektor [x, y, z]. Współrzędne homogeniczne to czteroelementowy wektor postaci [x, y, z, w], w którym pierwsze 3 składniki określają położenie w przestrzeni 3D, a czwarty to dodatkowy parametr w. Jeśli wektor położenia zostaje wyrażony za pomocą wektora 3-elementowego to zakłada się, że w = 1. Matematyczne znaczenie parametru w jest takie, że jest to wartość, przez którą należy podzielić x, y i z by uzyskać położenie w postaci tradycyjnej. Tak, więc jest to pewien współczynnik skali. Przestrzeń świata przestrzeń konkretnego obiektu nie ma związku z innymi obiektami posiadającymi własne przestrzenie. Przestrzeń świata definiuje pewien bezwzględny punkt odniesienia dla wszystkich obiektów sceny. Jeśli przyjmiemy, że przestrzenią świata jest sala laboratoryjna, to obiekty w niej występujące (komputery, stoły, krzesła) mają różne położenie i ukierunkowanie. Przekształcenie modelu opisuje sposób, w jaki obiekt w przestrzeni modelu jest transformowany do przestrzeni świata. Na przykład, musimy obrócić, przeskalować i przesunąć stolik by znalazł się on w odpowiednim miejscu w laboratorium. Wszystkie te przekształcenia można zapisać matematycznie jako macierze 4x4 i składać je w jedną macierz transformacji, co jest istotne dla wydajności programu. Mnożąc położenie punktu w postaci homogenicznej (w = 1) w przestrzeni modelu przez macierz 4x4 reprezentującą przekształcenie modelu w przestrzeń świata, otrzymamy to samo położenie opisane w przestrzeni świata. Przestrzeń oka (inaczej przestrzeń widoku) to przestrzeń obserwatora, czyli układ współrzędnych obserwatora względem, którego opisujemy położenie obserwowanych obiektów w scenie. W standardzie OpenGL przyjęło się, że domyślnie obserwator ( oko ) znajduje się w początku swojego układu współrzędnych, a kierunek patrzenia na scenę jest zgodny z kierunkiem osi z i biegnie wzdłuż jej ujemnych wartości. Przekształcenie widoku konwertuje położenie w przestrzeni świata na położenie w przestrzeni obserwatora. To przekształcenie da się zestawić w postaci macierzy 4x4 i nazywane jest macierzą model-widok. Jest to macierz, która łączy w sobie przekształcenie modelu i przekształcenie widoku. Przestrzeń przycięcia kiedy położenia znajdują się już w przestrzeni oka, kolejnym krokiem jest określenie, które z nich znajduje się w widocznym obszarze. Zatem kolejnym układem po przestrzeni oka jest przestrzeń przycięcia. Wyjaśnienie tej techniki można prześledzić obserwując działanie funkcji np. glortho().

Przekształcenie, które konwertuje współrzędne przestrzeni oka do przestrzeni przycięcia jest nazywane przekształceniem rzutowania. To przekształcenie definiuje obszar przestrzeni oka, w którym znajdują się widoczne obiekty. W OpenGL wszystko co ma być widoczne musi się znajdować w sześcianie, którego każdy punkt spełnia nierówności: -w x w, -w y w, -w z w. Przekształcenie to podobnie jak wcześniej wymienione da się zestawić w postaci tzw. macierzy rzutowania o rozmiarach 4x4. Znormalizowane współrzędne przycięcia współrzędne przycięcia maja postać homogeniczną [x, y, z, w], lecz koniecznym jest aby uzyskać położenie w przestrzeni dwu-wymiarowej (x,y) wraz zadaną wartością głębi. Uzyskuje się to dzieląc składowe wektora x, y, z przez składnik w. W ten sposób otrzymane współrzędne noszą nazwę znormalizowanych współrzędnych urządzenia. Na ostatnim etapie następuje transformacja znormalizowanych współrzędnych urządzenia na współrzędne okna, które mierzone są w pikselach. Animacja w OpenGL może być realizowana w prosty sposób. Wystarczy aby przed wywołaniem funkcji renderującej scenę wywołać funkcję, która będzie wyliczała np. aktualne położenie obiektu na podstawie zapamiętanego wcześniej położenia. Zmiana tego parametru może być dokonywana w wybranych chwilach czasowych. Zrealizować to można za pomocą funkcji gluttimerfunc z biblioteki GLUT. Jako pierwszy argument tej funkcji podaje się liczbę milisekund, po upływie których funkcja wywołuje funkcję, której nazwa została podana jako drugi argument. Prototyp funkcji wywołującej jest następujący: void TimerFunction(int value); GLUT czeka zadaną liczbę milisekund po czym odpala wykonanie funkcji TimerFunction(). Jednakże, jest to jednorazowe wywołanie, więc aby zachować ciągłość należy w funkcji TimerFunction() zresetować licznik wywołaniem: gluttimerfunc(30, TimerFunction, 1); /*1*/ 1. Skompiluj i uruchom załączony program. 2. Zmodyfikuj funkcję DrawSceneAxes dodając na jej końcu ustawianie koloru rysowania na szary (wszystkie składowe koloru przyjmują wartość 0.5f), oraz funkcję z biblioteki GLUT rysującą dzbanek na herbatę: glutwireteapot(4.0); 3. Skompiluj i uruchom program. Dzbanek jest rysowany jako niepełna siatka - co należy poprawić w kodzie by siatka była rysowana w całości (może coś jest nie tak z rzutowaniem)? Dokonaj stosownych poprawek i sprawdź rezultaty. 4. Po uruchomieniu na ekranie widzimy obrazek, gdzie dzbanek widoczny jest w pozycji, w której nie da się stwierdzić czy jest to obiekt trójwymiarowy czy tylko płaska siatka. Żeby pokazać trójwymiarową strukturę tego obiektu musimy go obrócić nieznacznie. W tym celu, w linii poprzedzającej rysowanie dzbanka dodaj wywołanie: glrotatef(-20.0f, 1.0f, 0.3f, 0.0f);Zobacz efekt. 5. Korzystając z operacji obrotu, przesunięcia (gltranslatef) oraz skalowania (glscalef), spróbuj przemieścić, obrócić i przeskalować dzbanek. Czy efekt będzie ten sam jeśli zamienimy kolejność operacji? 6. Powróć do kodu z pkt. 4. Zmodyfikuj kod tak aby dzbanek obracał się wokół osi x i y. W tym celu zadeklaruj dwie zmienne globalne przechowujące bieżący kąt obrotu względem podanych osi, np.:

/* Kąty obrotu wokół osi X i Y */ GLfloat x_angle; GLfloat y_angle; Obrotu dokonuj za pomocą funkcji: glrotatef(x_angle, 1.0f, 0.0f, 0.0f); glrotatef(y_angle, 0.0f, 1.0f, 0.0f); 7. Zdefiniuj własną procedurę TimerFunction(), w której będzie następowała odpowiednia inkrementacja tych zmiennych o wartość v_angle z pkt. 10. Przed wyjściem z tej funkcji umieść resetowanie licznika milisekund (/*1*/). Funkcje zakończ wywołaniem funkcji odświeżającej okno: glutpostredisplay(). W funkcji main, w linii za rejestracją funkcji zwrotnych umieść resetowanie licznika (/*1*/). 8. W funkcji main dodaj linię: glutkeyboardfunc(keyboardfunc); 9. Skopiuj i wklej poniży kod. Następnie dokonaj stosownych modyfikacji tak aby wciśnięcie klawisza w lub r powodowało przyspieszenie lub spowolnienie (poprzez obrót w przeciwnym kierunku) obracania się dzbanka. Pamiętaj o deklaracji zmiennej globalnej GLfloat v_angle; /* Funkcja obsługująca klawiaturę */ void KeyboardFunc(unsigned char key, int x, int y) switch(key) case 27: // Wciśnięcie klawisza ESC spowoduje wyjście z programu exit(0); case 'w': // Wciśnięcie klawisza w spowoduje inkrementację zmiennej v_angle += 0.05f; break; case 'r': // Wciśnięcie klawisza r spowoduje dekrementację zmiennej v_angle -= 0.05f; break; glutpostredisplay();