Використовуючи команди надбудови над OpenGl створити тривимірну фігуру та забезпечити її поворот при натисненні на кнопку пробіл

Я взяла для виконання свого завдання програму Delphi і побудувала сферу на формі придавши їй червоного кольору, лістинг програми матиме такий вигляд:

 

unit Unit1;

interface

uses

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

OpenGL, Menus;

type

TfrmGL = class(TForm)

procedure FormCreate(Sender: TObject);

procedure FormPaint(Sender: TObject);

procedure FormDestroy(Sender: TObject);

procedure FormKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

procedure FormResize(Sender: TObject);

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

private

DC: HDC; //контекст пристрою

hrc: HGLRC; //контекст відображення

ry: GLfloat; //зміна координати по У

tx: GLfloat; //зміна координати по Х

end;

var

frmGL: TfrmGL;

mode: (POINT, LINE, FILL) = FILL; //режими відображення обєкта

mx,my:byte; //коефіцієнти збільшення/зменшення

implementation

uses DGLUT;

{$R *.DFM}

procedure TfrmGL.FormPaint(Sender: TObject);

begin

glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // очищення буферу кольору

glPushMatrix; //заповнюємо систему координат

glScalef (my/mx, my/mx, my/mx); //виконуємо маштабування

glRotatef (ry, 0.0, 1.0, 0.0); //виконуємо потовот

glTranslatef (tx, 0.0, 0.0); //виконуємо перенесення

 

case mode of //вибираємо режим відображення

POINT: glPolygonMode (GL_FRONT_AND_BACK, GL_POINT);

LINE: glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);

FILL: glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);

end;

 

glutSolidSphere (1.5, 20, 20); //будуємо сферу

glScalef (mx/my, mx/my, mx/my); //повертаємо систему в початкове полож

 

glPopMatrix; //повертаємо систему в попереднє положення

SwapBuffers(DC); //відображуємо на екрані

end;

procedure SetDCPixelFormat (hdc: HDC);

var

pfd: TPixelFormatDescriptor;

nPixelFormat: Integer;

begin

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

pfd.dwFlags:= PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;

nPixelFormat:= ChoosePixelFormat (hdc, @pfd);

SetPixelFormat (hdc, nPixelFormat, @pfd);

end;

 

procedure TfrmGL.FormCreate(Sender: TObject);

begin

DC:= GetDC (Handle);

SetDCPixelFormat(DC);

hrc:= wglCreateContext(DC);

wglMakeCurrent(DC, hrc);

glClearColor (0.5, 0.5, 0.75, 1.0); // цвет фона

glLineWidth (1.5);

glEnable (GL_LIGHTING);

glEnable (GL_LIGHT0);

glEnable (GL_DEPTH_TEST);

glEnable (GL_COLOR_MATERIAL);

glColor3f (1.0, 0.0, 0.0);

 

ry:= 0.0;

tx:= 0.0;

mx:=10;

my:=10;

end;

 

procedure TfrmGL.FormDestroy(Sender: TObject);

begin

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;

If Key = VK_LEFT then begin

ry:= ry + 2.0;

InvalidateRect(Handle, nil, False);

end;

If Key = VK_RIGHT then begin

ry:= ry - 2.0;

InvalidateRect(Handle, nil, False);

end;

If Key = VK_UP then begin

tx:= tx - 0.1;

InvalidateRect(Handle, nil, False);

end;

If Key = VK_DOWN then begin

tx:= tx + 0.1;

InvalidateRect(Handle, nil, False);

end;

 

If Key = 49 then begin

mode:= POINT;

InvalidateRect(Handle, nil, False);

end;

If Key = 50 then begin

mode:= LINE;

InvalidateRect(Handle, nil, False);

end;

If Key = 51 then begin

mode:= FILL;

InvalidateRect(Handle, nil, False);

end;

end;

procedure TfrmGL.FormResize(Sender: TObject);

begin

glViewport(0, 0, ClientWidth, ClientHeight);

glMatrixMode (GL_PROJECTION);

glLoadIdentity;

glFrustum (-1, 1, -1, 1, 2, 9);

glMatrixMode (GL_MODELVIEW);

glLoadIdentity;

// этот фрагмент нужен для придания трёхмерности

glTranslatef(0.0, 0.0, -5.0); // перенос объекта - ось Z

glRotatef(30.0, 1.0, 0.0, 0.0); // поворот объекта - ось X

glRotatef(70.0, 0.0, 1.0, 0.0); // поворот объекта - ось Y

 

InvalidateRect(Handle, nil, False);

end;

 


4. Для попереднього практичного завдання вашого варіанту забезпечити операцію маштабування використовуючи клавіши “+” та “-“

 

Потім для точного виконання завдання виконала слідуючий алгоритм дій при цьому використала згідно варіанту клавіші «+» та «-», що по умові завдання виконують наближення та відділення фігури на фоні:

 

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

begin

if key = '-' then mx:=mx+1;

if key = '+' then mx:=mx-1;

InvalidateRect(Handle, nil, False);

end;

 

end.




Список використаної літератури

 

1. С.В. Глушаков, Г.А. Крабе Компютерная графика, Харьков 2002

2. Блінова Т.О., Порєв В.М. Комп’ютерна графіка / За _ед.. В.М.Горєва. – К.: Видавництво “Юніор”, 2004

3. OpenGl, технология ставшая символов, Учебник в примерах

4. Конспект лекцій

5. Мережа Інтернет




double arrow
Сейчас читают про: