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



Podobne dokumenty
Temat: Transformacje 3D

2 Przygotował: mgr inż. Maciej Lasota

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

Rzutowanie DOROTA SMORAWA

Przekształcenia geometryczne. Dorota Smorawa

Temat: Wprowadzenie do OpenGL i GLUT

Grafika 3D OpenGL część II

Janusz Ganczarski. OpenGL Definiowanie sceny 3D

GRAFIKA CZASU RZECZYWISTEGO Wprowadzenie do OpenGL

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

Janusz Ganczarski. OpenGL Pierwszy program

Źródło:

Wprowadzenie do programowania z wykorzystaniem biblioteki OpenGL. Dorota Smorawa

Grafika Komputerowa, Informatyka, I Rok

Część 4 życie programu

1. Opis okna podstawowego programu TPrezenter.

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

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

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

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz

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

OPENGL PRZEKSZTAŁCENIA GEOMETRYCZNE

WIZUALIZACJA I STEROWANIE ROBOTEM

CorelDraw - wbudowane obiekty wektorowe - prostokąty Rysowanie prostokątów

Zaawansowany kurs języka Python

Programowanie obiektowe

I - Microsoft Visual Studio C++

Spis treści. 1 Moduł Mapy 2

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

I. Spis treści I. Spis treści... 2 II. Kreator szablonów Tworzenie szablonu Menu... 4 a. Opis ikon Dodanie nowego elementu...

Projekt współfinansowany ze środków Unii Europejskiej w ramach Europejskiego Funduszu Społecznego

Wyjątki (exceptions)

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Najmniejszą możliwą macierzą jest macierz 1 x 2 lub 2 x 1 składająca się z dwóch przyległych komórek.

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

Zadanie 2: Arytmetyka symboli

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

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

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

Laboratorium Napędu robotów

Kopiowanie, przenoszenie plików i folderów

MACIERZE. Sobiesiak Łukasz Wilczyńska Małgorzata

Jak zrobić klasyczny button na stronę www? (tutorial) w programie GIMP

15. Macierze. Definicja Macierzy. Definicja Delty Kroneckera. Definicja Macierzy Kwadratowej. Definicja Macierzy Jednostkowej

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

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

CorelDraw - podstawowe operacje na obiektach graficznych

Animacja. Instrukcja wykonania animacji metodą klatek kluczowych. Autor: Bartosz Kowalczyk. Blender 2.61

Wskaźniki w C. Anna Gogolińska

CorelDRAW. wprowadzenie

e-podręcznik dla seniora... i nie tylko.

Ćwiczenia podstawowe, zestaw 5, część 1

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

Wprowadzenie do klas w C++ oraz biblioteki opengl

Rysunek 1: Okno timeline wykorzystywane do tworzenia animacji.

Tworzenie gier na urządzenia mobilne

1 Wskaźniki. 1.1 Główne zastosowania wskaźników

True Space 3.2 KURS PODSTAWOWY. program można ściągn ąć za darmo ze strony Co to właściwie jest?

1.1. Przykład projektowania konstrukcji prętowej z wykorzystaniem ekranów systemu ROBOT Millennium

Dodatkowo klasa powinna mieć destruktor zwalniający pamięć.

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

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

Grafika Komputerowa Materiały Laboratoryjne

LABORATORIUM 3 ALGORYTMY OBLICZENIOWE W ELEKTRONICE I TELEKOMUNIKACJI. Wprowadzenie do środowiska Matlab

Podstawy 3D Studio MAX

BRELOK DO KLUCZY. ZADANIE Stwórz breloczek z nazwą twojej szkoły 1. Szkic breloczka z napisem MAKER

Klawiatura komputerowa.

1.Instalacja. Przechodzimy przez kolejne okna instalatora klikacjąć Dalej. wolek.zallegro.pl

Programowanie C++ Wykład 2 - podstawy języka C++ dr inż. Jakub Możaryn. Warszawa, Instytut Automatyki i Robotyki

Systemy wirtualnej rzeczywistości. Komponenty i serwisy

PikoCNC skróty klawiaturowe

STELLARIUM INSTRUKCJA OBSŁUGI

Algorytm. a programowanie -

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

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

Podstawy informatyki. Elektrotechnika I rok. Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia

Rozproszony System Monitoringu IXM5 Instrukcja obsługi

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,

CZĘŚĆ A PIERWSZE KROKI Z KOMPUTEREM

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

