background image

Instrukcja 

laboratoryjna 

9

Grafika komputerowa 3D

Temat: Manipulowanie przestrzenią

Przygotował:  dr inż. Grzegorz Łukawski, mgr inż. Maciej Lasota, mgr inż. Tomasz 
                        Michno

 1  Wstęp teoretyczny

 1.1  Układ współrzędnych

W grafice komputerowej 3D wykorzystuje się dwa układy współrzędnych:

1. lewoskrętny

2. prawoskrętny

Różnica pomiędzy nimi polega na innym traktowaniu kierunku współrzędnej Z: w układzie 

lewoskrętnym   wartości   na   osi   Z   rosną   „w głąb   ekranu”,   natomiast   w prawoskrętnym   maleją 

(zobrazowane na poniższych rysunkach).  Biblioteka OpenGL posiada obsługę jedynie układu 

prawoskrętnego  (w DirectX możliwe jest korzystanie z obydwu typów).   Fizyczne zamienienie 

jednego układu w drugi nie jest możliwe. Możliwe jest natomiast „udawanie” układu lewoskrętnego 

i odwrotnie poprzez umieszczanie przed każdą współrzędną wierzchołka osi „Z” znaku minusa.

1/7

background image

 1.2  Rzutowanie

Rzutowanie jest operacją polegającą na tym, aby odpowiednie piksele na płaskim ekranie 

były wyświetlane w taki sposób, by sprawiać wrażenie trójwymiarowej  głębi (przestrzeni 3D). 

Rzutowanie   również   pozwala   tworzyć   przestrzeń   dwuwymiarową   2D   dzięki   odpowiedniemu 

przekształceniu.   OpenGL  wyposażony  jest   w   specjalne   funkcje,   dzięki   którym   można   uzyskać 

odpowiedni efekt rzutowania. Wyróżniamy dwa typy rzutowania:

1. rzutowanie perspektywiczne (wykorzystywane w grach 3D),

2. rzutowanie ortogonalne (wykorzystywane w programach typu CAD/CAM).

2/7

background image

 1.2.1 

Rzutowanie perspektywiczne

W rzutowaniu perspektywicznym obiekty położone dalej od kamery są mniejsze od tych 

położonych   bliżej.   OpenGL   udostępnia   specjalną   funkcję,   która   tworzy   odpowiednią   macierz 

perspektywy.

void gluPerspective(GLdouble n, GLdouble a, GLdouble zN, GLdouble zF)

Funkcja przyjmuje cztery parametry. Pierwszy parametr określa kąt widzenia (w stopniach, 

zalecana wartość 60 stopni) w pionie. Drugi parametr określa stosunek szerokości do wysokości 

okna (zazwyczaj podaje się szerokość okna, w którym wyświetlana jest grafika podzieloną przez 

wysokość). Dwa ostatnie parametry określają granicę przednią i tylną, z reguły parametr „zN” 

przyjmuje wartość 1.0.

Widok   perspektywiczny   tworzy   stożek   widzenia,   którego   granicami   są   właśnie   granica 

przednia i tylna. Wszystko co jest w stożku pojawia się na ekranie, obiekty znajdujące się poza 

stożkiem nie są wyświetlane.

Funkcja gluPerspective jak można zauważyć, nie należy do biblioteki OpenGL. Jest ona 

częścią   biblioteki   GLU   (biblioteki   pomocniczej).   Oryginalną   funkcją   służącą   do   ustawiania 

rzutowania perspektywicznego w bibliotece OpenGL jest glFrustum, gluPerspective jest jedynie 

nakładką na tą funkcje.

void glFrustum(GLdouble left, GLdouble right, GLdouble bottom,

GLdouble top, GLdouble zN, GLdouble zF)

Funkcja   przyjmuje   sześć   parametrów.   Pierwsze   dwa   parametry   określa   prawą   i   lewą 

współrzędną pionowej linii obcinania. Kolejne dwa parametry określają górna i dolną współrzędną 

3/7

background image

poziomej linii obcinania. Dwa ostatnie parametry określają granicę przednią i tylną.

 1.2.2 

Rzutowanie ortogonalne

Nazywane  inaczej   rzutowaniem  prostokątnym  lub  równoległym.  Polega  ono  na  tym,   że 

każdy obiekt znajdujący się w obszarze rysowania niezależnie od swojej odległości od kamery ma 

dokładnie tą samą wielkość.

W OpenGL dostępna jest specjalna funkcja, która tworzy rzutowanie ortogonalne.

void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top,

GLdouble near, GLdouble far)

Funkcja glOrtho tworzy tzw. bryłę widzenia (bryłę obcinania). Parametry „left” oraz „right” 

określają szerokość bryły, parametry „bottom” oraz „top” jej wysokość. Dwa ostatnie parametry 

„near” i „far” określają głębię. 

W obrębie bryły widzenia tworzone są obiekty, które są wyświetlane na ekranie. To czy obiekt 

pojawi się na ekranie zależy od tego czy znajdzie się on w obszarze prostopadłościanu. Rzutowanie 

ortogonalne wykorzystywane jest często w grach 2D oraz programach typu CAD/CAM.

4/7

background image

 1.2.3 

Kamera

Oprócz samego rzutowania w OpenGL bardzo ważną rzeczą jest kamera. Kamera określa 

położenie obserwatora (w przestrzeni 3D) względem obserwowanych obiektów.

OpenGL posiada funkcję tworzącą macierz kamery.

void gluLookAt(GLdouble x, GLdouble y, GLdouble z, GLdouble centerx,

GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy,

GLdouble upz)

Funkcja   przyjmuje   dziewięć   argumentów.   Pierwsze   trzy   argumenty   (x,y,z)   określają 

