Мегаобучалка Главная | О нас | Обратная связь


Задание и исходный код



2019-12-29 170 Обсуждений (0)
Задание и исходный код 0.00 из 5.00 0 оценок




 

Задание: рисунок «КУБ».

 

unit mgl;

interface

uses

Windows, Messages, Classes, Graphics, Forms, ExtCtrls, OpenGL, StdCtrls,

Controls, SysUtils, Spin, Menus, Dialogs;

type

TForm1 = class(TForm)

procedure FormCreate(Sender: TObject);

procedure FormResize(Sender: TObject);

procedure FormDestroy(Sender: TObject);

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

private

DC : HDC;

hrc : HGLRC;

Angle, AngleX, AngleY, AngleZ: GLfloat;

procedure DrawScene;

procedure InitializeRC;

procedure SetDCPixelFormat;

protected

// Обработка сообщения WM_PAINT - аналог события OnPaint

procedure WMPaint(var Msg: TWMPaint); message WM_PAINT;

end;

var

Form1: TForm;

ch, c, i: integer;

s: string;

ShowHelp: boolean=true;

implementation

{$R *.DFM}

const

 // массив свойств материала

 MaterialColor: Array [0..3] of GLfloat = (0.5, 0.0, 1.0, 1.0);

 // Процедура инициализации источника цвета

procedure TForm1.InitializeRC;

begin

 glEnable(GL_DEPTH_TEST); // разрешаем тест глубины

 glEnable(GL_LIGHTING); // разрешаем работу с освещенностью

 glEnable(GL_LIGHT0); // включаем источник света 0

end;

 // Отрисовка картинки

procedure TForm1.DrawScene;

begin

 // очистка буфера цвета и буфера глубины

 glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

 // трехмерность

 glMatrixMode(GL_MODELVIEW);

 glLoadIdentity;

 glTranslatef(0.0, 0.0, -8.0); // влево/вправо, вверх/вниз, назад/вперед

 glRotatef(AngleX, 1.0, 0.0, 0.0); // поворот на угол X

 glRotatef(AngleY, 0.0, 1.0, 0.0); // поворот на угол Y

 glRotatef(AngleZ, 0.0, 0.0, 1.0); // поворот на угол Z

 // Шесть сторон куба

 glBegin(GL_POLYGON);

glNormal3f(0.0, 0.0, 1.0);

glVertex3f(1.0, 1.0, 1.0);

glVertex3f(-1.0, 1.0, 1.0);

glVertex3f(-1.0, -1.0, 1.0);

glVertex3f(1.0, -1.0, 1.0);

 glEnd;

 

 glBegin(GL_POLYGON);

glNormal3f(0.0, 0.0, -1.0);

glVertex3f(1.0, 1.0, -1.0);

glVertex3f(1.0, -1.0, -1.0);

glVertex3f(-1.0, -1.0, -1.0);

glVertex3f(-1.0, 1.0, -1.0);

 glEnd;

 

 glBegin(GL_POLYGON);

glNormal3f(-1.0, 0.0, 0.0);

glVertex3f(-1.0, 1.0, 1.0);

glVertex3f(-1.0, 1.0, -1.0);

glVertex3f(-1.0, -1.0, -1.0);

glVertex3f(-1.0, -1.0, 1.0);

 glEnd;

 

 glBegin(GL_POLYGON);

glNormal3f(1.0, 0.0, 0.0);

glVertex3f(1.0, 1.0, 1.0);

glVertex3f(1.0, -1.0, 1.0);

glVertex3f(1.0, -1.0, -1.0);

glVertex3f(1.0, 1.0, -1.0);

 glEnd;

 

 glBegin(GL_POLYGON);

glNormal3f(0.0, 1.0, 0.0);

glVertex3f(-1.0, 1.0, -1.0);

glVertex3f(-1.0, 1.0, 1.0);

glVertex3f(1.0, 1.0, 1.0);

glVertex3f(1.0, 1.0, -1.0);

 glEnd;

 

 glBegin(GL_POLYGON);

glNormal3f(0.0, -1.0, 0.0);

glVertex3f(-1.0, -1.0, -1.0);

glVertex3f(1.0, -1.0, -1.0);

glVertex3f(1.0, -1.0, 1.0);

glVertex3f(-1.0, -1.0, 1.0);

 glEnd;

 

 SwapBuffers(DC); // конец работы

end;

 

 // обычные действия OpenGL, Создание окна

procedure TForm1.FormCreate(Sender: TObject);

begin

 Angle:=0;

 AngleX:=30;

 AngleY:=-30;

 AngleZ:=0;

 c:=1;

 DC:=GetDC(Handle);

 SetDCPixelFormat;

 hrc:=wglCreateContext(DC);

 wglMakeCurrent(DC, hrc);

 InitializeRC;

 // свойства материала - лицевые стороны - рассеянный

 // цвет материала и диффузное отражение материала - значения из массива

 glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,@MaterialColor);

end;

 

 // Установка формата пикселей

procedure TForm1.SetDCPixelFormat;

var

 nPixelFormat: integer;

 pfd: TPixelFormatDescriptor;

begin

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

 with pfd do

begin

nSize :=sizeof(pfd);

nVersion:=1;

dwFlags :=PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or

                                        PFD_DOUBLEBUFFER;

iPixelType:=PFD_TYPE_RGBA;

cColorBits:=24; // 24

cDepthBits:=32; // 32

iLayerType:= PFD_MAIN_PLANE;

 end;

 nPixelFormat := ChoosePixelFormat(DC, @pfd);

 SetPixelFormat(DC, nPixelFormat, @pfd);

end;

 // Изменение размеров окна

procedure TForm1.FormResize(Sender: TObject);

begin

 glMatrixMode(GL_PROJECTION);

 glLoadIdentity;

 gluPerspective(30.0, Width/Height, 1.0, 10.0);

 glViewport(0, 0, Width, Height);

 glMatrixMode(GL_MODELVIEW);

 InvalidateRect(Handle, nil, False);

end;

 // Обработка сообщения WM_PAINT, рисование окна

procedure TForm1.WMPaint(var Msg: TWMPaint);

var

 ps: TPaintStruct;

begin

 BeginPaint(Handle, ps);

 DrawScene;

 EndPaint(Handle, ps);

end;

 // Конец работы программы

procedure TForm1.FormDestroy(Sender: TObject);

begin

 wglMakeCurrent(0, 0);

 wglDeleteContext(hrc);

 ReleaseDC(Handle, DC);

end;

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

begin

if ord(key)=27 then Application.Terminate; // Esc

FormResize(nil);

end;

end.


Рисунок «Куб»

 


Использованные источники

 

1. Тихомиров Ю. Программирование трехмерной графики. СПб., BHV 1998.

2. Visual Introduction in OpenGL, Siggraph’98.

3. The OpenGL graphics system: a specification (version 1.1).

4. The OpenGL Utility Toolkit (GLUT) Programming Interface, API version 3, specification.



2019-12-29 170 Обсуждений (0)
Задание и исходный код 0.00 из 5.00 0 оценок









Обсуждение в статье: Задание и исходный код

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (170)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.009 сек.)