Построение трехмерных изображений способами библиотеки OpenGL

Страницы работы

Содержание работы

7.160101.1381.04.03

Зм.

Лист

№ Докум

Підпис

Дата

Багнюк В.В.

Лабораторная работа №4

Построение 3х мерных изображений способами библиотеки OpenGL.

Лim

Лисm

Листів

Студент

Белов А. С.

26.05

1

9

Билый Т.В

НУК

Викладач

Покровский

Лабораторная работа №4

          Тема:   Построение 3х мерных изображений способами библиотеки OpenGL.

          Цель:  Построить 3х мерные изображения способами библиотеки OpenGL.

Задание 1

          Создать класс, который описывает абстрактную пирамиду и подклассы “3-гранная пирамида” и “4-гранная пирамида” К классам включить конструктор CreateRandom() без параметров, который  создаёт пирамиду, размещённую в пространстве xє[-10;10]; yє[-10;10]; zє[-20;-1000]. Основание пирамиды должно быть горизонтально. Диаметр окружности, описанной вокруг основания лежит в диапазоне dє[0.5;1.5]. Высота лежит в диапазоне dє[1;4]. Диаграмма классов для пирамид:

Виртуальный метод Plot() призрачен для рисования пирамиды на экране. При исполнение процедуры Plot() Open GL-контекст должен быть полностью подготовленный к работе.

Задание 2

          Свойств главной формы программы дополнить списком, который должен хранить ряд объектов – экземпляров классов, описанных в предыдущем пункте. Список надо заполнять при обращении события onCreate формы путём вызова конструктора CreateRandom().

Задание 3

          В обработку событий onPaint надо включить метод Plot() для всех объектов находящихся в  списке.

Код

unit Unit1;

interface

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs,OpenGl,Figures, ExtCtrls, Menus;

type

  TForm1 = class(TForm)

    PaintBox1: TPaintBox;

    PopupMenu1: TPopupMenu;

    Moving1: TMenuItem;

    LoofFromUp1: TMenuItem;

    LookFromProfil1: TMenuItem;

    procedure FormCreate(Sender: TObject);

Лист

2

Зм.

Лист

№ Докум

Підпис

Дата

    procedure FormDestroy(Sender: TObject);

    Procedure Step(d: Double);

    procedure Turn (dTeta, dFi: Double);

    procedure FormKeyPress(Sender: TObject; var Key: Char);

    procedure FormResize(Sender: TObject);

    procedure PaintBox1Paint(Sender: TObject);

    procedure LoofFromUp1Click(Sender: TObject);

    procedure LookFromProfil1Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

     Fi, Teta, X, Y, Z, X1, Y1, Z1: Double;

     hrc: HGLRC;

     Figures:Tlist;

  end;

var

  Form1: TForm1;

 kx, ky,kz:double;

  procedure SetDCPixelFormat(hdc: HDC);

 implementation

{$R *.dfm}

 procedure SetDCPixelFormat(hdc: HDC);

var pfd: TPixelFormatDescriptor;

nPixelFormat: integer;

begin

  FillChar (pfd, SizeOf(pfd), 0);

  nPixelFormat:=ChoosePixelFormat(hdc, @pfd);

  SetPixelFormat(hdc, nPixelFormat, @pfd);

end;

procedure TForm1.FormCreate(Sender: TObject);

var

 Cubus:TCubus;

        Piramidt:TPiramidt;

        Piramide:TPiramide;

        i,j,k:byte;

        xf,yf,zf:double;

begin

randomize;

SetDCPixelFormat(Canvas.Handle);

   hrc:=wglCreateContext(Canvas.Handle);

   X:=0; Y:=0; Z:=0;

   X1:=0; Y1:=0; Z1:=-1;

   kx:=1; ky:=1;

   Fi := pi/2;

   Teta := 0;

   Figures:=Tlist.Create;

   for i:=1 to round(random(100))  do begin

   xf:=-random(75)+40;

   yf:=-1.5;

   zf:=-random(75)+40;

   Cubus:=TCubus.Create(xf,yf,zf,random,random,random);

   Figures.Add(Cubus);

   end;

   for j:=1 to round(random(100))  do begin

   xf:=-random(75)+40;

   yf:=-2;

   zf:=-random(75)+40;

   Piramidt:=TPiramidt.Create(xf,yf,zf,random,random,random);

   Figures.Add(Piramidt);

   end;

Лист

3

Зм.

Лист

№ Докум

Підпис

Дата

   for k:=1 to round(random(100))  do begin

   xf:=-random(75)+40;

   yf:=-2;

   zf:=-random(75)+40;

   Piramide:=TPiramide.Create(xf,yf,zf,random,random,random);

   Figures.Add(Piramide);

   end;

end;

procedure TForm1.FormDestroy(Sender: TObject);

begin

wglDeleteContext(hrc);

end;

procedure TForm1.Turn (dTeta, dFi: Double);

var dx, dy, dz: Double;

begin

  Fi:=Fi+dFi;

  teta:=Teta+dTeta;

  dx:=cos(Fi)*cos(Teta);

  dz:=-sin(Fi)*cos(Teta);

  dy:=sin(Teta);

  X1:=X+dx;

  Y1:=Y+dy;

  Z1:=Z+dz;

end;

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);

begin

 case key of

      'f':kx:=kx-1;

      'h':kx:=kx+1;

      't':ky:=ky+1;

      'g':ky:=ky-1;

      'v':kz:=kz+1;

      'b':kz:=kz-1;

      'r': step(1);

      'y': step(-1);

      'w': Turn(  pi/180,   0);

      's': Turn( -pi/180,  0);

      'a': Turn( 0,   pi/180);

      'd': Turn( 0,   -pi/180);

    end;

    if Fi>= 2*pi then Fi:=Fi - (2*pi);

    if teta>= 2*pi then Teta:=Teta - (2*pi);

    RePaint;

end;

procedure TForm1.Step (d: Double);

var dx, dy, dz: Double;

begin

  dx:=cos(Fi)*cos(Teta)*d;

  dz:=-sin(Fi)*cos(Teta)*d;

  dy:=sin(Teta)*d;

    X:=X+dx;  X1:=X1+dx;

    Y:=Y+dy;  Y1:=Y1+dy;

    Z:=Z+dz;  Z1:=Z1+dz;

end;

procedure TForm1.FormResize(Sender: TObject);

begin

wglDeleteContext(hrc);

   PaintBox1.Width:=Form1.Width-50;

   PaintBox1.Height:=Form1.Height-50;

   SetDCPixelFormat(Canvas.Handle);

   hrc:=wglCreateContext(Canvas.Handle);

end;

Лист

4

Зм.

Лист

№ Докум

Підпис

Дата

procedure TForm1.PaintBox1Paint(Sender: TObject);

var

 i:byte;

 F:Tfigures;

 const

 v1:array [0..3] of GLFLOAT=(0.2,0.2,0.2,1);

 v2:array [0..3] of GLFLOAT=(0.8,0.8,0.8,1);

 v3:array [0..3] of GLFLOAT=(1,0,0,0);

 v4:array [0..3] of GLFLOAT=(0,0,0,1.0);

 v5: GLFLOAT=(0.0);

 v6:array [0..4] of GLFLOAT=(0,0,0,1,1);

 v7:array [0..2] of GLFLOAT=(0,1,1);

