Разработка программы создания виртуальной фотогалереи
Федеральное
агентство по образованию
Рязанский
Государственный Радиотехнический Университет
Кафедра ЭВМ
Пояснительная записка
к курсовой
работе на тему
«Разработка
программы создания виртуальной фотогалереи»
Выполнил
студент группы 541
Гудков Александр
Поверил
Чичикин В.А
Рязань 2008г.
Введение
В рамках курсовой работы средствами объектно-ориентированного языка
Object Pascal и библиотеки OpenGL
создано помещение фотогалереи и разработан алгоритм, осуществляющий перемещение
по галереи. Пользователь с помощью клавиатуры и мыши перемещаться по ней и
рассматривать фотографии. Предусмотрен режим просмотра фотогалереи.
1.
Теоретическая часть
Курсовой проект включает два этапа:
1. Разработка алгоритма перемещения по фотогалерее;
2. Создание помещения галереи.
1.1 Разработка алгоритма перемещения по фотогалерее
Одна из возможностей осуществить перемещение по фотогалерее - это
перемещать камеру и перерисовывать 3D среду относительно её положения. Это можно осуществить следующим
образом:
· Вращать и проецировать позицию камеры следуя командам пользователя;
· Вращать мир вокруг начала координат противоположено вращению
камеры (это даёт иллюзию того, что повернулась камера);
· Переместить мир способом, противоположным перемещению камеры
(это даёт иллюзию того, что переместилась камера)
Рис 1. Вращение координат
За исходное примем положение, в котором голова смотрит лицом по
направлению оси Y, а вверх смотрит
по направлению оси Z. Слева направо
проходит ось X. Глядя в этом же направлении можно
вращать голову вокруг оси Z.
Чтобы повернуть камеру вокруг оси Z применяется оператор вращения мира
(f, 0, 0, 1),
где f - угол, вращающий мир на -β
Чтобы переместиться вдоль осей X, Y применяется оператор
glTranslatef (tx, ty, 0),
где:=
ty + sin(f*pi/180)/2;:= tx + cos(f*pi/180)/2;
или:=
ty - sin(f*pi/180)/2;:= tx - cos(f*pi/180)/2;
В зависимости от направления движения:
Нажата стрелка «влево» (перемещение по оси X):
ty := ty - sin(f*pi/180)/2;:= tx + cos(f*pi/180)/2;
Нажата стрелка «вправо»::= ty + sin(f*pi/180)/2;
tx := tx - cos(f*pi/180)/2;
Нажата стрелка «вверх» (перемещение по оси Y):
ty := ty + sin((f+90)*pi/180)/2;:= tx - cos((f+90)*pi/180)/2;
Нажата стрелка «вниз»::= ty - sin((f+90)*pi/180)/2;
tx := tx + cos((f+90)*pi/180)/2;
Фотогалерея состоит из двух основных комнат, каждая из которых имеет
размер 12×12.
Рис 2. Структура фотогалереи
2. Описание модуля Gallery.pas
.1 Общие сведения
Программная единица представляет собой статическую библиотеку,
подключаемую к программе на этапе компиляции.
Наименование модуля Gallery.pas.
Модуль создан на языке Delphi
в среде разработки Delphi 7.0
.2 Функциональное назначение
Создание и перемещение по виртуальной фотогалерее в соответствии с
командами пользователя.
.3 Описание структуры модуля Gallery.pas.
Модуль содержит 13 процедур, реализующих создание галереи и перемещение
по ней.
procedure TfrmGL.FormPaint(Sender: TObject)
Процедура обеспечивает установку параметров графических объектов и вывод
на экран комнат фотогалереи, а также осуществление просмотра галереи в
автоматическом режиме.
procedure TfrmGL.FormMouseMove(Sender: TObject; Shift:
TShiftState; X,
Y:
Integer);
Процедура
описывает реакцию программы при изменении положения мыши.
procedure TfrmGL.FormKeyDown(Sender: TObject; var Key:
Word;
Shift:
TShiftState);
Процедура
описывает реакцию программы на нажатие пользователем клавиш управления для
передвижения по фотогалереи и установки ограничений выхода пользователя за
пределы комнат фотогалереи, а также установления демонстрационного режим и
просмотра фотографий.
procedure TfrmGL.FormCreate(Sender: TObject);
Процедура
инициализирует переменные и создает ссылку на окно для OpenGL
procedure TfrmGL.FormDestroy(Sender: TObject);
Процедура
удаляет все объекты OpenGl, высвобождая память
procedure TfrmGL.FormResize(Sender: TObject);
Процедура
перерисовывает окно и создает перспективу
SetDCPixelFormat
(hdc : HDC);
Процедура
задает формат пикселей для работы c библиотекой OpenGl.
zal1;
Процедура
производит рисование обстановки первой комнаты фотогалереи
zal2;
Процедура
производит рисование обстановки второй комнаты фотогалереи.
Procedure zal0;
Процедура
производит рисование обстановки третьей и четвертой комнаты фотогалереи.
Порядок построения второй, третьей и четвертой комнат фотогалереи сходен с
первой.
procedure BmpTexture(name:string; k:boolean);
Процедура
производит чтение графического файла ‘name’, который используется в
качестве текстуры в помещении фотогалереи.kartina;
Процедура
производит рисование рамы для картины и загрузку изображения картины.
2.4
Вызов и использование модуля
Для
использования процедур модуля необходимо на этапе компиляции подключить модуль
к проекту, введя название модуля Gallery в список модулей, перечисленных в предложении uses.
После этого можно обратиться к необходимой процедуре.
3.
Описание применения программной единицы
Процедуры
библиотеки Gallery.pas могут применяться при проектировании любых проектов в
среде разработки Delphi , путем подключения модуля на этапе компиляции.
4.
Список использованной литературы
1. ЕСПД
ГОСТы 19.101, 19.105, 19,401.
2. M. B. Краснов OpenGL.
Графика в проектах Delphi. М. 2000.
Текст программного модуля Gallery.pas
Gallery.pas;
, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs,, ExtDlgs;= class(TForm): TOpenPictureDialog;FormCreate(Sender:
TObject);FormPaint(Sender: TObject);FormDestroy(Sender:
TObject);FormKeyDown(Sender: TObject; var Key: Word;:
TShiftState);FormResize(Sender: TObject);FormMouseMove(Sender: TObject; Shift:
TShiftState; X,: Integer);
: HDC;: HGLRC;,ty,tz,f,t : GLfloat;:
GLUquadricObj;,zal,kadr:boolean;,wrky:Glint;,demonstr:boolean;,
time1,FrameTime: GLInt;: GLint;
;
: TfrmGL;: (POINT, LINE, FILL, SILHOUETTE) = FILL;: (SPHERE,
CONE, CYLINDER, DISK) = SPHERE;:array [0..3] of GlFloat;:array [0..2] of
GlFloat=(0.5,0.5,0.5);,lookupdown :GlFloat;:
TPoint;:GlFloat;:TBitmap;:boolean;,pict:byte;:0..18;
Unit3,Unit2;
{$R *.DFM}
{====================================================================
Процедура чтение графического файла, который используется в качестве
текстуры}
procedure BmpTexture(name:string; k:boolean);
// массив образа, 64x64,j: Integer;:array [0..63,0..63,0..2] of Glbyte;:array
[0..31,0..31,0..2] of Glbyte;:= TBitmap.Create;.LoadFromFile('image/'+name); //
загрузка текстуры из файлаk theni := 0 to 63 doj := 0 to 63 do[i, j, 0] :=
GetRValue(Bitmap.Canvas.Pixels [i,j]);[i, j, 1] :=
GetGValue(Bitmap.Canvas.Pixels[i,j]);[i, j, 2] :=
GetBValue(bitmap.Canvas.Pixels[i,j]);;D(GL_TEXTURE_2D, 0, GL_RGBA,
64,64, // здесь задается размер текстуры
, GL_RGB, GL_UNSIGNED_BYTE, @Bits1);
endbegini := 0 to 31 doj := 0 to 31 do[i, j, 0] :=
GetRValue(Bitmap.Canvas.Pixels [i,j]);[i, j, 1] :=
GetGValue(Bitmap.Canvas.Pixels[i,j]);[i, j, 2] :=
GetBValue(bitmap.Canvas.Pixels[i,j]);;D(GL_TEXTURE_2D, 0, GL_RGBA,
31,31, // здесь задается размер текстуры
, GL_RGB, GL_UNSIGNED_BYTE, @Bits2);
end;(GL_TEXTURE_2D, GL_TEXTURE_Mag_FILTER,
GL_LINEAR);(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);(GL_TEXTURE_ENV,
GL_TEXTURE_ENV_MODE, GL_MODULATE);
;
{==============================================================
Создание рамы для картин, а также вывода изображения картин}
Procedure rama;:byte;(form2.colpic[p]=true)i:=1 to 4
dof(0.72,0.31,0.05);f(0,1,0);(Gl_Quads);d (0.5,0); glVertex3f(0,0,0);d (0.5,2);
glVertex3f(0,0,2);d (0, 2); glVertex3f(0.2,0.1,1.78);d (0, 0);
glVertex3f(0.2,0.1,0.18);;f(0.491,0.25,0.1);(Gl_Quads);d (0.2, 0);
glVertex3f(0.2,0.1,0.18);d (0.2, 2); glVertex3f(0.2,0.1,1.78);d (0, 2);
glVertex3f(0.3,0.05,1.78);d (0, 0);
glVertex3f(0.3,0.05,0.18);;getpictbegin.Visible:=true;.Enabled:=true;(p);(GL_TEXTURE_2D);;f(0.9,0.9,0.8);(Gl_Quads);d
(0, 1);f(0.3,0.05,0.3);d (1, 1);f(0.3,0.05,1.7);d (1, 0);f(1.7,0.05,1.7);d (0,
0);f(1.7,0.05,0.3);;(GL_TEXTURE_2D);(2,0,0);(-90,0,1,0);;;
{=============================================================
Процедура создания 3 и 4 комнаты фотогалереи}
zal0;,k,j:integer;: GLUquadricObj;;:= gluNewQuadric;f (0.9,
0.9, 1); //стены(room>=3)begin(GL_QUADS);f(1,
0, 1); //левая стенаd (2.0, 0.0); glVertex3f (-12, 12.0, 0);d (2.0, 5.0);
glVertex3f (-12.0, 12.0, 5);d (0.0, 5.0); glVertex3f (-12.0, 11.0, 5);d (0.0,
0.0); glVertex3f (-12.0, 11.0, 0);;
фотогалерея алгоритм просмотр графический
glBegin (GL_QUADS);f(1, 0, 1); //левая стенаd
(4.0, 0.0); glVertex3f (-12, 11.0, 0);d (4.0, 1.0); glVertex3f (-12.0, 11.0,
1);d (0.0, 1.0); glVertex3f (-12.0, 7.0, 1);d (0.0, 0.0); glVertex3f (-12.0,
7.0, 0);;
(GL_QUADS);f(1, 0, 1); //левая стенаd (18.0, 0.0); glVertex3f (-12, 7.0,
0);d (18.0, 5.0); glVertex3f (-12.0, 7.0, 5);d (0.0, 5.0); glVertex3f (-12.0,
-12.0, 5);d (0.0, 0.0); glVertex3f (-12.0, -12.0, 0);;
(GL_QUADS);f(0, -1, 1); // стенаf (-12, 11.0, 1);f (-12, 7.0, 1);f (-12.2, 7.0, 1);f (-12.2,
11.0, 1);;begin(GL_QUADS);f(1, 0, 1); //левая стенаd (24.0, 0.0); glVertex3f (-12, 12.0,
0);d (24.0, 5.0); glVertex3f (-12.0, 12.0, 5);d (0.0, 5.0); glVertex3f (-12.0,
-12.0, 5);d (0.0, 0.0); glVertex3f (-12.0, -12.0, 0);;;
(GL_QUADS);f(0, 1, 1);//дальняяd (12.0, 0.0); glVertex3f (-12, -12.0, 0);d (12.0, 5.0);
glVertex3f (-12, -12.0, 5);d (0.0, 5.0); glVertex3f (12, -12.0, 5);d (0.0,
0.0); glVertex3f (12, -12.0, 0);;
(GL_QUADS);f(0, -1, 1); //ближняяd (24.0, 0.0); glVertex3f (12, 12.0, 0);d (24.0, 5.0);
glVertex3f (12.0, 12.0, 5);d (0.0, 5.0); glVertex3f (-12.0, 12.0, 5);d (0.0,
0.0); glVertex3f (-12.0, 12.0, 0);;
(GL_QUADS);f(-1, 0, 1); //правая
стенаd (24.0, 0.0); glVertex3f (12,
12.0, 0);d (24.0, 5.0); glVertex3f (12.0, 12.0, 5);d (0.0, 5.0); glVertex3f
(12.0, -12.0, 5);d (0.0, 0.0); glVertex3f (12.0, -12.0,
0);;('WOOD30.bmp',true);(GL_TEXTURE_2D);(0.0, 0.0, 5);
(GL_QUADS);(1,0,-1);d (12.0, 0.0); glVertex3f (12, 12.0,
0.0);d (12.0, 12.0); glVertex3f (-12.2, 12.0, 0.0);d (0.0, 12.0); glVertex3f
(-12.2, -12.0, 0.0);d (0.0, 0.0); glVertex3f (12.0, -12.0,
0.0);;(GL_TEXTURE_2D);
(0.0, 0.0,
-5);('w.bmp',true);(GL_TEXTURE_2D);(GL_QUADS);f(1,0,1);d (12.0, 0.0);
glVertex3f (12, 12.0, 0.0);d (12.0, 12.0); glVertex3f (-12.0, 12.0, 0.0);d
(0.0, 12.0); glVertex3f (-12.0, -12.0, 0.0);d (0.0, 0.0); glVertex3f (12.0,
-12.0, 0.0);;(GL_TEXTURE_2D);
;;
(-1.5,-11.9,0.5);pict=1 then
//прорисовка рам для картин;
glScalef(1.5,1.5,1.5);:=9;;;(13.4,4,0.5);(90,0,0,1);:=12;j:=1
to 3 do(p);;(6,0,0);;(1.8,6.9,-0.5);(90,0,0,1);:=18;j:=1 to 2
do;(1.5,1.5,1.5);(p);;;(7,0,0);;(2.7,9,0.5);(90,0,0,1);:=13;j:=1 to
3do(p);;(4.5,0,0);
end;;;;
//Прорисовка ограничителей к картинам
glTranslatef (-12, 15, 1);k:=1 to 2 do(0, -4.0, 0.0);f (0.7,
0.7, 0.4);(quadObj, 0.4, 0.4, 4, 20, 1);i:=1 to 10 do;(0.4, 0.0, 0);(quadObj,
0.01, 0.01, 4, 5,1);;(36, 0.0, 0.0, 1.0);;;(quadObj, 0.8, 0.4, 0.4, 4, 1);;;(6,
0, 0);;;(11.5, -9.0, 3.5);j:=1 to 2 dof(0.7,0.3,0.1);(0,2,0);i:=1 to 4 do(quadObj,
0.07, 0.07,1.5, 6, 1);(quadObj, 0, 0.08, 10,
1);(0,5,0);;f(1,0,0);(GL_QUADS);f(1,1,0);f (0, -20.0, 0.0);f (0, -20.0, 0.2);f
(0, -5, 0.2);f (0, -5, 0.0);;(-23, -25.5, 0.1);;;;(-7.5, 11.5, 3.5);k:=1 to 2
dof(0.7,0.3,0.1);i:=1 to 4 do(quadObj, 0.07, 0.07,1.5, 6, 1);(quadObj, 0, 0.08,
10, 1);(5,0,0);;f(1,0,0);(0, 0, 0.1);(GL_QUADS);f(1,1,0);f (-5, 0, 0.0);f
(-5.0, 0, 0.2);f (-20.0, 0, 0.2);f (-20.0, 0, 0.0);;(-20, -47,
-0.1);;;;(-4,-11.5,3.5);f(0.7,0.3,0.1);i:=1 to 3 do(quadObj, 0.07, 0.07,1.5, 6,
1);(quadObj, 0, 0.08, 10, 1);(4,0,0);;f(1,0,0);(0, 0,
0.1);(GL_QUADS);f(1,1,0);f (-4, 0, 0.0);f (-4.0, 0, 0.2);f (-12.0, 0, 0.2);f
(-12.0, 0, 0.0);
glEnd;;;
{=============================================================
Процедура прорисовки первой комнаты}
Procedure zal1;,k,j:integer;: GLUquadricObj;;:=
gluNewQuadric;f (0.9, 0.9, 1); //цвет стен('w.bmp',true);(GL_TEXTURE_2D);room>=4begin(GL_QUADS);f(1,
0, 1); //левая стенаd (19.0, 0.0); glVertex3f (-12, 12.0, 0);d (19.0, 5.0);
glVertex3f (-12.0, 12.0, 5);d (0.0, 5.0); glVertex3f (-12.0, -7.0, 5);d (0.0,
0.0); glVertex3f (-12.0, -7.0, 0);;(GL_QUADS);f(1, 0, 1); //левая стенаd
(4.0, 0.0); glVertex3f (-12, -7.0, 0);d (4.0, 1.0); glVertex3f (-12.0, -7.0,
1);d (0.0, 1.0); glVertex3f (-12.0, -11.0, 1);d (0.0, 0.0); glVertex3f (-12.0,
-11.0, 0);;(GL_QUADS);f(1, 0, 1); //левая стенаd (1.0, 0.0); glVertex3f (-12, -11.0,
0);d (1.0, 5.0); glVertex3f (-12.0, -11.0, 5);d (0.0, 5.0); glVertex3f (-12.0,
-12.0, 5);d (0.0, 0.0); glVertex3f (-12.0, -12.0, 0);;begin(GL_QUADS);f(1, 0,
1); //левая стенаd (24.0, 0.0); glVertex3f (-12, 12.0, 0);d (24.0, 5.0);
glVertex3f (-12.0, 12.0, 5);d (0.0, 5.0); glVertex3f (-12.0, -12.0, 5);d (0.0,
0.0); glVertex3f (-12.0, -12.0, 0);;;(GL_QUADS);f(0, 1, 1);//дальняяd (3.0, 0.0); glVertex3f (-12, -12.0,
0);d (3.0, 5.0); glVertex3f (-12, -12.0, 5);d (0.0, 5.0); glVertex3f (-9.0,
-12.0, 5);d (0.0, 0.0); glVertex3f (-9.0, -12.0, 0);;(GL_QUADS);f(0, 1, 1);d
(4.0, 0.0); glVertex3f (-9, -12.0, 0);d (4.0, 1); glVertex3f (-9, -12.0, 1);d
(0.0, 1); glVertex3f (-5, -12.0, 1);d (0.0, 0.0); glVertex3f (-5, -12.0,
0);;(GL_QUADS);f(0, 1, 1);//дальняяd
(10, 0.0); glVertex3f (-5, -12.0, 0);d (10, 5.0); glVertex3f (-5, -12.0, 5);d
(0.0, 5.0); glVertex3f (5.0, -12.0, 5);d (0.0, 0.0); glVertex3f (5.0, -12.0,
0);;
(GL_QUADS);f(0, 1, 1);d (4.0, 0.0); glVertex3f (5, -12.0,
0);d (4.0, 1); glVertex3f (5, -12.0, 1);d (0.0, 1); glVertex3f (9, -12.0, 1);d
(0.0, 0.0); glVertex3f (9, -12.0, 0);;(GL_QUADS);f(0, 1, 1);//дальняяd (3.0, 0.0); glVertex3f (9, -12.0,
0);d (3.0, 5.0); glVertex3f (9.0, -12.0, 5);d (0.0, 5.0); glVertex3f (12.0,
-12.0, 5);d (0.0, 0.0); glVertex3f (12.0, -12.0, 0);;(GL_QUADS);f(0, -1, 1); //ближняяd (24.0, 0.0); glVertex3f (12, 12.0,
0);d (24.0, 5.0); glVertex3f (12.0, 12.0, 5);d (0.0, 5.0); glVertex3f (-12.0,
12.0, 5);
glTexCoord2d (0.0, 0.0); glVertex3f (-12.0, 12.0, 0);;room>=3
//Прорисовка прохода в третью комнату , если она подключена
then begin(GL_QUADS);f(-1, 0, 1); //правая стенаd
(1.0, 0.0); glVertex3f (12, 12.0, 0);d (1.0, 5.0); glVertex3f (12.0, 12.0, 5);d
(0.0, 5.0); glVertex3f (12.0, 11.0, 5);d (0.0, 0.0); glVertex3f (12.0, 11.0,
0);;(GL_QUADS);f(-1, 0, 1); //левая стенаd (4.0, 0.0); glVertex3f (12, 11.0,
0);d (4.0, 1.0); glVertex3f (12.0, 11.0, 1);d (0.0, 1.0); glVertex3f (12.0,
7.0, 1);d (0.0, 0.0); glVertex3f (12.0, 7.0, 0);;(GL_QUADS);f(-1, 0, 1); //правая стенаd
(19.0, 0.0); glVertex3f (12, 7.0, 0);d (19.0, 5.0); glVertex3f (12.0, 7.0, 5);d
(0.0, 5.0); glVertex3f (12.0, -12.0, 5);d (0.0, 0.0); glVertex3f (12.0, -12.0,
0);;begin(GL_QUADS);f(-1, 0, 1); //правая
стенаd (24.0, 0.0); glVertex3f
(12, 12.0, 0);d (24.0, 5.0); glVertex3f (12.0, 12.0, 5);d (0.0, 5.0);
glVertex3f (12.0, -12.0, 5);d (0.0, 0.0); glVertex3f (12.0, -12.0, 0);;;
//пол и потолок(0.0, 0.0, 5);(GL_QUADS);(1,0,-1);d
(12.0, 0.0); glVertex3f (12, 12.0, 0.0);d (12.0, 12.0); glVertex3f (-12.0,
12.0, 0.0);d (0.0, 12.0); glVertex3f (-12.0, -12.0, 0.0);d (0.0, 0.0);
glVertex3f (12.0, -12.0, 0.0);;(GL_TEXTURE_2D);
(0.0, 0.0, -5);('blue.bmp',true);(GL_TEXTURE_2D);(GL_QUADS);f(1,0,1);d
(12.0, 0.0); glVertex3f (12, 12.0, 0.0);d (12.0, 12.0); glVertex3f (-12.0,
12.0, 0.0);d (0.0, 12.0); glVertex3f (-12.0, -12.0, 0.0);d (0.0, 0.0);
glVertex3f (12.0, -12.0, 0.0);;(GL_TEXTURE_2D);
;;(-1.5,-11.9,0.5);pict=1 then
//рамы для картин;(1.5,1.5,1.5);
p:=9;;;(13.4,4,0.5);(90,0,0,1);:=12;j:=1 to 3
do(p);;(6,0,0);;(1.8,6.9,-0.5);(90,0,0,1);:=18;j:=1 to 2
do;(1.5,1.5,1.5);(p);;;(7,0,0);;(2.7,4.1,0.5);(90,0,0,1);:=13;j:=1 to
3do(p);;(6,0,0);
end;;
//Прорисовка ограничителей к картинам
;(11.5, -10.0, 3.5);k:=1 to 2 doj:=1 to 2
dof(0.7,0.3,0.1);i:=1 to 5 do(quadObj, 0.07, 0.07,1.5, 6, 1);
// glTranslatef (0, 0, -1);(quadObj, 0, 0.08, 10,
1);(0,4,0);;f(1,0,0);(GL_QUADS);f(1,1,0);f (0, -4.0, 0.0);f (0, -4.0, 0.2);f
(0, -20, 0.2);f (0, -20, 0.0);;(0, -43, 0);;f(-1,1,0);(-23, 50, 0);;;;(-7.5,
11.5, 3.5);k:=1 to 2 dof(0.7,0.3,0.1);i:=1 to 4 do(quadObj, 0.07, 0.07,1.5, 6,
1);(quadObj, 0, 0.08, 10, 1);(5,0,0);;f(1,0,0);(0, 0,
0.1);(GL_QUADS);f(1,1,0);f (-5, 0, 0.0);f (-5.0, 0, 0.2);f (-20.0, 0, 0.2);f
(-20.0, 0, 0.0);;(-18, -47, -0.1);;
;;(-4,-11.5,3.5);f(0.7,0.3,0.1);i:=1 to 3 do(quadObj, 0.07,
0.07,1.5, 6, 1);(quadObj, 0, 0.08, 10, 1);(4,0,0);;f(1,0,0);(0, 0,
0.1);(GL_QUADS);f(1,1,0);f (-4, 0, 0.0);f (-4.0, 0, 0.2);f (-12.0, 0, 0.2);f
(-12.0, 0, 0.0);
glEnd;;;
{=============================================================
Процедура прорисовки первой комнаты}
Procedure zal2;,j:integer;: GLUquadricObj;:=
gluNewQuadric;;f(0.9,0.9,0.8);(GL_QUADS);f(1, 0, 1); //левая стенаf
(-12, 12.0, 0);f (-12.0, 12.0, 5);f (-12.0, -12.0, 5);f (-12.0, -12.0, 0);;
(GL_QUADS);f(0, 1, 1); //дальняя
стенаf (12, -12.0, 0);f (12.0,
-12.0, 5);f (-12.0, -12.0, 5);f (-12.0, -12.0, 0);;
(GL_QUADS);f(-1,0 , 1); // правая стенаf (12, 12.0, 0);f (12.0,
12.0, 5);f (12.0, -12.0, 5);f (12.0, -12.0, 0);;
(GL_QUADS);f(0, -1, 1);//ближняяf (-12, 11.8, 0);f (-12, 11.8, 5);f (-9.0, 11.8, 5);f (-9.0,
11.8, 0);;(GL_QUADS);f(0, -1, 1);f (-9, 11.8, 0);f (-9, 11.8, 1);f (-5, 11.8,
1);f (-5, 11.8, 0);;(GL_QUADS);f(1, 0, 1);f (-9, 11.8, 1);f (-9, 12, 1);f (-5,
12, 1);f (-5, 11.8, 1);;(GL_QUADS);f(0, -1, 1);//ближняяf (-5, 11.8, 0);f (-5, 11.8, 5);f (5.0, 11.8, 5);f (5.0,
11.8, 0);;(GL_QUADS);f(0, -1, 1);f (5, 11.8, 0);f (5, 11.8, 1);f (9, 11.8, 1);f
(9, 11.8, 0);;(GL_QUADS);f(1, 0, 1);f (5, 11.8, 1);f (5, 12, 1);f (9, 12, 1);f
(9, 11.8, 1);;(GL_QUADS);f(0, -1, 1);//ближняяf (9, 11.8, 0);f (9.0, 11.8, 5);f (12.0, 11.8, 5);f (12.0,
11.8, 0);;(GL_QUADS);f(0, -1, 1); // стенаf (-0.25, -4.0, 0);f (-0.25, -4.0, 5);f (0.25, -4.0, 5);f
(0.25, -4.0, 0);;
;(-0.75,0,0);f(-1,0 , 1); // перегородка правая стенаi:=1 to 2 do(0.5,0,0);(GL_QUADS);f (0, 12.0, 0);f (0, 12.0,
5);f (0, -4.0, 5);f (0, -4.0, 0);;f(1,0 , 1); // перегородка левая стена;;('Roof.bmp',true);(GL_TEXTURE_2D);
(GL_QUADS); //пол и потолокf(0,0 , 1);d (12.0, 0.0);
glVertex3f (12, 12.0, 0.0);d (12.0, 12.0); glVertex3f (-12.0, 12.0, 0.0);d
(0.0, 12.0); glVertex3f (-12.0, -12.0, 0.0);d (0.0, 0.0); glVertex3f (12.0,
-12.0, 0.0);;(GL_TEXTURE_2D);
(0.0, 0.0, 5);('паркет.bmp',true);f(1,1,1);(GL_TEXTURE_2D);(0,0,1);
glBegin (GL_QUADS); //пол и потолок
glTexCoord2d (12.0, 0.0); glVertex3f (12, 12.0, 0.0);d (12.0,
12.0); glVertex3f (-12.0, 12.0, 0.0);d (0.0, 12.0); glVertex3f (-12.0, -12.0,
0.0);d (0.0, 0.0); glVertex3f (12.0, -12.0, 0.0);;(GL_COLOR_Material);(GL_TEXTURE_2D);(0.0,
0.0, 5);;;pict=2 then(-5,-11.8,0.5);:=0;j:=1 to 2 do //рамы для картин;(1.5,1.5,1.5);(p);;;(7,0,0);;(2.9,4,0.5);(90,0,0,1);:=2;j:=1
to 3 do(p);;(6,0,0);;(1.8,6,0);(90,0,0,1);(17.7,4.1,0);(90,0,0,1);:=9;j:=1 to 3
do(p);;(6,0,0);;
end;
//Прорисовка ограничителей к картинам;
glPushMatrix;(0.8,0,3.5);j:=1 to 2 doi:=1 to 3
dof(0.7,0.3,0.1);(quadObj, 0.07, 0.07,1.5, 6, 1);(quadObj, 0, 0.08, 10,
1);(0,4.5,0);;f(1,0,0);(0, -4.5, 0.1);(GL_QUADS);f (0, 0, 0.0);f (0, 0, 0.2);f
(0, -9, 0.2);f (0, -9, 0.0);;(-1.6,-9,-0.1);;;(-7.3, -11.9, 1);;
{=======================================================================
Перерисовка окна}TfrmGL.FormPaint(Sender: TObject);
[0]:=0; //Установка[1]:=3; //положения[2]:=4; //источников[3]:=12; //света
(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);// очистка буфера цвета(GL_LIGHT0,GL_PosiTion, @position1);
//Загрузка источников света(GL_FRONT, GL_SPECULAR,
@Position); //установка свойств
материалаLock //Проверка блокировки указателяSetCursorPos(wrkX,wrkY);
not modeglPolygonMode(GL_FRONT_AND_BACK,GL_LINE) //Установка стиля рисования линиямиglPolygonMode(GL_FRONT_AND_BACK,GL_FILL); //Установка стиля рисования с заполнением
glPushMatrix; //Сохранение исходного состояния матрицы(f, 0, 0, 1);
//поворот "мира" на угол f(tx, ty, tz); //Перемещение по галереи
;; // вызов процедуры рисования первой комнаты;
;(0,-24,0);; //вызов процедуры рисования второй комнаты
glPopMatrix;
room>=3 then(24.2,0,0);
glPushMatrix;; //вызов процедуры рисования третьей комнаты
glPopMatrix;;
room>=4 then(-48.4,0,0);(180,0,0,1);;; //вызов процедуры рисования четвертой комнаты;;;demonstr//Запуск режима демонстрации:= count+1;:=0;:=0;count of
:begin:=0;:=1;;
..61:f:=f+6;
..78:ty:=(count-62)*0.5;
..92:begin:=8;:=tx+(count-78)*0.5;:=f+6;;
..133:begin:=-(count-93)*0.4+8;:=7;;
..150:begin:=-8;:=7;:=f+6;
..177:begin:=-7.5;:=-(count-151)*0.5+7;;
..193:begin:=-7.5;:=-6;:=f+6;;
..223:begin:=(count-193)*0.5-7.5;:=-6.5;;
..229:begin:=-6.5;:=7.5;:=f+6;;
..236:begin:=2;:=-6.5;:=7.5;:=f+6;;
..256:begin:=2;:=-6.5;:=(count-236)*0.5+7.5;;
..265:begin:=-6.5;:=14.5;:=f-6;;
..296:begin:=(count-265)*0.5+14.5;:=-6.5;;
..307:begin:=-6.5;:=29.5;:=f+6;;
..332:begin:=(count-308)*0.5-6.5;:=29.5;;
..345:begin:=6.5;:=29.5;:=f+6;;
..374:begin:=-(count-346)*0.5+29.5;:=6.5;;
..380:begin:=6.5;:=15.5;:=f+6;;
..406:begin:=1;:=6.5;:=15.5;:=f+6;;
..420:begin:=2;:=6.5;:=15.5;:=f+6;;
begin:=0;:=-10;:=0;:=false;:=1;;;
kadr
then begin //Запуск режима отображения времени построения 1 кадра
time0:= GetTickCount;:=time0 - time1;:=time0;.Caption
:=inttostr(count)+'кадр 3а '+ inttostr(Frametime)+'мс ';.Caption :='Gallery ';(DC);;
{=======================================================================
Формат пикселя}SetDCPixelFormat (hdc : HDC);:
TPixelFormatDescriptor;: Integer;(pfd, SizeOf (pfd), 0);.dwFlags :=
PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;:=
ChoosePixelFormat (hdc, @pfd);(hdc, nPixelFormat, @pfd);;
{=======================================================================
Создание формы}TfrmGL.FormCreate(Sender:
TObject);:=2;:= GetDC (Handle);(DC);:= wglCreateContext(DC);(DC, hrc);(1, 1,
0.9, 1.0); // цвет фона(1.5);(GL_LIGHTING);(GL_LIGHT0);(GL_DEPTH_TEST);(GL_COLOR_MATERIAL);:=
gluNewQuadric;:=0;:=-10;:=-2;:=false;:=1;:=true;:=1;:=false;:=true;.prosmotr:=false;:=true;:=0;:=0;:=0;(false);:=Left+round(Width/2);:=Top+round(Height/2);(wrkx,wrky);;
{=======================================================================
Конец работы приложения}TfrmGL.FormDestroy(Sender: TObject);
(quadObj);(0, 0);(hrc);(Handle, DC);(DC);
;showimage(number:byte);.Visible:=true;.Image1.Center:=true;.Image1.AutoSize:=true;fileexists
(form2.nameimage[number])
then.Image1.Picture.LoadFromFile(form2.nameimage[number]);.deleteimage.Enabled:=true;.rotate90.Enabled:=true;.Rotate180.Enabled:=true;.Image1.Picture:=nil;.rotate90.Enabled:=false;.Rotate180.Enabled:=false;.deleteimage.Enabled:=false;;
.Height:=Form3.Image1.Height+60;.Width:=Form3.Image1.Width+35;.Visible:=false;(true);.hide;(true);
{==============================================================
Процедура реакции программы на нажатие пользователем клавиш управления}
procedure TfrmGL.FormKeyDown(Sender: TObject; var Key: Word;:
TShiftState);,ty0:Glfloat;:byte;
Key = VK_ESCAPE then(true);.Visible:=true;.DirectoryListBox1.Directory:=form2.directory+'/download';.FilterComboBox1.Filelist.Mask:='*.bmp';kolfile:=1
to 17
dofileexists(form2.directory+'/download/fotogallery'+inttostr(kolfile)+'.bmp')
thendeletefile(form2.directory+'/download/fotogallery'+inttostr(kolfile)+'.bmp')
then.FileListBox1.DeleteSelected;.colpic[kolfile]:=false;;.DirectoryListBox1.Directory:=form2.directory;.FilterComboBox1.Filelist.Mask:=form2.mask;.close;;Key=VK_Return(ty<-6)
and (ty>-12) and (tx>0) and (tx<8)begin form3.number:=16; showimage(form3.number);
end;(ty>-9) and (ty<-3) and (tx>3) and (tx<12)begin
form3.number:=12; showimage(form3.number); end;(ty>-3) and (ty<4) and
(tx>3) and (tx<12)begin form3.number:=11; showimage(form3.number);
end;(ty>4) and (ty<12) and (tx>3) and (tx<12)begin
form3.number:=10; showimage(form3.number); end;(ty<-6) and (ty>-12) and
(tx>-8) and (tx<0)begin form3.number:=17; showimage(form3.number);
end;(ty>-9) and (ty<-3) and (tx>-12) and (tx<-3)begin
form3.number:=15; showimage(form3.number); end;(ty>-3) and (ty<4) and
(tx>-12) and (tx<-3)begin form3.number:=14; showimage(form3.number);
end;(ty>4) and (ty<12) and (tx>-12) and (tx<-3)begin
form3.number:=13; showimage(form3.number); end;(ty>2) and (ty<12) and
(tx>-6) and (tx<6)begin form3.number:=9; showimage(form3.number);
end;(ty>12) and (ty<20) and (tx>1) and (tx<12)begin
form3.number:=8; showimage(form3.number); end;(ty>20) and (ty<28) and
(tx>1) and (tx<12)begin form3.number:=7; showimage(form3.number);
end;(ty>28) and (ty<36) and (tx>1) and (tx<12)begin form3.number:=6;
showimage(form3.number); end;(ty>12) and (ty<20) and (tx>-11) and
(tx<-1)begin form3.number:=5; showimage(form3.number); end;(ty>20) and
(ty<28) and (tx>-11) and (tx<-1)begin form3.number:=4;
showimage(form3.number); end;(ty>28) and (ty<35) and (tx>-11) and
(tx<-1)begin form3.number:=3; showimage(form3.number); end;(ty>30) and
(ty<35) and (tx>0) and (tx<8)begin form3.number:=1;
showimage(form3.number); end;(ty>30) and (ty<35) and (tx>-8) and
(tx<0)begin form3.number:=2; showimage(form3.number); end;;Key=VK_F1begin:=false;.HelpFile:='Help\Help.hlp';.HelpCommand(HELP_FINDER,0);;Key=VK_F2beginlockShowCursor(true)ShowCursor(false);:=not
lock;;
Key=VK_F3begin:=not demonstr;:=1;;Key = VK_F4kadr:=not kadr;
room=2(tx<=-11) and (tx>=-12):=-11;begin
(tx<=-11)and (tx>=-12)and (((ty>-12) and
(ty<-10.5))or((ty>-6.5) and (ty<36))):=-11;(tx>=-13)and
(tx<=-12)and(((ty>-12) and (ty<-10.5))or((ty>-6.5) and
(ty<36))):=-13;;
room>=4begin(tx>=11)and (tx<=12)and (((ty>-12)
and (ty<6.5))or((ty>10.5) and (ty<36))):=11;(tx<=13)and
(tx>=12)and(((ty>-12) and (ty<6.5))or((ty>10.5) and
(ty<36))):=13;if tx>=11tx:=11;
(ty<=-11)ty:=-11;(ty>=35)ty:=35;(ty>11.4) and
(ty<12.4) and ((tx>8) or (tx<-8) or ((tx<5) and
(tx>-5)))begin:=ty0;;(ty>12) and (ty<28.4) and (tx>-0.8) and
(tx<0.8):=tx0;(tx>-0.8) and (tx<0.8) and (ty<28.4) and (ty>27):=ty0;
(ty<12)// and (tx<12) and (tx>-12)pict:=1begin
{if tx<-12pict:=1 ;tx>12pict:=1}pict:=2;;
(Handle, nil, False);;
{======================================================================
Процедура перерисовки галереи}TfrmGL.FormResize(Sender: TObject);(0, 0, ClientWidth,
ClientHeight);(GL_PROJECTION);;(50, Width/Height, 0.1,
48.2);(GL_MODELVIEW);;(90.0, 1.0, 0.0, 0.0); // поворот объекта - ось Y(Handle, nil, False);;
{====================================================================
Процедура реакции программы на перемещене мыши}
procedure TfrmGL.FormMouseMove(Sender: TObject; Shift:
TShiftState; X,: Integer);Lock(mpos);not
demonstrbegin:=f-(mpos.x-(wrkX))/8;:=t+(mpos.y-(wrkY))/8;;(Handle,nil,False);
end