Ćwiczenie pochodzi ze strony

Techniki Programowania wskaźniki 2

Edytor tekstu MS Office Word

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

Architektura interfejsu użytkownika

Arkusz kalkulacyjny MS Excel 2010 PL.

1. Prymitywy graficzne

Następnie uruchom b-link z Menu Start lub ponownie uruchom komputer.

GEO-SYSTEM Sp. z o.o. ul. Kubickiego 9 lok. 5, Warszawa, tel./fax , geo-system@geo-system.com.

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Tworzenie prezentacji w MS PowerPoint

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

MS Word Długi dokument. Praca z długim dokumentem. Kinga Sorkowska

GRAFIKA KOMPUTEROWA 7: Kolory i cieniowanie

Programowanie w Javie

1. Umieść kursor w miejscu, w którym ma być wprowadzony ozdobny napis. 2. Na karcie Wstawianie w grupie Tekst kliknij przycisk WordArt.

Podstawy technologii cyfrowej i komputerów

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

Klawiatura. Klawisze specjalne. Klawisze specjalne. klawisze funkcyjne. Klawisze. klawisze numeryczne. sterowania kursorem. klawisze alfanumeryczne

Transkrypt:

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

C E L Ć W I C Z E N I A Celem ćwiczenia jest zapoznanie się z podstawowymi operacjami w grafice trójwymiarowej przesunięciem, skalowaniem i rotacją oraz ze sposobami pracy z myszką i klawiaturą. WAŻNA INFORMACJA NINIEJSZA INSTRUKCJA ZAWIERA LISTĘ FUNKCJI Z BIBLIOTEK OPENGL ORAZ FREEGLUT ORAZ ICH POBIEŻNY OPIS. W CELU DOKŁADNIEJSZEGO ZROZUMIENIA DZIAŁANIA JAK I MOŻLIWOŚCI TYCHŻE METOD, STUDENT POWINIEN ODWOŁAĆ SIĘ DO DOKUMENTACJI WSPOMNIANYCH BIBLIOTEK.. NIEN NALEŻY SIĘ TAKŻE OGRANICZAĆ DO FUNKCJI WYMIENIONYCH W INSTRUKCJI - UŻYWANIE INNYCH METOD, ZNALEZIONYCH W DOKUMENTACJI, JEST WYSOCE WSKAZANE. Dokumentacje używanych bibliotek można znaleźć w następujących miejscach: OpenGL 2.1 (dostępne na maszynach w pracowni): https://www.opengl.org/sdk/docs/man2/ OpenGL 4.5 (najnowsze w chwili pisania instrukcji): https://www.opengl.org/sdk/docs/man4/ GLUT (większość funkcji taka sama jak w freeglut, lepiej opisane): https://www.opengl.org/resources/libraries/glut/spec3/spec3.html freeglut: http://freeglut.sourceforge.net/docs/api.php#initialization D O D A T K O W E B I B L I O T E K I Do pracy z grafiką trójwymiarową, przyda nam się biblioteka GLU. Aby z niej korzystać, należy dodać w opcjach projektu flagę - LGLU32 (patrz: instrukcja do poprzednich laboratoriów, strona 9). Jeżeli chcemy, możemy też samodzielnie ściągnąć i dodać inne biblioteki. Przykładem mogą być biblioteki do ładowania tekstur, czy też modeli. Nie ma potrzeby pytać prowadzącego o pozwolenie. Jeżeli bibliotekę można zainstalować na stanowisku pracy w laboratorium, można jej używać. Nie należy tracić czasu odkrywając koło na nowo. Nie można natomiast korzystać z gotowych silników graficznych. Nie dlatego, że są złe, lecz dlatego, że nie nauczylibyśmy się przez to ogólnych zasad rządzących grafiką komputerową, gdyż takie silniki często ukrywają przed nami detale implementacji. Strona 2 z 9

