Задание и исходный код
12
Задание: рисунок «КУБ».
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.
12
Популярное: Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (170)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |