Wprowadzenie do programowania
w OpenGL
Wykład 4
GKS (
Graphical Kernel System
)
GKS-3D
PHIGS (
Programmer’s Hierarhical Interactive Graphics System
)
PHIGS+
CGM (
Computer Graphics Metafile
)
CGI (
Computer Graphics Interface
)
Standardy przemysłowe
XWindow (
MIT
)
IRIS Performer (
Silicon Graphics
)
OpenGL (
Silicon Graphics
)
PostScript (
Adobe
)
konsorcjum OpenGL Architecture Review Board (
Silicon
Graphics, IBM, Intel, HP, Microsoft, Intergraph
)
biblioteka kilkuset procedur i funkcji graficznych opracowana dla
potrzeb najnowszych tendencji w technologii sprzętu grafiki
komputerowej. Wykorzystywany model klient – serwer, w którym
klient (program) wysyła polecenia a serwer (GL) wykonuje
polecenia
OpenGL jest niezależny od systemu operacyjnego (UNIX, Linux,
Win95/98/NT, Mac OS, OS/2) i dostępny na wielu platformach
sprzętowych
OpenGL stanowi podstawę do tworzenia zaawansowanych bibliotek
graficznych (np.
SGI OpenGL Performer, MultiGen-Paradigm Vega
prymitywów graficznych w pełnym zestawie barw (24 bity)
wykonywanie
na obiektach przekształceń geometrycznych
(translacje, rotacje, skalowanie, rzutowanie)
wykonywanie
obliczeń
związanych
z
oświetleniem,
odwzorowaniem tekstur i usuwaniem niewidocznych linii i
powierzchni
wspomaganie programisty w zakresie realizacji złożonych efektów
graficznych, takich jak: wizualizacja mgły i głębi przestrzennej,
rozmycie obiektów w ruchu, oraz usuwanie efektu aliasingu
opisywania
złożonych
obiektów
za
pomocą
gotowych
mechanizmów
(np.
brak
wbudowanych
mechanizmów
zapisywania/czytania modeli obiektów z pliku)
generowania w sposób automatyczny efektów wizualnych takich
jak: cienie, odbicia lustrzane obiektów
krzywe
i
powierzchnie
nieregularne
definiowane
przez
niejednorodne parametryczne funkcje B-sklejane (NURBS)
pełen zestaw barw (24 bity)
cieniowanie metodą Gourauda
operacje HLHSR realizowane z wykorzystaniem Z-bufora
modelowanie oświetlenia (do 8 różnych źródeł światła)
operacje na pixelach
funkcje sterujące buforowaniem ekranu
antyaliasing - poprawa jakości obrazu
funkcje sterujące nakładaniem (mapowaniem) tekstury
modelowanie efektów atmosferycznych (mgła, zachmurzenie, pora
X, Win32, MAC OS – warstwa graficzna systemu operacyjnego;
GLUT
GLU
OpenGL
GLX, AGL
or WGL
X, Win32, Mac O/S
Sprzęt
Program
OpenGL Motif
Lista
poleceń
Operacje na
wierzchołkach
Rasteryzacja
Bufor
ramki
Pamięć
tekstury
Operacje na
pikselach
Operacje na
mapach bitowych
Moduł
wyliczeniowy
CPU
Void Kwadrat()
{
glColor3f(0.0,0.0,1.0);
glBegin(GL_QUADS);
glVertex3f(0.0, 0.0, 0.0);
glVertex3f(0.0, 1,0, 0.0);
glVertex3f(1.0, 1.0, 0.0);
glVertex3f(1.0, 0.0, 0.0);
glEnd();
}
Płaszczyzna XY
Obiekt: kwadrat o boku 1 leżący na płaszczyźnie XY
Void Koło()
{
glColor3f(0.0,1.0,0.0);
glBegin(GL_TRIANGLE_FUN);
glVertex3f(0.0, 0.0, 0.0);
for (i=0; i*dAlfa<=360.0; i++);
{
glVertex3f(r*cos(DEG2RAD(i*dAlfa)),
0.0,r*sin(DEG2RAD(i*dAlfa)));
- dAlfa – wartość kąta wyznaczającego kolejny punkt na okręgu
dAlfa=360/N; gdzie: N-liczba podziałów koła
Płaszczyzna XZ
v
1
v
2
v
3
v
4
v
5
v
6
v
8
v
7
v
0
Void powierzchnia_boczna_walca()
{
glColor3f(1.0,1.0,0.0);
glBegin(GL_QUAD_STRIP);
for (i=0; i*dAlfa<=360.0; i++);
{
glVertex3f(r*cos(DEG2RAD(i*dAlfa)),
0.0,r*sin(DEG2RAD(i*dAlfa)));
glVertex3f(r*cos(DEG2RAD(i*dAlfa)),
podstawy w punkcie (0,0,0) leżącej na płaszczyźnie XZ
- dAlfa – wartość kąta wyznaczającego kolejny punkt na brzegu podstawy
dAlfa=360/N; gdzie: N-liczba podziałów pionowych walca
Z
X
Y
V
i+1
V
i+3
V
i+2
V
i
r
h
układzie współrzędnych kartezjańskich
x
x
y
y
z+
z+
układ
lewoskrętny
układ
prawoskrętny
Kąty dodatnie – CCW
Kąty dodatnie – CW
macierzowe w postaci:
v’
= M
v
gdzie:
v, v’
– wektory kolumnowe [4x1] opisujące jednorodne
współrzędne punktu odpowiednio przed i po przekształceniu
M – macierz [4x4] opisująca wykonywane przekształcenie
Z
ależności zachodzące między klasycznymi współrzędnymi
kartezjańskimi (
x
k
,y
k
,z
k
), a współrzędnymi jednorodnymi (
x
j
,y
j
,z
j
,w
j
):
=
k
k
j
j
y
x
y
x
=
j
j
k
w
y
w
x
y
x
/
/
translacja
skalowanie
obrót wokół zadanej osi
glTranslate*(x, y, z)
glScale*(x, y, z)
Składanie przekształceń realizowane jest poprzez mnożenie macierzy:
C’ = CM
gdzie:
C
– aktualna macierz przekształceń
M
– macierz opisująca dodawane przekształcenie
C’
– macierz przekształceń po dodaniu przekształcenia M
Obraz wierzchołka
v
po przekształceniach
CM
:
v’ = C’v
v’ =
R
T
v
Najpierw translacja potem obrót
Najpierw obrót potem translacja
v’ =
T
R
v
Współrzędne
w układzie
obiektu
Macierz
modelowania
M
Macierz
modelowania
M
Macierz
rzutowania
P
Macierz
rzutowania
P
Normalizacja
do
współrzędnych
urządzenia
Normalizacja
do
współrzędnych
urządzenia
Przekształcenie
do
współrzędnych
ekranowych
Przekształcenie
do
współrzędnych
ekranowych
o
o
y
x
Współrzędne
w układzie
obserwatora
Współrzędne
odcięte
Znormalizowane
współrzędne
urządzenia
Współrzędne
ekranowe
s
s
y
x
=
o
o
e
e
y
x
M
y
x
=
e
e
c
c
z
y
x
P
z
y
x
=
c
c
c
c
d
d
w
y
w
x
y
x
/
/
Macierz
modelowania
M
n
Macierz
modelowania
M
n
Macierz
rzutowania
P
m
Macierz
rzutowania
P
m
Normalizacja
(dzielenie
perspektywiczne)
Normalizacja
(dzielenie
perspektywiczne)
Przekształcenie
do
współrzędnych
ekranowych
Przekształcenie
do
współrzędnych
ekranowych
Macierz
modelowania
M
n-1
Macierz
modelowania
M
n-1
Macierz
rzutowania
P
m-1
Macierz
rzutowania
P
m-1
Stos macierzy
Stos macierzy
Macierze aktywne
glPushMatrix() – skopiowanie aktywnej macierzy i odłożenie jej na stosie,
glPopMatrix() – zdjęcie aktywnej macierzy ze stosu,
glLoadIdentity() – odłożenie na stosie macierzy jednostkowej,
glMultMatrix(T m[16]) – przemnożenie aktywnej macierzy przez macierz m,
glLoadMatrix(T m[16]) – odłożenie na stosie macierzy m,
glMatrixMode(mode) – wybór stosu, na którym będą wykonywane operacje.
Wszystkie przedstawione wcześniej funkcje wykonujące przekształcenia
modelujące i rzutujące przemnażają
aktywną macierz na wybranym stosie.
Rodzaje rzutów w OpenGL:
rzut perspektywiczny
rzut ortogonalny (równoległy)
Etapy rzutowania:
przekształcenie współrzędnych obserwatora do współrzędnych
odciętych (macierz
P
),
odcięcie (odrzucenie) prymitywów leżących poza kanoniczną bryłą
widzenia
Układ współrzędnych
obserwatora
Układ współrzędnych
odciętych
-f
-n
l
r
t
b
(
)
+
2
/
o
x
p
x
(o
xl
o
y
)
1
1
1
p
y
p
x
(o
x
, o
y
)
-1
Y
d
Z
d
Współrzędne ekranowe (pikselowe)
glViewport(int x, int y, int w, int h) – funkcja wyznaczająca prostokątny
obszar okna, na którym mapowany będzie rzutowany obraz sceny,
gdzie:
-
x,y – współrzędne ekranowe lewego dolnego rogu prostokąta;
-
w i h – szerokość i wysokość obszaru okna wyrażone w pikselach.
glDepthRange(int near, int far) – funkcja ustalająca przedział
mapowania współrzędnej z
d
. Wartości near i far odwzorowywane są na
przedział wartości dyskretnych bufora głębokości.
void
KonfigurujKanalWizualizacji(int x0,int y0,
int szerokosc,int wysokosc)
glViewport(x0, y0, szerokosc, wysokosc);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(40.0,(float)szerokosc/(float)wysokosc
1.0, 1000.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
Otworzyć stronę:
http://intranet.ita.wat.edu.pl:8080/wosat/OpenGL/Binaria/
Otworzyć w nowym oknie link:
glut-3.7.6-bin.zip
Zapisać na dysk w katalogu np.
D:\Temp\GLUT
Rozpakować w tym samym katalogu (np. WinZip). Po rozpakowaniu utworzony zostanie
folder glut-3.7.6-bin zawierający pliki:
glut32.dll
- pliki systemowe DLL
glut32.lib
- bibloteka funkcji GLUT
glut.def
glut.h
- pliki nagłówkowe *.h
Readme-win32.TXT
Skopiować:
plik glut32.dll do katalogu
C:\WINDOWS\system32
plik glut32.lib do katalogu
C:\Microsoft Visual Studio. Net 2003\Vc7\PlatformSDK\LIB\
Wybrać nowy projekt w języku Visual C++
Wybrać aplikację konsolową Win32 Console Project
Podać nazwę projektu: np. grupa_nazwisko (
I4YS0_Kowalski
)
Wybrać lokalizację: D:\Temp
W ApplicationSetting wybrać Empty Project
W prawym oknie pojawią się informacje o plikach projektu
Załadować przykładowy program:
otworzyć stronę
http://intranet.ita.wat.edu.pl:8080/wosat/OpenGL/Przyklady/
otworzyć w nowym oknie link z wybraną nazwą program np. walec.c, szescian.c, kula.c
zapisać plik w katalogu D:\Temp\
I4YS0_Kowalski
\
Przejść do środowiska Visual C++, prawym klawiszem wybrać Source i „add existing project
10. Zlokalizować przykładowy program i załadować
11. Otworzyć załadowany program (dwukrotnie kliknąć na nazwę programu w katalogu Source
12. Po otwarciu w g ównym oknie wy wietli si kod ród owy programu