background image

Laboratorium nr 2 

1/6 

 

1) 

Manipulowanie przestrzenią 

 

Istnieją dwa typy układów współrzędnych: 

 

1. 

lewoskrętny układ współrzędnych, 

2. 

prawoskrętny układ współrzędnych. 

 

Różnią  się  one  między  sobą  kierunkiem  osi  „Z”  w  układzie  kartezjańskim 

trójwymiarowym.  W  bibliotece  OpenGL  obowiązuje  układ  prawoskrętny  (Direct3D 

umożliwia  korzystanie  z  obydwu  typów  układów  współrzędnych).  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. 

 

 

Układ współrzędny prawoskrętny 

 

 

 

 

Grafika Komputerowa 3D 

Temat: Manipulowanie przestrzenią 

 

Instrukcja 

laboratoryjna 

Przygotował: mgr inż. Maciej Lasota 

ekran  

monitora 

-Y 

-Z 

+Z 

-X 

+X 

+Y 

background image

Laboratorium nr 2 

2/6 

 

 

Układ współrzędny lewoskrętny 

 

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.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) 

 

ekran  

monitora 

-Y 

+Z 

-Z 

-X 

+X 

+Y 

background image

Laboratorium nr 2 

3/6 

 

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ą  poziomej  linii  obcinania.  Dwa  ostatnie  parametry  określają  granicę  przednią  i 

tylną. 

 

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ść.  

 

zN 

zF 

background image

Laboratorium nr 2 

4/6 

 

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. 

 

 

 

 

 

 

+Y 

-Y 

+X 

-X 

-Z 

+Z 

left 

right 

top 

botom 

far 

near 

background image

Laboratorium nr 2 

5/6 

 

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. 

 

4) 

Macierz rzutowania i modelowania 

 

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

 

[WYJŚCIOWY 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. 

 

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)

 

 

 

 

background image

Laboratorium nr 2 

6/6 

 

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

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

 

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)

 

 

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.