МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
Національний університет «Львівська політехніка»
Кафедра АСУ
Звіт
до лабораторної роботи №6
з курсу “Об'єктно орієнтоване програмування”
Варіант 11
Бунь І.П.
Тема Створення анімаційного проекту з допомогою бібліотеки OPENGL
Мета роботи: Вивчення можливостей графічної бібліотеки OpenGL для створення анімаційних проектів.
Порядок роботи:
Ознайомитись з теоретичними відомостями по роботі.
Створити проект Delphi, який реалізує наведений у тексті приклад.
Змінити текст програми так, щоб він відповідав індивідуальному завданню.
Оформити звіт для захисту лабораторної роботи за зразком
назва роботи
мета роботи
порядок роботи
короткі теоретичні відомості
алгоритм розв’язку задачі
тексти відповідних модулів проекту
аналіз отриманих результатів та висновки
Завдання
І.Реалізувати за допомогою функцій бібліотеки OpenGL вивід на екран і перетворення геометричної фігури та її каркасу. Тип фігури та перетворення вибрати згідно з варіантом індивідуального завдання:
II. Створити за допомогою функцій бібліотеки OpenGL тривимірні зображення перших літер Вашого прізвища та імені. Передбачити зміну кольорів літер і розташування спостерігача у часі
11. Конус обертання навколо діагоналі простору XYZ за годинниковою стрілкою
Текст програми:
unit frmMain;
interface
uses
Windows, Messages, Classes, Graphics, Forms, ExtCtrls, Menus, Controls,
SysUtils, Dialogs, OpenGL, ComCtrls;
type
TfrmGL = class(TForm)
Timer: TTimer;
UpDown1: TUpDown;
procedure FormCreate(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure TimerTimer(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure UpDown1ChangingEx(Sender: TObject; var AllowChange: Boolean;
NewValue: Smallint; Direction: TUpDownDirection);
private
speed: double;
DC : HDC;
hrc : HGLRC;
Angle : GLfloat;
qObj : gluQuadricObj;
procedure SetDCPixelFormat;
protected
procedure WMPaint(var Msg: TWMPaint); message WM_PAINT;
end;
var
frmGL: TfrmGL;
implementation
uses DGLUT;
{$R *.DFM}
const
MaterialCyan : Array[0..3] of GLfloat = (0.0, 1.0, 1.0, 1.0);
MaterialMy:Array [0..3] of GLfloat=(1.0,1.0,0.0,0.0);
procedure TfrmGL.WMPaint(var Msg: TWMPaint);
var
ps : TPaintStruct;
begin
BeginPaint(Handle, ps);
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glPushMatrix;
glRotatef(Angle, 1.0, 1.0, 1.0); // поворот на угол
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, @MaterialCyan);
glutSolidCone(0.5,1.5,50,50);
glPopMatrix;
glPushMatrix;
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, @MaterialMy);
glRotatef(Angle,0.0,1.0,0.0); // поворот на угол
glutSolidTorus(0.1,2,50,50);
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, @MaterialCyan);
glTranslatef(-2,0.0,0.0);
glutSolidSphere(0.2,10,10);
glTranslatef(4,0.0,0.0);
glutSolidSphere(0.2,10,10);
glPopMatrix;
glPushmatrix;
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, @MaterialMy);
glRotatef(Angle,0.0,1.0,0.0); // поворот на угол
glRotatef(Angle,1.0,0.0,0.0); // поворот на угол
glutSolidTorus(0.08,1.8,50,50);
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, @MaterialCyan);
glTranslatef(0.0,1.8,0.0);
glutSolidSphere(0.16,10,10);
glTranslatef(0.0,-3.6,0.0);
glutSolidSphere(0.16,10,10);
glPopMatrix;
glPushMatrix;
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, @MaterialMy);
glRotatef(Angle,0.0,1.0,0.0); // поворот на угол
glRotatef(Angle,1.0,0.0,0.0); // поворот на угол
glRotatef(Angle,0.0,1.0,0.0);
glutSolidTorus(0.06,1.65,50,50);
glPopMatrix;
SwapBuffers(DC); // конец работы
EndPaint(Handle, ps);
end;
//=======================================================================
procedure TfrmGL.TimerTimer(Sender: TObject);
begin
Angle := Angle + speed;
frmGL.Caption:=floattostr(speed);
InvalidateRect(Handle, nil, False);
end;
//=======================================================================
procedure TfrmGL.SetDCPixelFormat;
var
nPixelFormat: Integer;
pfd: TPixelFormatDescriptor;
begin
FillChar(pfd, SizeOf(pfd), 0);
pfd.dwFlags := PFD_DRAW_TO_WINDOW or
PFD_SUPPORT_OPENGL or
PFD_DOUBLEBUFFER;
nPixelFormat := ChoosePixelFormat(DC, @pfd);
SetPixelFormat(DC, nPixelFormat, @pfd);
end;
//=======================================================================
procedure TfrmGL.FormCreate(Sender: TObject);
begin
Angle := 0;
DC := GetDC(Handle);
SetDCPixelFormat;
hrc := wglCreateContext(DC);
wglMakeCurrent(DC, hrc);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
qObj := gluNewQuadric;
Timer.Enabled := True;
end;
//=======================================================================
procedure TfrmGL.FormResize(Sender: TObject);
begin
glViewport(0, 0, ClientWidth, ClientHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(40.0, ClientWidth / ClientHeight, 3.0, 20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
glTranslatef(0.0, 0.0, -8.0);
UpDown1.Left:=frmGl.Width-UpDown1.Width-8;
UpDown1.Top:=frmGl.Height-UpDown1.Height-32;
InvalidateRect(Handle, nil, False);
end;
//=======================================================================
procedure TfrmGL.FormDestroy(Sender: TObject);
begin
Timer.Enabled := False;
gluDeleteQuadric (qObj);
wglMakeCurrent(0, 0);
wglDeleteContext(hrc);
ReleaseDC(Handle, DC);
DeleteDC (DC);
end;
procedure TfrmGL.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
If Key = VK_ESCAPE then Close
end;
procedure TfrmGL.UpDown1ChangingEx(Sender: TObject;
var AllowChange: Boolean; NewValue: Smallint;
Direction: TUpDownDirection);
begin
if Direction=updUp then speed:=speed+0.5
else if speed>0 then
speed:=speed-0.5;
end;
end.
Скріншоти роботи програми
,
Висновок: На даній лабораторній роботі я практикувався у створенні ужитків з використанням графічної бібліотеки OpenGL, способи її підключення, основні принципи формування сцени з декількох об’єктів, правила роботи з сценою,та основні фігури які містить у собі бібліотека.