Grafika 3D - OpenGL
Transkrypt
Grafika 3D - OpenGL
#include <windows.h>
#include <gl/glut.h>
#include <gl/glu.h>
float kat=0.0f;
void renderujScene(void) {
glClearColor(1.0f,1.0f,1.0f,1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glRotatef(kat,0,0,1);
glBegin(GL_QUADS);
glColor3f(1.0f,0.0f,0.0f);
glVertex3f(-1.0f,-1.0f,-5.0f);
glColor3f(0.0f,0.0f,1.0f);
glVertex3f(1.0f,-1.0f,-5.0f);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(1.0f,1.0f,-5.0f);
glColor3f(1.0f,1.0f,0.0f);
glVertex3f(-1.0f,1.0f,-5.0f);
glEnd();
glPopMatrix();
kat+=0.2f;
glutSwapBuffers();
}
Grafika 3D
OpenGL – częśd I
Układ współrzędnych, biblioteka GLUT, pojedyncze
buforowanie, rzutowanie, prymitywy, przekształcenia
geometryczne, podwójne buforowanie, animacja.
Michał Dudkiewicz
[email protected]
Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
Biblioteka OpenGL
OpenGL – wieloplatformowa biblioteka pozwalająca na niskopoziomowy dostęp
do karty graficznej (akceleratora graficznego) i maksymalne wykorzystanie jej
potencjału.
www.opengl.org
Biblioteka wywodzi się od IRIS GL – specjalnej biblioteki przeznaczonej dla
profesjonalnych stacji graficznych firmy Silicon Graphics.
1992-2006 – organizacja ARB (Architectural Review Board) zrzeszająca 10 firm
(3DLabs, Apple, ATI, Dell, Evans & Sutherland, Hewlett-Packard, IBM, Intel,
Matrox, NVIDIA, SGI, Sun Microsystems)
31 lipca 2006 – wcielenie do Kronos Group
2
Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
OpenGL API
OpenGL API (Application Programming Interface - interfejs programowania
aplikacji) podzielone jest na trzy osobne biblioteki:
1.
właściwa biblioteka OpenGL obejmuje funkcje zatwierdzone przez OpenGL
Architecture Review Board. Nazwy funkcji pochodzących z tej biblioteki
rozpoczynają się przedrostkiem gl.
2.
biblioteka pomocnicza GLU (Utility Library) została stworzona przy użyciu
funkcji OpenGL. Zawiera funkcje ułatwiające rysowanie kul, cylindrów i
obiektów NURBS. Nazwy funkcji w tej bibliotece są poprzedzone
przedrostkiem glu.
3.
AUX (Auxiliary) zawiera zestaw narzędzi do realizacji zadao zależnych do
systemu operacyjnego (np. tworzenie okien). Obecnie zamiast biblioteki AUX
zalecane jest stosowanie interfejsu GLUT.
3
Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
OpenGL – układ współrzędnych
Prawoskrętny
układ współrzędnych
4
V Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
OpenGL – nazewnictwo funkcji
glColor3f(...)
Biblioteka
(OpenGL)
Nazwa
funkcji
Liczba
argumentów
Typ
argumentów
5
Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
GLFW, GLEW
GLFW (An OpenGL Framework) – wieloplatformowa biblioteka wspomagająca
tworzenie aplikacji OpenGL (okna, mysz, klawiatura, wątki), aktualna wersja 2.6
http://glfw.sourceforge.net/
GLEW – wieloplatformowa biblioteka wspomagająca używanie rozszerzeo
dostępnych na specyficznych platformach sprzętowych (różnych akceleratorach
graficznych) przez aplikacje OpenGL, aktualna wersja 1.5.0
http://glew.sourceforge.net/
6
Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
GLUT
GLUT (OpenGL Utility Toolkit) jest biblioteką użytkową, która wykonuje głównie
operacje wejścia/wyjścia na poziomie systemu operacyjnego.
http://www.opengl.org/resources/libraries/glut/
Głównymi dwoma celami, dla których powstała biblioteka GLUT są:
1.
2.
umożliwienie pisania prostego, przenośnego kodu na wiele platform (GLUT
jest niezależny od platformy)
ułatwienie procesu uczenia się OpenGL-a.
Funkcje biblioteki GLUT zaczynają się od prefiksu glut.
7
Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
GLUT
Uwaga !
Istnieje wiele bibliotek okienkowych przystosowanych do łatwej obsługi OpenGL,
jednak w fazie początkowej nauki programowania w OpenGL powinno sie używad
biblioteki maksymalnie prostej.
Punkt ciężkości musi byd skierowany na naukę programowania grafiki, a nie na
uczenie się skomplikowanych bibliotek okienkowych !
GLUT wymaga niewielu linii kodu źródłowego aby uruchomid prosty program z
wykorzystaniem biblioteki OpenGL
8
Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
OpenGL i GLUT – środowisko pracy
Kompilator języka C/C++
Dev-C++ 5.0 beta 9.2 (4.9.9.2)
http://www.bloodshed.net/dev/devcpp.html
Pakiet GLUT dla Dev-C++
http://devpaks.org/
9
Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
GLUT – callback
Callback (wywołanie zwrotne) jest to technika programowania będąca
odwrotnością wywołania funkcji.
Zwykle korzystanie z właściwości konkretnej biblioteki polega na wywołaniu
funkcji (podprogramów) dostarczanych przez tę bibliotekę.
W tym przypadku jest odwrotnie: użytkownik jedynie rejestruje funkcję do
późniejszego wywołania, natomiast funkcje biblioteki wywołają ją w stosownym
dla siebie czasie.
GLUT korzysta z mechanizmów callback m.in. do obsługi klawiatury, myszy,
renderowania.
10
Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
GLUT – minimalny program
#include <gl/glut.h>
void RenderScene(void) {
glClearColor(0.0f,0.0f,1.0f,1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
}
void main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowSize(800,600);
glutInitWindowPosition(10,10);
glutCreateWindow("OpenGL");
glutDisplayFunc(RenderScene);
glutMainLoop();
}
11
Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
GLUT – fullscreen i gamemode
Fullscreen – tryb pełnoekranowy
glutFullScreen();
Powrót z trybu pełnoekranowego do okna
glutReshapeWindow(800,600);
Gamemode – tryb pełnoekranowy inaczej
glutGameModeString("800x600:32");
if (glutGameModeGet(GLUT_GAME_MODE_POSSIBLE))
glutEnterGameMode();
else exit(1);
Powrót z trybu gamemode
glutLeaveGameMode();
12
Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
OpenGL – rzutowanie
promienie rzutujące
rzutnia
Rzutowanie perspektywiczne
Rzutowanie równoległe
13
Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
OpenGL – rzutowanie perspektywiczne
gluPerspective(kat,ratio,zNear,zFar);
glFrustum(l,p,d,g,zNear,zFar);
kat – kąt widzenia w pionie (zalecana wartośd 60°)
ratio – stosunek szerokości do wysokości okna
zNear, zFar – płaszczyzny obcinania (przednia i tylna)
l,p,d,g – położenie krawędzi przedniej płaszczyzny obcinania
tylna płaszczyzna obcinania (zFar)
ostrosłup widzenia
przednia płaszczyzna obcinania (zNear)
14
Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
OpenGL – rzutowanie ortogonalne
glOrtho(l,p,d,g,zNear,zFar);
zNear, zFar – płaszczyzny obcinania (przednia i tylna)
l,p,d,g – położenie krawędzi przedniej płaszczyzny obcinania
Funkcja wyznacza prostopadłościan widzenia.
Rzutowanie ortogonalne zachowuje kształt i rozmiar (wykorzystywane jest często
w rysunku technicznym i programach typu CAD)
Rzutowanie perspektywiczne odzwierciedla sposób widzenia człowieka (dlatego
jest najczęstszym rzutowaniem wykorzystywanym w grafice 3D).Wielkośd rzutu
zmniejsza się przy wzroście odległości między środkiem rzutowania a obiektem.
Zniekształcane są kształty i wymiary obiektów.
15
Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
OpenGL – kamera
gluLookAt(poz_x,
poz_y,
poz_z,
look_x,
look_y,
look_z,
ux,
uy,
uz);
Wektor pionu
<ux,uy,uz>
poz_x,poz_y,poz_z – wyznaczają położenie kamery w przestrzeni
look_x,look_y,look_z – wyznaczają punkt na który „patrzy” kamera
ux,uy,uz – wyznaczają wektor pionu kamery (najczęściej <0,1,0>)
16
Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
GLUT – rzutowanie i ustawienie kamery
void widok(int s,int w) {
glViewPort(0,0,s,w);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0f,(float)s/(float)w,1.0f,1000.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0f, 0.0f, 10.0f,
0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f);
}
...
glutReshapeFunc(widok);
17
Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
OpenGL - prymitywy
Prymityw - ogólne określenie najprostszych elementów grafiki 3D.
Takimi elementami są m.in.: punkt, linia, trójkąt, czworokąt.
W OpenGL dostępne są następujące prymitywy:
•
•
•
•
•
•
•
punkt (GL_POINTS)
linia (GL_LINES)
łamana (GL_LINE_STRIP)
łamana zamknięta (GL_LINE_LOOP)
wielokąt (GL_POLYGON)
trójkąt, paski trójkątów, wachlarz trójkątów
czworokąt, paski czworokątów
18
Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
OpenGL – renderowanie prymitywów
Renderowanie prymitywów rozpoczyna się wywołaniem glBegin() z odpowiednim
parametrem, następnie podaje się odpowiednio listę wierzchołków i kooczy
wywołaniem glEnd();
Przykład:
glBegin(GL_LINES);
glVertex3f(-3.0f, 0.0f, 0.0f);
glVertex3f( 3.0f, 0.0f, 0.0f);
glEnd();
19
Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
OpenGL – paski trójkątów GL_TRIANGLE_STRIP
Paski trójkątów są używane gdy przy tworzeniu obiektu z siatki trójkątów niektóre
wierzchołki są wspólne dla niektórych trójkątów. Paski pozwalają zaoszczędzid
liczbę wywołao funkcji glVertex3f.
w5
w2
w4
w1
w2
w3
w3
w5
w1
w4
20
Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
OpenGL – wachlarze trójkątów GL_TRIANGLE_FAN
Wachlarze trójkątów są podobne do pasków trójkątów. Tworzy się jeden
wierzchołek, a następnie wyznacza współrzędne trójkątów, które będą go otaczad.
Za pomocą wachlarzy można bardzo wygodnie tworzyd koła i okręgi.
w2
w3
w4
w1
w7
w5
w6
21
Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
OpenGL – paski czworokątów GL_QUAD_STRIP
Paski czworokątów podobnie jak paski trójkątów pozwalają zaoszczędzid
na wywołaniach funkcji glVertex3f. Kolejne czworokąty powstają z dwóch
poprzednich wierzchołków oraz dwóch nowych wierzchołków.
w2
w4
w1
w6
w3
w5
22
Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
OpenGL – przekształcenia geometryczne
Translacja (przesunięcie o wektor)
glTranslatef(x,y,z);
gdzie x,y,z to wektor przesunięcia
Obrót o zadany kąt
glRotatef(kat,x,y,z);
gdzie x,y,z to wektor wyznaczający oś obrotu, kat to kąt obrotu
Skalowanie
glScalef(αx,βy,γz);
gdzie αx,βy,γz to współczynniki skalowania w osiach OX, OY, OZ
23
Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
GLUT - animacja
Animacja przy pomocy biblioteki GLUT jest bardzo prosta do zrealizowania.
1. Należy utworzyd okno w trybie podwójnego buforowania
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
2. Za pomocą odkładania macierzy na stos w funkcji odpowiedzialnej za
renderowanie zdefiniowad przekształcenia geometryczne (animację):
glPushMatrix();
glRotatef(kat,0,1,0);
//nasz obiekt/obiekty
glPopMatrix();
glutSwapBuffers();
kat+=0.2f;
3.
Wykorzystując funkcję glutIdleFunc() i mechanizm callback należy
zarejestrowad funkcję renderującą (spowoduje to nieskooczone
wywoływanie funkcji renderującej)
24
Laboratorium Grafiki i Multimediów