Grafika komputerowa i OpenGL


Podstawy Informatyki
Grafika komputerowa i OpenGL
mgr inż. Piotr Kaczmarek
Piotr.Kaczmarek@put.poznan.pl
Podstawy grafiki  układ
współrzędnych

Obiekt ma parametry
opisane względem środka
symetrii, wtedy
współrzędne opisane
następującymi wartościami: A(xA,yA) B(xB,yB)
xA=-b/2;
yA=-a/2;
a
xD=b/2;
(0,0)
yD=a/2;

Prostokąt może być
C(xC,yC) D(xD,yD)
opisany również za pomocą
współrzędnych 2
b
wierzchołków (A i D)
Podstawy grafiki - rotacja

Rotacja wokół środka
symetrii
xA' = cos(Ä…) * xA  sin(Ä…) * yA
yA' = sin(Ä…) * xA + cos(Ä…) * yA
zapisując współrzędne jako
Ä…
wektor o środku w środku
symetrii można napisać:
cosśą·Ä…źą sin śą·Ä…źą
xA' = xA
"
[ ]
[ ] sin śą·Ä…źą cosśą·Ä…źą [ ]
y yA
A'
)
'
B
y
,
'
B
(x
'
B
)
y
,
x
(
A
A
A
)
'
D
y
,
'
D
(x
D'
)
'
A
y
,
'
A
(x
'
0)
A
(0,
b
a
a
)
'
C
y
,
'
C
(x
C'
Podstawy grafiki - translacja

Translacja o wektor [xc yc]
xA''=xA'+xc
xA' ' = xC ƒÄ… xA'
yA''=yA'+yc
[ ]
[ ] [ ]
yC
yA' ' y
A'
Ä…
)
y
,
(x
A
A
A
)
'
A
y
,
'
A
(x
'
A
)
0)
C
y
,
,
0
(
C
x
)
(
'
'
A
y
,
'
'
A
(x
'
'
A
b
b
a
a
a
a
Macierz transformacji

Wektor 2D i 3D:
x
x
y
2D: 3D:
y
z
[ ]
1 [ ]
1

Macierz translacji
1 0 0 dx
1 0 dx
0 1 0 dy
2D:Tranśądx ,dyźą= 3D: Tranśądx , dy ,dzźą=
0 1 dy
0 0 1 dz
[ ]
0 0 1 [ ]
0 0 0 1

Macierz rotacji:
c ·Ä… -s ·Ä… 0 0
c ·Ä… -s·Ä… 0
s ·Ä… c ·Ä… 0 0
2D: Rot śą·Ä…źą= 3D: RotZ śą·Ä…źą=
s ·Ä… c ·Ä… 0
0 0 1 0
[ ]
[ ]
0 0 1
0 0 0 1
Złożenia transformacji

Kolejność transformacji ma wpływ na wynik przekształcenia
A'=Tranśądx ,dyźą"A A' =Rot śą·Ä…źą"A
A' ' =Rot śą·Ä…źą"A' A' '=Tranśądx ,dyźą"A'
A' '=Tranśądx ,dyźą"Rot śą·Ä…źą"A A' '=Rot śą·Ä…źą"Tranśądx , dyźą"A
A''
A''
A'
A
A
Kamera i rzutowanie

Obraz przedstawiany na ekranie, zdjęciu, rysunku jest płaski

Tworzy siÄ™ go poprzez rzutowanie sceny widzianej przez  kamerÄ™
na płaszczyznę

Kamera posiadajÄ…cy niezerowy kat widzenia wprowadza perspektywÄ™

Zmiana lokalizacji kamery pozwala uzyskać zmianę położenia obrazu
na ekranie (obrót, translację, kadrowanie)

Zmiana kata widzenia pozwala uzyskać efekt skalowania obiektów
(zmiana rozmiaru)
OpenGL - wprowadzenie

OpenGL jest bibliotekÄ… wykorzystywanÄ… w celu tworzenia wysokiej
jakości obrazów złożonych pewnych:

prymitywów geometrycznych (tj. punktów, linii, wielokątów)

prymitywów obrazowych (bitmap, tekstur itp.)

zródeł światła, materiałów, kolorów

OpenGl jest niezależna od sprzętu oraz systemu operacyjnego

Większość współczesnych kart graficznych umożliwia wykonanie
komend biblioteki na procesorze karty graficznej, tym samym
zmniejsza obciążenie jednostki centralnej i przyspiesza operacje
graficzne
OpenGL - API

OpenGL może być
wykorzystywany
bezpośrednio w
programie lub też za
pośrednictwem innych
bibliotek takich jak
GLUT.

Efektem jest
wygenerowanie kodu
który może być
wykonany przez
procesor karty
graficznej lub sterownik
karty emulujÄ…cy funkcje
OpenGL
OpenGL - prymitywy

Podstawowym elementem prymitywów geometrycznych jest
wierzchołek  Vertex. Prymityw określa sposób grupowania tych
wierzchołków
OpenGL  tworzenie
prymitywów

Prostokąt Okręg (przybliżony łamaną
złożoną z 36 odcinków)
void Prostokat(float a, float b)
{ void Okrag(float r)
GLfloat {
red=1.0,green=0,blue=0; glBegin(GL_LINE_LOOP);
glColor3f(red,green,blue); for(float kat=0;kat<360;kat+=10)
glBegin(GL_POLYGON); {
glVertex2f(-a/2,b/2); GLfloat x,y;
glVertex2f(a/2,b/2); x=r*cos(kat/180*3.14);
glVertex2f(a/2,-b/2); y=r*sin(kat/180*3.14);
glVertex2f(-a/2,-b/2); glVertex2f(x,y);
glEnd(); }
} glEnd();
}
OpenGL  glVertex
Typ współrzędnych oraz ilość współrzędnych definiowanego wierzchołka ma
wpływ na ilość pamięci która jest potrzebna do reprezentacji wierzchołka.
Przy scenach złożonych z wielu wierzchołków efekt jest znaczący
OpenGL  Transformacje
modelu
....
glMatrixMode(GL_MODELVIEW);//wybiera układ współrzędnych
modelu
glPushMatrix(); //zachowuje aktualna macierz transformacji
glLoadIdentity();//ustawia macierz transformacji jako jedynkowÄ…
(globalny układ współrzędnych)
glTranslatef(10.0,10.0,0);//przesuwa układ o wektor[10,10,0]
glRotatef(45,0.0,0.0,1.0); rotacja o 45o wokół wektora [0,0,1]  oś Z
Kwadrat(3,3); //tworzy kwadrat 3x3 o środku w punkcie 10,10 i kacie
obrotu 450
glPopMatrix(); //przywraca poprzednia macierz transformacji
OpenGL - Listy

OpenGL umożliwia na GLuint ListaID; //identyfikator listy
definiowanie standardowych // Przydziela nr ID
fragmentów kodu, który ListaID = glGenLists(1);
następnie może być // tworzy liste (start)
wywołany za pomocą glNewList(ListaID,GL_COMPILE);
pojedynczego polecenia. Kwadrat(5,5);

Fragment kodu dodawany jest Okrag(3);
do tzw. listy i otrzymuje // koniec listy
określony index glEndList();

Wywołanie listy (glCallList) .....
powoduje każdorazowe for(int j=-3; j < 3; j++)
wykonanie jej kodu w {
aktualnej lokalizacji glPushMatrix();
glTranslatef(j*10.0,j * 10.0,0);
glCallList(ListaID); //rysuje obiekty
glPopMatrix();
}
OpenGL  kamera widok
ortogonalny (bez perspektywy)
glMatrixMode(GL_PROJECTION);//zmienia układ współrzędnych
na układ kamery
glLoadIdentyty();//przechodzi do globalnego układu kamery
glOrtho(xmin,xmax,ymin,ymax,-znear,-zmax);
//ustawia kamerÄ™ w widoku bez perspektywy
oraz prostopadłościan tnący.
OÅ› optyczna kamery jest taka
jak oś OZ układu współrzędnych
kamery;
OpenGL  kamera widok z
perspektywÄ… (1)
glMatrixMode(GL_PROJECTION);//zmienia układ współrzędnych
na układ kamery
glLoadIdentyty();//przechodzi do globalnego układu kamery
glPerspective(fov, aspect,z_min,zmax); //ustawia określony kat
widzenia kamery i jej aspekt (stosunek szerokości do wysokości
ekranu, oraz płaszczyznę tnącą ostrosłupa obrazu;
OÅ› optyczna kamery jest taka jak oÅ› OZ
układu współrzędnych kamery;
glViewport(x0,y0,w,h);
//określa położenie lewego
narożnika oraz szerokość rzutni
OpenGL  kamera widok z
perspektywÄ… (2)
glMatrixMode(GL_PROJECTION);//zmienia układ współrzędnych
na układ kamery
glLoadIdentyty();//przechodzi do globalnego układu kamery
glPerspective(kat_widzenia, aspekt,z_min,zmax);
glViewport(x,y,w,h);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glLookAt(eyex,eyey,eyez,
atx,aty,atz,
upx,upy,upz);
//ustawia położenie i orientację
kamery
OpenGL FrameBuffer i animacje

Prymitywy definiowane w
programie istniejÄ… w 3D
przestrzeni modelu,

Obraz widziany przez kamerÄ™ (2D)
renderowany jest dopiero po
wymuszeniu tego procesu

Zrenderowany obraz
przechowywany jest we
FrameBuffer (FB)

System może mieć zdefiniowane
jeden albo 2 FB

Gdy wykorzystywane sÄ… 2 FB,
obraz renderowany jest najpierw w
niewyświetlanym FB, a następnie
FB są przełączane (swap) 
zwiększa to płynność animacji
GLUT - Instalacja


plik glut.dll
Jest nakładka na OpenGL

skopiować do c:\Windows\System32
Pozwala na obsługę
c:\Windows\
klawiatury, myszy i innych
zdarzeń systemowych

plik glut.lib

Pozwala na prostÄ… inicjacjÄ™
skopiować do:
OpenGL
C:\Program Files\Microsoft Visual Studio

Pozwala na tworzenie menu
8\VC\PlatformSDK\lib

Posiada funkcje tworzÄ…ce

bryły oraz znaki
plik glut.h

opis dołączenia biblioteki z C:\Program Files\Microsoft Visual Studio
8 \VC \ PlatformSDK \ include
tutorialem:Tutorial - Glut

Ponadto do każdego projektu należy:

dołączyć bibliotekę
(proj.properties->linker->input):
opengl32.lib glut32.lib glu32.lib

oraz plik nagłówkowy glut.h
GLUT - Inicjacja
void main(int argc, char **argv) {
glutInit(&argc, argv);
//inicjuje OpenGl w trybie podwójnego FrameBuffera
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
//Tworzy okno 320x320
glutInitWindowPosition(100,100);
glutInitWindowSize(320,320);
glutCreateWindow("Przykladowy program");
//Rejestruje funkcje zdarzeń
glutDisplayFunc(Przerysuj);
glutReshapeFunc(ZmienRozmiarEkranu);
glutKeyboardFunc(Klawisz);
glutMainLoop();
}
GLUT  Obsługa zdarzeń

W celu obsługi zdarzeń
Mysz Klawiatura
pochodzących z wielu zródeł
funkcja MainLoop odbiera
komunikaty systemowe i
wywołuje funkcje napisane przez
SYSTEM OPERACYJNY
użytkownika

System generuje komunikaty o:

zdarzeniach zwiÄ…zanych z
komunikat
klawiaturą (wciśnięciu
klawisza)
Program

zdarzeniach zwiÄ…zanych z
myszy (ruchu myszki,
Mysz()
wciśnięciu/zwolnieniem
przycisku Klawisz()

zmianÄ… rozmiaru okna
MainLoop
Przerysuj()

przesłonięciem,
koniecznością przerysowania
Obsługa zmiany rozmiaru
ekranu

Rejestracja
glutReshapeFunc(ZmienRozmiarEkranu);

Funkcja obsługi zdarzenia
void ZmienRozmiarEkranu(int w,int h)
{
float ratio = 1.0* w / h;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0, 0, w, h);//ustalenie rzutni
gluPerspective(45,ratio,1,1000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0,0.0,5.0, 0.0,0.0,-1.0, 0.0f,1.0f,0.0f);
}
Przerysowywanie ekranu

Rejestracja:
glutDisplayFunc(Przerysuj);

Funkcja obsługi zdarzenia:
void Przerysuj(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glColor3f(red,green,blue);
glBegin(GL_TRIANGLES);
glVertex3f(-0.5,-0.5,0.0);
glVertex3f(0.5,0.0,0.0);
glVertex3f(0.0,0.5,0.0);
glEnd();
glPopMatrix();
glutSwapBuffers();//wyświetlenie dla trybu z podwójnym
buforowaniem dla trybu bez podwójnego FB używa się glFlush();
}
Obsługa klawiatury

Rejestracja
glutKeyboardFunc(Klawisz);

Funkcja obsługi zdarzenia (wywoływana ilekroć użytkownik
wciśnie przycisk)
void Klawisz(unsigned char key, int x, int y)
{
switch(key)
{
case 27: //wcisnieto escape
exit(0);
case 'a': //zrob cos wcisnieto 'a'
break;
}
}
Obsługa myszki

Rejestracja
glutMouseFunc(Mysz); //obsługa wciśnięcia klawisza myszy
glutMotionFunc(processMouseActiveMotion);
//ruch myszy z wciśniętym przyciskiem
glutPassiveMotionFunc(processMousePassiveMotion); //ruch
myszy bez wciśniętych przycisków
glutEntryFunc(processMouseEntry); //funkcja wywoływana gdy
kursor wchodzi opuszcza obszar okna
Obsługa myszki

Funkcja obsługi wciśniętego przycisku
void Mysz(int button, int state, int x, int y)
{
specialKey = glutGetModifiers();
if (button == GLUT_LEFT_BUTTON)
{
....
}
else if (button == GLUT_MIDDLE_BUTTON)
{
....
}
}


Wyszukiwarka

Podobne podstrony:
Grafika komputerowa na stronach internetowych
Grafika komputerowa 2
Polska Grafika Komputerowa
Praca kontrolna z Informatyki semestr I Grafika komputarowa przedstaw jeden z program, krótko go op
Grafika Komputerowa
ABC grafiki komputerowej i obrobki zdjec
Grafika komputerowa 1
Grafika komputerowa 3
15 barwy grafika komputerowa
LebiedAo Jacek Grafika Komputerowa (2)
grafika komputerowa
Grafika komputerowa 2
Grafika komputerowa warsztat umiejętności praktycznych
grafika komputerowa(1)
14!6601 grafik komputerowy DTP
Grafika komputerowa, czyli jak zrobić coś, czego nie potrafi aparat cyfrowy

więcej podobnych podstron