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 internetowychGrafika komputerowa 2Polska Grafika KomputerowaPraca kontrolna z Informatyki semestr I Grafika komputarowa przedstaw jeden z program, krótko go opGrafika KomputerowaABC grafiki komputerowej i obrobki zdjecGrafika komputerowa 1Grafika komputerowa 315 barwy grafika komputerowaLebiedAo Jacek Grafika Komputerowa (2)grafika komputerowaGrafika komputerowa 2Grafika komputerowa warsztat umiejętności praktycznychgrafika komputerowa(1)14!6601 grafik komputerowy DTPGrafika komputerowa, czyli jak zrobić coś, czego nie potrafi aparat cyfrowywięcej podobnych podstron