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 |
||||||||||||
Зм. |
Лист |
№ Докум |
Підпис |
Дата |
||||||||
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.