Cel ćwiczenia : Napisanie aplikacji wyświetlającej proste obiekty przestrzenne wykorzystując bibliotekę graficzną OpenGL.
Rys. 1. Widok formularza wraz z komponentami
1. Uruchomić Delphi.
2. Utworzyć nowy Unit i cały program zapisać w dowolnym katalogu. Nazwę Unit2 podczas zapisu programu zamienić na Figury.
3. Umieścić na formularzu Panel i ustawić następujące parametry:
· Width : 400
· Height : 400
4. Obok komponentu Panel1 umieścić komponent GroupBox. Własność Caption ustawić na: Kąty obrotu wokół osi. Na GroupBox1 umieścić 3 obiekty TrackBar i ustawić następujące własności zgodnie z tabelą.
Domyślma nazwa:
Name:
Min:
Max:
Position:
TrackBar1
TBosX
-90
90
0
TrackBar2
TBosY
TrackBar3
TBosZ
5. Umieścić komponent Button i ustawić własność Caption na Rysuj.
6. Klawiszem F12 przejść do kodu źródłowego programu.
7. Część uses modułu Unit1 dopisać dwie nazwy : Figury, OpenGL. W module Figury znajdować się będą procedury definiujące bryły.
8. W części Implementation modułu Unit1 umieścić następujące procedury:
procedure setupPixelFormat(DC:HDC);
const
pfd:TPIXELFORMATDESCRIPTOR = (
nSize:sizeof(TPIXELFORMATDESCRIPTOR);
nVersion:1;
dwFlags:PFD_SUPPORT_OPENGL or PFD_DRAW_TO_WINDOW or
PFD_DOUBLEBUFFER;
iPixelType:PFD_TYPE_RGBA;
cColorBits:24;
cRedBits:0; cRedShift:0;
cGreenBits:0; cGreenShift:0;
cBlueBits:0; cBlueShift:0;
cAlphaBits:0; cAlphaShift:0;
cAccumBits: 0;
cAccumRedBits: 0;
cAccumGreenBits: 0;
cAccumBlueBits: 0;
cAccumAlphaBits: 0;
cDepthBits:16;
cStencilBits:0;
cAuxBuffers:0;
iLayerType:PFD_MAIN_PLANE;
bReserved: 0;
dwLayerMask: 0;
dwVisibleMask: 0;
dwDamageMask: 0;
);
var pixelFormat:integer;
begin
pixelFormat := ChoosePixelFormat(DC, @pfd);
if (pixelFormat = 0) then begin
exit;
end;
if (SetPixelFormat(DC, pixelFormat, @pfd) <> TRUE) then begin
procedure GLInit;
glViewport(0,0,400,400);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
glOrtho(-200,200,-200,200,-200,200);
glMatrixMode(GL_MODELVIEW);
Procedura setupPixelFormat odpowiedzialna jest za wybór formatu piksela, natomiast GLInit określa parametry projekcji.
9. Dla komponentu Form1 utworzyć zdarzenie OnCreate i zmodyfikować według wskazówki:
procedure TForm1.FormCreate(Sender: TObject);
var DC:HDC;
RC:HGLRC;
DC:=GetDC(Panel1.Handle);
SetupPixelFormat(DC);
RC:=wglCreateContext(DC);
wglMakeCurrent(DC, RC);
GLInit;
10. W części private klasy Tform1 umieścić nagłówek funkcji Draw.
procedure Draw;
11. W części implementation napisać definicje funkcji Draw:
procedure TForm1.Draw;
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
//kolor tła
glClearColor(1.0,1.0,1.0,0.0);
//funkcje obrotu
glRotate(TBosX.Position,1,0,0);
glRotate(TBosY.Position,0,1,0);
glRotate(TBosZ.Position,0,0,1);
//kolor figur
glColor3f(1.0,0.0,0.0);
//funkcja rysujaca czworoscian - moduł Figury
Czworoscian(300);
glFlush;
SwapBuffers(wglGetCurrentDC);
Procedura Draw odpowiedzialna jest za rysowanie obiektów na scenie OpenGL.
Musi być wywoływana za każdym razem, gdy konieczne jest odświeżanie sceny.
Wywołanie procedury Draw można umieścić np. w zdarzeniu OnTimer komponentu Timer, w zdarzeniu OnClick komponentu Button itp.
Procedura Czworoscian kreśli bryłę na ekranie komputera. Jej definicję należy umieścić w module Figury – utworzonym na początku instrukcji.
12. Unit Figury wraz z definicją procedury Czworościan:
unit Figury;
interface
procedure Czworoscian(a:integer);
implementation
uses OpenGL;
var
h1,h2 : double;
h1:=a*sqrt(3)/2; h2:=sqrt(2/3)*a;
glBegin(GL_LINES);
glVertex3f(2*h1/3,0,-h2/3);
glVertex3f(-h1/3,a/2,-h2/3);
glVertex3f(-h1/3,-a/2,-h2/3);
glVertex3f(0,0,2*h2/3);
glEnd;
end.
W części Interface znajduje się nagłówek funkcji Czworoscian, natomiast w części Implementation definicja i sekcja uses – konieczna, gdyż w naszej procedurze znajdują się wywołania metod biblioteki OpenGL.
13. Wywołanie funkcji Draw umieścić w zdarzeniu OnClick dla Button1 i w zdarzeniach OnChange dla TBosX, TBosY, TBosZ.
14. Skompilować i uruchomić aplikację przyciskiem F9.
Rys. 1. Widok aplikacji po skompilowaniu i uruchomieniu
ZADANIE
§ Napisać program wyświetlający wykres funkcji 2 zmiennych za pomocą prymitywu GL_LINE_STRIP
DODATEK
1. Wykaz użytych funkcji i procedur systemu OpenGL.
glViewport(x:Integer; y:Integer; width:Integer; height:Integer) – definiuje widok we współrzędnych klienta (okna ekranowego). Utworzony przez nią widok jest „oknem”, przez które obserwator widzi scenę 3D. Wartości x i y definiują położenie lewego dolnego wierzchołka okna widoku, zaś wartości width i height – szerokość i wysokość okna.
glOrtho(left:Double; right:Double; bottom:Double; top:Double; zNear:Double; zFar:Double) – nakazuje użycie rzutowania równoległego i ustala współrzędne tzw. bryły obcinania. Parametry left i right określają współrzędne x lewej i prawej płaszczyzny obcinania, parametry bottom i top – współrzędne y dolnej i górnej płaszczyzny, zaś zNear i zFar – współrzędne z przedniej i tylnej płaszczyzny obcinania. Wnętrze tak utworzonego prostopadłościanu jest rzutowane równolegle na płaszczyznę widoku, przy czym wartości zNear i zFar określają zakres „głębokości”.
glLoadIdentity() – resetowanie układu współrzędnych.
glRotate(angle:Double; x:Double; y:Double; z:Double) – funkcja realizująca obrót. Parametry to kąt obrotu oraz współrzędne wektora osi.
glClearColor(red:Double; green:Double; blue:Double, alpha:Double) – realizuje ikreślenie koloru tła sceny. Trzy pierwsze parametry określają trzy składowe koloru: czerwoną, niebieską i zieloną. Wolno używać wartości z zakresu od 0..1;
glColor3f(red:Double; green:Double; blue:Double) – określa kolor rysowanych obiektów. Zakres wartości parametrów podobnie jak w przypadku GlClearColor;
2. Zasady tworzenia obiektów graficznych w OpenGL:
Definiowanie obiektów pierwotnych w OpenGL odbywa się poprzez określenie punktów, opisanych najczęściej trzema współrzędnymi (x, y, z) w przestrzeni trójwymiarowej. Zdefiniowanie położenia punktów w przestrzeni umożliwia funkcja glVertex(), która jest dostępna w kilku wersjach, różniących się postacią listy parametrów. Dwuparametrowe wersje funkcji glVertex() służą do definiowania obiektów dwuwymiarowych, dla których zakłada się współrzędną z równą zeru. Typ obiektu pierwotnego opisywanego punktami określa się poprzez przekazanie odpowiedniego parametru w wywołaniu funkcji glBegin().
Poszczególne punkty (zdefiniowane w układzie dwu lub trójwymiarowym) definiowane są kolejnymi wywołaniami funkcji glVertex(), zlokalizowanymi pomiędzy wywołaniem funkcji glBegin() i glEnd();
Przykład prezentuje zestaw instrukcji rysujących trójkąt:
glBegin(GL_TRIANGLES);
glVertex3f(-10.0, -10.0, 0.0);
glVertex3f(0.0, 10.0, 0.0);
glVertex3f(10.0, -10.0, 0.0);
glEnd();
3. Rodzaje obiektów pierwotnych wraz z odpowiadającymi im stałymi symbolicznymi.
Stała:
Obiekt pierwotny:
GL_POINTS
ElNinio8