begin

    wglMakeCurrent(Canvas.Handle, hrc);

    glClearColor(0, 0, 0, 1.0);

    glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

    glColor3d(1,1,1);

    glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);

    glEnable(GL_LIGHTING);

    glEnable(GL_LIGHT0);

    glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,@v1);

    glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,@v2);

    glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,@v3);

    glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,@v4);

    glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,@v5);

    glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,@v6);

    glMaterialfv(GL_FRONT_AND_BACK,GL_COLOR_INDEXES,@v7);

    glPushMatrix;

   glEnable(gl_NORMALIZE);

   glEnable(gl_DEPTH_TEST);

   glFrustum(-10, 10, -10, 10, 20, 1000);

   gluLookAt(X+kx,Y+ky,Z+kz, X1+kx,Y1+ky,Z1+kz, 0,1,0);

   glColor3d(0.2,0.2,0.2);

   glPushMatrix;

   glScaled (200,10, 200);

   glBegin (GL_QUADS);

    glvertex3D(-1, -1, 1);

    glvertex3D(-1, -1, -1);

    glvertex3D(1, -1, -1);

    glvertex3D(1, -1, 1);

   glEnd;

   glPopMatrix;

    glTranslated(0,0,-15);

      glscaled(5,5,5);

      for i:=0 to figures.count-1 do begin

       f:=Figures.Items[i];

       f.Plot;

      end;

glPopMatrix;

glDisable(GL_LIGHTING);

    {Cursor}

    glColor3d(1,0,0);

    glBegin(GL_Lines);

      glVertex2d(0, -0.1);

      glVertex2d(0, 0.1);

      glVertex2d(0.1, 0);

      glVertex2d(-0.1, 0);

    glEnd;

    wglMakeCurrent(0,0);

end;

Лист

5

Зм.

Лист

№ Докум

Підпис

Дата

procedure TForm1.LoofFromUp1Click(Sender: TObject);

begin

  with sender as TmenuItem do

 begin

 checked:= not checked;

 if checked then begin

   x:=70; y:=70; z:=70;

   x1:=0;Y1:=0;Z1:=0;

   repaint;

 end;

end;

end;

procedure TForm1.LookFromProfil1Click(Sender: TObject);

begin

with sender as TmenuItem do

 begin

 checked:= not checked;

 if checked then begin

 x:=0; y:=70; z:=-200;

   x1:=0;Y1:=0;Z1:=0;

   repaint;

 end else

 begin

  x:=0; y:=0; z:=0;

   x1:=0;Y1:=0;Z1:=-1;

   repaint;

 end;

end;

end;

end.

unit Figures;

interface

 uses Classes,OpenGl;

type TFigures = class (TObject)

  procedure Plot; Virtual;Abstract;

end;

TPiramidt = class(TFigures)

  x,y,z:double;

  r,g,b:double;

  constructor Create(x1,y1,z1,r1,g1,b1:double);

  procedure Plot; override;

end;

TPiramide = class (TFigures)

  x,y,z:double;

  r,g,b:double;

  constructor Create(x1,y1,z1,r1,g1,b1:double);

  procedure Plot; override;

end;

TCubus = class (TFigures)

  x,y,z:double;

  r,g,b:double;

  constructor Create(x1,y1,z1,r1,g1,b1:double);

  procedure Plot; override;

end;

implementation

Constructor  TCubus.Create(x1,y1,z1,r1,g1,b1:double);

begin

x:=x1; Y:=y1; Z:=z1; :=r1; g:=g1; b:=b1;

end;

Лист

6

Зм.

Лист

№ Докум

Підпис

Дата

procedure Tcubus.Plot;

begin

glPushMatrix;

glTranslated(x,y,z);

glColor3d(r,g,b);

glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);