położenie kamery w przestrzeni trójwymiarowej. Kolejne trzy argumenty (centerx, centery, centerz) 

określają punkt na który skierowana jest kamera (patrzy kamera). Ostatnie trzy argumenty (upx, 

upy, upz) określają wektor pionu kamery, dzięki tym parametrom możliwe jest obracanie kamery.

 1.2.4 

Macierz rzutowania i modelowania

OpenGL oblicza według następującego wzoru pozycję punktu w przestrzeni:

[WYJŚCIOWA POZYCJA PUNKTU] = [MACIERZ RZUTOWANIA] *

[MACIERZ MODELOWANIA] * [WEJSCIOWA POZYCJA PUNKTU]

Dodatkowo   w   skład   macierzy   modelowania   wchodzą   dwie   osobne   macierze   (traktowane   jako 

całość). Pierwszą z nich jest macierz przekształceń (związana z translacją, rotacją i skalowaniem), 

drugą zaś macierz kamery.

 1.2.4.1 Macierz rzutowania (projekcji)

Jak   sama   nazwa   wskazuje   związana   jest   z   rzutowaniem.   Aby   umożliwić   rzutowanie 

perspektywiczne lub ortogonalne należy przełączyć się na macierz rzutowania. Do tego celu służy 

odpowiednia funkcja.

void glMatrixMode(GL_PROJECTION)

Zawsze   po   załadowaniu   macierzy   rzutowania   należy   w   OpenGL   wywołać   funkcje 

5/7

background image

odpowiedzialną   za   załadowanie   tzw.   macierzy   tożsamości   glLoadIdentity   (jest   to   funkcja 

bezparametrowa). Dopiero po tym możemy ustawić rzutowanie perspektywiczne lub  ortogonalne 

za pomocą odpowiedniej funkcji gluPerspective, glOrtho.

 1.2.4.2 Macierz modelowania (widoku modelu)

W identyczny sposób przełączamy się na macierz modelowania (widoku modelu), należy 

pamiętać o tym, że macierz modelowania zawiera w sobie dwie macierze (przekształceń i kamery). 

OpenGL zajmuje się nimi jako jedną całością.

void glMatrixMode(GL_MODELVIEW)

 1.2.4.3 Funkcja okna widoku 

Dzięki tej funkcji możliwe jest ustalenie konkretnego okna widoku, czyli obszaru gdzie 

będzie odbywać się renderowanie (rysowanie). Do tego celu służy funkcja.

void glViewport(GLint x, GLint y, GLsizei width, GLsizei height)

Przyjmuje ona cztery parametry, dwa pierwsza określają współrzędne lewego dolnego narożnika, 

kolejne dwa wysokość i szerokość obszaru renderowania. Zazwyczaj definiuje się obszar na całe 

okno, wiec jako pierwsze dwa parametry podaje się (0,0), natomiast kolejne dwa ustawie się na 

szerokości i wysokość okna.

 1.3  Obsługa klawiszy specjalnych

W bibliotece OpenGL obsługa klawiszy została podzielona na dwie części:

obsługę klawiszy zwykłych (znaki ASCII), omówioną w poprzedniej instrukcji

obsługę klawiszy specjalnych (strzałki, F1-F12 itp.)

Obsługa   klawiszy   specjalnych   realizowana   jest   w sposób   analogiczny   do obsługi   zwykłych 

klawiszy – należy zadeklarować funkcję o ustalonych parametrach, a następnie powiadomić o niej 

bibliotekę GLUT.

Szablon funkcji wygląda następująco (warto zwrócić uwagę na parametr key, który jest typu int; dla 

zwykłych klawiszy używany jest unsigned char):

void

 keyboardSpecialKeys(

int

 key, 

int

 x, 

int

 y) {

switch

(key) {

case

 GLUT_KEY_UP : 

puts(

"Naciśnięto strzałkę do góry"

)

break

;

}

6/7

background image

}

Następnie należy powiadomić bibliotekę, która z funkcji będzie odpowiadała za obsługę klawiszy 

specjalnych:

glutSpecialFunc(keyboardSpecialKeys);

Oto najczęściej używane klawisze specjalne:

GLUT_KEY_F1, GLUT_KEY_F2, ..., GLUT_KEY_F12  – klawisze funkcyjne (F1 

do F12) 

GLUT_KEY_PAGE_UP, GLUT_KEY_PAGE_DOWN – klawisze Page Up i Page Down

GLUT_KEY_HOME, GLUT_KEY_END – klawisze Home i End 

GLUT_KEY_LEFT, GLUT_KEY_RIGHT, GLUT_KEY_UP, GLUT_KEY_DOWN – 

klawisze strzałek

GLUT_KEY_INSERT - klawisz Insert

 2  Zadania

1. Wypróbuj   działanie   funkcji   glViewport(),   sprawdź   jej   działanie   podczas   zmieniania 

rozmiaru okna.

2. Napisz program, który będzie wyświetlał dowolną bryłę (może to być obiekt dostarczany 

przez GLUT'a, np. teapot). Program powinien posiadać następujące funkcje:

możliwość   przełączania   się   pomiędzy   typami   rzutowania   (np.   klawisz   p   - 

perspektywiczny, o – ortogonalny)

dla   perspektywy   dodaj   zmianę   kąta   widzenia   (np.   kilka   przykładowych   wartości 

ustawianych za pomocą klawiszy cyfr)

dodaj   obsługę   kamery   (gluLookAt()),   kamera   powinna   być   przesuwana   za pomocą 

strzałek (po dowolnie wybranych dwóch osiach)

7/7


Document Outline