T E O R I A O P E R A C J E M A C I E R Z O W E W celu zrozumienia rzutowania i transformacji przestrzennych, kluczowym jest, by zrozumieć bardzo istotną rzecz: widok (rzut, projekcja) jest (bardzo upraszczając sprawę) w OpenGL macierzą. Gdy tworzyliśmy nasz program na poprzednich zajęciach, domyślnie została nam przypisana macierz jednostkowa, która jest macierzą kwadratową, diagonalną, której wszystkie wartości na przekątnej są równe 1. Wygląda więc następująco: 0 0 0 I =[1 1] 0 1 0 0 0 0 1 0 0 0 0 Ważną własnością takiej macierzy jest to, że jej iloczyn z dowolną inną macierzą o takich samych wymiarach, daje zawsze w wyniku taką samą macierz jak przed mnożeniem. Czytaj: A I= A I A= A Gdzie ` ` oznacza mnożenie macierzy. Mnożenie macierzy jest nieprzemienne (z wyjątkiem mnożenia przez macierz jednostkową i macierz zerową). Jest to istotne dlatego, że wykonywanie transformacji przestrzennych w bibliotece OpenGL, to w gruncie rzeczy właśnie mnożenie macierzy. Gdy więc stworzymy sześcian i będziemy chcieli go obrócić pomnożymy aktualną macierz transformacji przez macierz definiującą obrót. Oczywiście ręczne definiowanie takich macierzy byłoby niezmiernie męczące i podatne na błędy użytkownika. Dlatego też biblioteka OpenGL udostępnia nam wiele funkcji, które ukrywają przed nami operacje macierzowe i definiują macierze o pożądanych wartościach za nas. R Z U T O W A N I E O PE NGL oferuje dwa rodzaje rzutowania rzutowanie równoległe i perspektywiczne. Technicznie można osiągnąć inne rodzaje rzutowań poprzez odpowiednie operacje macierzowe, aczkolwiek nie jest to zazwyczaj konieczne. Ortograficzne Aby włączyć rzutowanie równoległe, należy użyć funkcji GLO RTHO, której deklaracja wygląda następująco: void glortho( GLdouble lewa, GLdouble prawa, GLdouble dol, GLdouble gora, GLdouble przod, GLdouble tyl ); Strona 3 z 9

Gdzie: L EWA: pozycja lewej płaszczyzny przycinania, PR AWA: pozycja prawej płaszczyzny przycinania, DOL: pozycja dolnej płaszczyzny przycinania, GORA: pozycja górnej płaszczyzny przycinania, PR ZO D: pozycja przedniej płaszczyzny przycinania (mała wartość dodatnia, np. 0.01), T Y L: pozycja tylnej płaszczyzny przycinania (duża wartość dodatnia. np. 100.0) Perspektywiczne Aby włączyć rzutowanie perspektywiczne, należy użyć funkcji GLFRU STUM bądź GLUPE R SPECTIVE. Gdzie: void glfrustum( GLdouble lewa, GLdouble prawa, GLdouble dol, GLdouble gora, GLdouble przod, GLdouble tyl ); L EWA: pozycja lewej płaszczyzny przycinania, PR AWA: pozycja prawej płaszczyzny przycinania, DOL: pozycja dolnej płaszczyzny przycinania, GORA: pozycja górnej płaszczyzny przycinania, PR ZO D: pozycja przedniej płaszczyzny przycinania (mała wartość dodatnia, np. 0.01), T Y L: pozycja tylnej płaszczyzny przycinania (duża wartość dodatnia. np. 100.0) Gdzie: void gluperspective( GLdouble katwidzenia, GLdouble proporcje, GLdouble przod, GLdouble tyl ); K ATWIDZ E NIA: kąt widzenia w pionie, w stopniach, PRO P ORCJ E: proporcje obszaru widzenia. Powinny być takie same jak proporcje okna programu (jeżeli nie zmieniono nic od poprzednich zajęć, wartość tego parametru to [szerokość]/[ wysokość]=300.0/300.0=1.0 ). PR ZO D: pozycja przedniej płaszczyzny przycinania (mała wartość dodatnia, np. 0.01), T Y L: pozycja tylnej płaszczyzny przycinania (duża wartość dodatnia. np. 100.0) Strona 4 z 9

