grafika 3D lab9 id 194729 Nieznany

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


Wyszukiwarka

Podobne podstrony:
grafikia tresci progr id 194904 Nieznany
lab9 3 id 260337 Nieznany
lab9 2 id 260334 Nieznany
lab9 5 id 260341 Nieznany
LiTTK seminarium grafik id 2714 Nieznany
automaty 3d id 72987 Nieznany (2)
cwiczenia6 3d id 124973 Nieznany
Grafika Rastrowa id 194834 Nieznany
grafika komputerowa podstawy id Nieznany
Parametry PODOSKOP 3D id 349159 Nieznany
GrafikaEgz id 194876 Nieznany
Grafika 3 id 194607 Nieznany
Grafika komputerowa 3 id 194791 Nieznany
barcin grafika id 80035 Nieznany (2)
grafika herbisz id 194753 Nieznany
Grafika inzynierska 2 id 194765 Nieznany

więcej podobnych podstron