Instrukcja.doc

(451 KB) Pobierz

Instrukcja (OpenGL)

     

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

-90

90

0

TrackBar3

TBosZ

-90

90

0

 

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

      exit;

   end;

end;

 

procedure GLInit;

begin

   glViewport(0,0,400,400);

   glMatrixMode(GL_PROJECTION);

   glLoadIdentity;

   glOrtho(-200,200,-200,200,-200,200);

   glMatrixMode(GL_MODELVIEW);

   glLoadIdentity;

end;

 

 

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;

begin

   DC:=GetDC(Panel1.Handle);

   SetupPixelFormat(DC);

   RC:=wglCreateContext(DC);

   wglMakeCurrent(DC, RC);

   GLInit;

end;

 

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;

begin

   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

      //kolor tła

   glClearColor(1.0,1.0,1.0,0.0);

   glLoadIdentity;

      //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);

end;

 

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;

 

procedure Czworoscian(a:integer);

var

  h1,h2 : double;

begin

   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);

 

      glVertex3f(-h1/3,a/2,-h2/3);

      glVertex3f(0,0,2*h2/3);

 

      glVertex3f(2*h1/3,0,-h2/3);

      glVertex3f(-h1/3,-a/2,-h2/3);

 

      glVertex3f(2*h1/3,0,-h2/3);

      glVertex3f(0,0,2*h2/3);

 

      glVertex3f(-h1/3,a/2,-h2/3);

      glVertex3f(-h1/3,-a/2,-h2/3);

   glEnd;

end;

 

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

...
Zgłoś jeśli naruszono regulamin