glBegin(GL_QUADS);

 glNormal3f(0,0,1);

 glVertex3d(0.5,0.5,0.5);

 glVertex3d(0.5,-0.5,0.5);

 glvertex3d(-0.5,-0.5,0.5);

 glVertex3d(-0.5,0.5,0.5);

 glNormal3f(0,0,-1);

 glVertex3d(-0.5,0.5,-0.5);

 glVertex3d(0.5,0.5,-0.5);

 glVertex3d(0.5,-0.5,-0.5);

 glVertex3d(-0.5,-0.5,-0.5);

 glVertex3d(-0.5,0.5,0.5);

 glVertex3d(-0.5,0.5,-0.5);

 glVertex3d(0.5,0.5,-0.5);

 glVertex3d(0.5,0.5,0.5);

 glVertex3d(-0.5,-0.5,0.5);

 glVertex3d(-0.5,-0.5,-0.5);

 glVertex3d(0.5,-0.5,-0.5);

 glVertex3d(0.5,-0.5,0.5);

 glVertex3d(0.5,0.5,0.5);

 glVertex3d(0.5,0.5,-0.5);

 glVertex3d(0.5,-0.5,-0.5);

 glVertex3d(0.5,-0.5,0.5);

 glVertex3d(-0.5,-0.5,0.5);

 glVertex3d(-0.5,0.5,0.5);

 glVertex3d(-0.5,0.5,-0.5);

 glVertex3d(-0.5,-0.5,-0.5);

glEnd;

glColor3d(0,0,0);

glPopMAtrix;

end;

Constructor TPiramide.create(x1,y1,z1,r1,g1,b1:double);

begin

x:=x1; y:=y1; z:=z1; :=r1; g1:=g; b1:=b;

end;

procedure Tpiramide.Plot;

begin

glPushMatrix;

glTranslated(x,y,z);

glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

glColor3d(r,g,b);

glBegin(GL_QUADS);

 glVertex3d(-0.5,0,-0.5);

 glVertex3d(-0.5,0,0.5);

 glVertex3d(0.5,0,0.5);

glvertex3d(0.5,0,-0.5);

glEnd;

glBegin(GL_TRIANGLE_STRIP );

 glVertex3d(-0.5,0,0.5);

 glVertex3d(0.5,0,0.5);

 glVertex3d(0,0.5,0);

 glVertex3d(0.5,0,-0.5);

 glVertex3d(-0.5,0,-0.5);

 glVertex3d(0,0.5,0);

 glVertex3d(-0.5,0,0.5);

glEnd;

glPopMAtrix;

end;

Лист

7

Зм.

Лист

№ Докум

Підпис

Дата

Constructor TPiramidt.create(x1,y1,z1,r1,g1,b1:double);

begin

x:=x1; y:=y1; z:=z1; r:=r1; g:=g1; b:=b1;

end;

procedure Tpiramidt.Plot;

begin

glPushMatrix;

glTranslated(x,y,z);

glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

glColor3d(r,g,b);

glBegin(GL_TRIANGLES);

 glVertex3d(-0.5,0,0.5);

 glVertex3d(0.5,0,-0.5);

 glVertex3d(0.5,0,0.5);

glEnd;

glBegin(GL_TRIANGLE_STRIP );

 glVertex3d(-0.5,0,0.5);

 glVertex3d(0.5,0,0.5);

 glVertex3d(0,0.5,0);

 glVertex3d(0.5,0,-0.5);

 glVertex3d(-0.5,0,0.5);

glEnd;

glPopMAtrix;

end;

end.

Рисунок

Лист

8

Зм.

Лист

№ Докум

Підпис

Дата

Вывод

          Благодаря созданию виртуального класса можно создавать множество наследников с похожими свойствами и разной реализацией. Т. к. сообщения пересылается через  виртуальный класс, то значительно упрощается код и понимание программы.

          Примером выделения и объединения общих свойств и отделения их от остальных служит создания виртуального класса  TFigures, который в себе объединил похожие классы куба, 3х и 4х-гранных фигур. Все они объедены в отдельный модуль Figures.

          Благодаря универсальности библиотеки OpenGL можно создавать 3х-мерные изображения. Она содержит все необходимые средства реализации в данной области программирования и очень упрощает создание сложных изображений.

Лист

9

Зм.

Лист

№ Докум

Підпис

Дата

 

Похожие материалы

Информация о работе