T R A N S F O R M A C J E P R Z E S T R Z E N N E Podstawowe transformacje przestrzenne to translacja (przesunięcie), rotacja (obrót) i skalowanie. Odpowiadają im następujące funkcje biblioteki OpenGL: Translacja: Rotacja: Skalowanie: void gltranslatef(glfloat x, GLfloat y, GLfloat z); void glrotatef(glfloat kat, GLfloat x, GLfloat y, GLfloat z); void glscalef(glfloat x, GLfloat y, GLfloat z); Gdzie, w każdej z tych funkcji: X: zmiana w osi X, Y: zmiana w osi Y, Z: zmiana w osi Z, K AT: kąt o który obrócić Kolejność wywołania tych funkcji ma znaczenie, tak jak i w rzeczywistości. Osobną klasę transformacji stanowią transformacje bezpośrednio na macierzach. Aby powiadomić maszynę stanów na której macierzy właśnie wykonujemy operacje, należy wywołać funkcję GLMATRIXMODE: void glmatrixmode(glenum mode); Gdzie argument M O DE może przyjmować wartości: GL_MODELVIEW: jeżeli chcemy pracować z macierzą modelu, GL_PROJECTION: jeżeli chcemy pracować z macierzą widoku, GL_TEXTURE: jeżeli chcemy pracować z macierzą tekstury GL_COLOR: jeżeli chcemy pracować z macierzą koloru W praktycznych zastosowaniach będziemy używać tylko dwie pierwsze wartości. GL_PROJECTION tuż przed wywołaniem którejkolwiek z funkcji dokonujących rzutowania, zaś GL_MODELVIEW we wszelkich innych wypadkach. Macierze niezależnie od ich rodzaju tworzą stos (jego maksymalny rozmiar jest zależny od implementacji i rodzaju macierzy). Podczas obliczania wyjściowej pozycji kamery, czy obiektu, wszystkie macierze są mnożone przez siebie, w kolejności FIFO. Mówiąc aktualna macierz, Strona 5 z 9

będziemy mieć na mysli ostatnio dodaną macierz (a więc tą na górze stosu). Aby położyć nową macierz na stos, użyjemy funkcji: void glpushmatrix(void); Funkcja ta tworzy kopię aktualnej macierzy. Aby ściągnąć macierz ze stosu użyjemy funkcji: void glpopmatrix(void); Aby podmienić aktualną macierz na macierz jednostkową (której zalety omówiliśmy wcześniej), użyjemy funkcji GL LOADI DE NTI T Y: void glloadidentity(void); Aby podmienić aktualną macierz na dowolną, przez nas wybraną, użyjemy funkcji GLLOADMATRIXF: void glloadmatrixf(const GLfloat *tablicawartosci); Gdzie tablica wartości wyglądająca następująco: float m[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; reprezentuje następującą macierz: 4 8 12 m=[0 1 5 9 13 2 6 10 14 3 7 11 15] Ostatnią przydatną dla nas funkcją jest funkcja mnożąca aktualną macierz przez inną, zdefiniowaną przez nas macierz: void glmultmatrixf(const GLfloat *tablicawartosci); W której tablicę wartości definiujemy w identyczny sposób jak w GLLOADMATRIXF. T R A N S F O R M A C J E W P R A K T Y C E Uproszczony algorytm działania jest następujący: 1. Podczas każdej klatki: 1.1. Rozpocznij pracę ze stosem macierzy widoku, 1.2. Załaduj macierz jednostkową, 1.3. Ustaw wybrany sposób rzutowania, 1.4. Rozpocznij pracę ze stosem macierzy modelu, 1.5. Dokonaj transformacji przestrzennych, 1.6. Narysuj obiekt. Strona 6 z 9

Przykładowa implementacja powyższego algorytmu (korzystająca z bibliotek FREEGLU T i GLU) może wyglądać następująco: #include <iostream> #include <GL/freeglut.h> using namespace std; void rysuj(); int main(int argc, char **argv) { glutinit(&argc, argv); glutcreatewindow("hello World"); glutdisplayfunc(rysuj); glutmainloop(); return 0; } void rysuj(){ // 1 static float kat=0.0f; kat+=0.01f; if(kat>=360.0) kat-=360.0; glmatrixmode(gl_projection); // 1.1 glloadidentity(); // 1.2 gluperspective(45.0f, 300.0f/300.0f, 0.1, 100.0); // 1.3 glmatrixmode(gl_modelview); // 1.4 glloadidentity(); glclearcolor(0.97f, 0.24f, 0.71f, 1.0f); glclear(gl_color_buffer_bit); gltranslatef( 0, 0, -5); // \ glrotatef(kat, 0, 1, 0); // --> 1.5 glbegin(gl_polygon); glvertex3f( -1.0f, -1.0f, 0); glvertex3f( 1.0f, -1.0f, 0); glvertex3f( 0.0f, 1.0f, 0); glend(); } glutpostredisplay(); glutswapbuffers(); M Y S Z K A I K L A W I A T U R A Biblioteka FREEGLU T oferuje kilka różnych funkcji umożliwiających ustawienie własnych metod obsługi zdarzeń pochodzących od klawiatury i myszki. W przypadku klawiatury osobno interpretowane są klawisze zwykłe (a więc litery, cyfry i tym podobne), specjalne (klawisze funkcyjne, strzałki i inne klawisze sterowania kursorem) oraz modyfikatory (ALT, CO N TRO L, S HIF T). Rozróżniane są także obsługiwane zdarzenia wciśnięcia i puszczenia klawiszy, dzięki czemu możemy na przykład rozróżnić kliknięcie klawisza, od jego przytrzymania. Strona 7 z 9

Obsługa zwykłych klawiszy: void glutkeyboardfunc(void (*funkcjaponacisnieciu)(unsigned char klawisz, int xmyszki, int ymyszki)); void glutkeyboardupfunc(void (*funkcjapopuszczeniu)(unsigned char klawisz, int xmyszki, int ymyszki)); Obsługa specjalnych klawiszy: void glutspecialfunc(void (*funkcjaponacisnieciu)(int idklawisza, int xmyszki, int ymyszki)); void glutspecialupfunc(void (*funkcjapopuszczeniu)(int idklawisza, int xmyszki, int ymyszki)); Obsługa modyfikatorów: void glutgetmodifiers(void); Gdzie, w każdej z tych funkcji: FUNKCJAPONACISNIECIU: wskaźnik do funkcji o odpowiedniej liczbie i typie argumentów oraz zwracającej VO I D. Patrz: instrukcja do poprzednich laboratoriów, strona 8, FUNKCJAPOPU SZCZENIU: wskaźnik do funkcji o odpowiedniej liczbie i typie argumentów oraz zwracającej VO I D. Patrz: instrukcja do poprzednich laboratoriów, strona 8, K L AW I SZ: kod ASCII klawisza (np. 'a' dla klawisza a), I DKL AW I SZ A: identyfikator klawisza. Wartości wyjaśnione w dokumentacji funkcji, XMYSZ K I: Pozycja x (w pikselach) kursora myszki, w momencie wystąpienia zdarzenia, YMYSZ K I: Pozycja y (w pikselach) kursora myszki, w momencie wystąpienia zdarzenia, W wypadku myszki, możliwe jest obsłużenie zdarzeń zarówno przycisków jak i kółka, a także wykrycie poruszania myszką (osobne zdarzenie jest generowane gdy myszka jest przesunięta z przyciśniętym przyciskiem, a osobne, gdy zmieni pozycję i wszystkie jej przyciski są puszczone). Obsługa naciśnięcia i puszczenia przycisków: void glutmousefunc(void (*funkcja)(int idprzycisku, int stan, int x, int y)); Obsługa kółka myszki: void glutmousewheelfunc(void (*funkcja)(int kolko, int kierunek, int x, int y)); Strona 8 z 9

Obsługa ruchu z wciśniętym przyciskiem: void glutmotionfunc(void (*funkcja)(int x, int y)); Obsługa ruchu z puszczonymi przyciskami: void glutpassivemotionfunc(void (*funkcja)(int x, int y)); Gdzie, w każdej z tych funkcji: FUNKCJA: wskaźnik do funkcji o odpowiedniej liczbie i typie argumentów oraz zwracającej VO I D. ID PR ZYC IS K U: identyfikator przycisku. Wartości wyjaśnione w dokumentacji funkcji, S TA N: identyfikator stanu. Wartość to GLUT_UP lub GLUT_DOWN, KO L KO: numer kółka. W przypadku normalnych myszek można zignorować, K I E R U N E K: kierunek scrollowania; -1 lub +1, X: Pozycja x (w pikselach) kursora myszki, w momencie wystąpienia zdarzenia, Y: Pozycja y (w pikselach) kursora myszki, w momencie wystąpienia zdarzenia, I N F O R M A C J E D O Z A P A M I Ę T A N I A Informacje te pojawiły się w trakcie wykonywania ćwiczeń i są bardzo istotne, aby móc uczestniczyć w dalszych laboratoriach i rozumieć je. Wygląd i cechy macierzy jednostkowej w OpenGL, Rodzaje i cechy rzutowań stosowanych w bibliotece OpenGL (ortograficzne, perspektywiczne), Podstawowe operacje przestrzenne czym się cechują, czy są przemienne, Po każdych laboratoriach należy wysłać projekt na maila, bądź skopiować na jakiś nośnik danych. Strona 9 z 9