Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Геом моделирование 2D объектов бис бис.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
772.31 Кб
Скачать

«Заготовка» графической программы, написанной в среде Delphi

unitTest;

interface

uses

Windows, Messages, Forms, Dialogs, Classes, Controls, ExtCtrls, StdCtrls,OpenGL, BMP;

type

TForm1 = class(TForm)

procedureFormPaint(Sender: TObject);

procedureFormCreate(Sender: TObject);

procedureFormDestroy(Sender: TObject);

private

hrc: HGLRC;

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

procedureglBindTexture(target: GLenum; texture: GLuint); stdcall; external opengl32;

//===========================Рисованиеокна=======================

procedure TForm1.FormPaint(Sender: TObject);

begin

wglMakeCurrent(Canvas.Handle, hrc);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

glOrtho(-1.0,1.0,-1.0,1.0,-1.0,1.0);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

//================Здесьбудутрисоватьстуденты===========

glClearColor(0.8,0.8,0.8,1.0); // см. подраздел 2.4

glClear(GL_COLOR_BUFFER_BIT);

glEnable(GL_DEPTH_TEST); //см. подраздел 3.5

glClear(GL_DEPTH_BUFFER_BIT);

glEnable(GL_TEXTURE_2D); // см. подраздел 4.3

//=============================================================

wglMakeCurrent (0, 0);

end;

//================ Определениеформатапикселя ================

procedureSetDCPixelFormat (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 TForm1.FormCreate(Sender: TObject);

begin

SetDCPixelFormat(Canvas.Handle);

hrc := wglCreateContext(Canvas.Handle);

end;

//=================Конецработыприложения=======================

procedure TForm1.FormDestroy(Sender: TObject);

begin

wglDeleteContext(hrc);

end;

end.

Компоненты графической программы

В состав графической программы, кроме процедуры рисования, а также традиционных разделов описаний модулей, типов, переменных и пр., входят процедуры настройки графических режимов.Как известно,операционная системаWindows средствами графического интерфейса GDIсоздает так называемый контекст устройства (devicecontext – DC), через который, используя драйверы устройств вывода, осуществляется графический вывод. Контекст устройства является структурой данных стандартного типаHDC, который представляет собой дескриптор (handle) контекста устройства.Контекст устройства определяет комплект графических объектов (кисть, палитру, области отсечения и т.д.) и связанных с ними атрибутов, а также графические режимы, влияющие на вывод. Другими словами, контекст устройства это описание набора графических средств, которыми обладает компьютер. В свою очередь, библиотека OpenGL создает контекст воспроизведения (renderingcontext – RC), который определяет графические средства, необходимые для выполнения графической программы.Он связывает OpenGL с оконными системами Windows. Обращение к контексту воспроизведения идет через его дескриптор hrc – структуру стандартного типа HGLRC. Таким образом, чтобы начать работать с командами OpenGL, приложение должно создать один или несколько контекстов воспроизведения и сделать текущим один из них.

Прежде чем создавать контекст воспроизведения, необходимо установить длянего формат пикселей, который определяет свойства поверхности рисования OpenGL и должен совпадать с форматом пикселей соответствующего контекста воспроизведения. Для описания формата пикселей используется специальныйтипданных TPixelFormatDescriptor. Это запись со множеством полей, в которых указываются различные настройки графического вывода: глубина каждого основного цвета, наличие двойной буферизации, поддержка оконного вывода, режим отображения цветов, настройки буферов OpenGL и др.Прежде чем установить некоторый желаемый формат пикселей, необходимонаправить системе запрос: поддерживает ли она его?Это делается при помощи функции: ChoosePixelFormat(hdc, @pfd):integer;у которой первый параметр hdc – переменная типа HDC – ссылка на контекст устройства, а второй параметр – ссылка на переменнуюpfd типа TPixelFormatDescriptor. Функция ChoosePixelFormatпросматривает в контексте устройства поддерживаемые форматы пикселей и выбирает наиболее близкий к описанному в pfd. Функция  возвращает целое число – индекс формата пикселя. Вызов этой функции гарантирует, что OpenGLбудет работать сформатом пикселей, поддерживаемым устройством, на которое будет осуществляться вывод изображения.

После того как найден формат пикселей, наиболее полно совпадающий стребуемым, можно установить его в контексте отображения. До этого используют функцию:SetPixelFormat (hdc, nPixelFormat, @pfd):boolean;

Параметры функции определяют: контекст устройства hdc, для которого устанавливается формат пикселей; целочисленный индекс nPixelFormat, который получен при помощифункции ChoosePixelFormat и определяет конкретный формат пикселей из имеющегося набора форматов; указатель pfd на структуру TPixeIFormatDescriptor.

Теперь можно создать контекст воспроизведения OpenGL. Для этого используется функциярасширения WGLбиблиотеки OpenGL:wglCreateContext(hdc):HGLRC. Функция возвращает новый контекст воспроизведения (или NULL - в случае неудачи), который подходит для рисования на устройстве, определенном дескрипторомhdc. Контекст воспроизведения (в виде дескриптора) присваивается глобальной переменной hrc.Создавать можно произвольное число контекстов воспроизведения, но дляработы с графикой OpenGL, необходимо установить единственный текущий контекст воспроизведения. Это делается припомощи функцииwglMakeCurrent(hdc, hrc):boolean;.Параметр hdc, как и раньше, определяет контекст устройства,второй параметр hrc (типа HGLRC) определяет контекст воспроизведения OpenGL.Теперь инициализацию OpenGL можно считать завершенной.

Перед окончанием работы программы, использующей библиотеку OpenGL,необходимо корректно завершить работу с OpenGL. Сначала надо сделать так,чтобы текущий контекст воспроизведения OpenGL никем не использовался. Дляэтого достаточно выполнить следующий вызов:wglMakeCurrent(0,0);. Затем необходимо удалить контекст воспроизведения. Для этой цели используется функцияwglDeleteContext(hrc):boolean;.

Перечисленные действия в заготовке программы оформлены в виде следующих процедур:

- пользовательская процедура SetDCPixelFormat задает формат пикселя;

- обработчик TForm1.FormCreateсоздает текущий контекст воспроизведения;

- обработчик TForm1.FormDestroy удаляет контекст воспроизведения.

Чтобы при выполнении процедуры SetDCPixelFormat сократить время на заполнение полей структуры pfd, эти поля сначала заполняются нулями при помощи процедуры FillChar. Функция ChosePixelFormat автоматически заполняет структуру pfd так, что она соответствует некоторому формату пикселей, который поддерживается видеоплатой компьютера. При необходимости некоторые настройки формата пикселя устанавливаются с помощью флагов. В заготовке для примера установлены:

– возможность оконного вывода (PFD_DRAW_TO_WINDOW),

– поддержка функций библиотеки OpenGL (PFD_SUPPORT_OPENGL),

– возможность двойной буферизации (PFD_DOUBLEBUFFER).

Затем сформированный желаемый формат пикселей в обработчике TForm1.FormCreateустанавливается на контекст устройства. Как известно, ссылке на контекст устройства в Delphi соответствует свойство Canvas.Handle формы, поэтому при вызове процедуры SetDCPixelFormatв качестве ссылки hdc используется дескриптор окна формы Form1 –Canvas.Handle.

Обработчик TForm1.FormDestroy содержит только функцию удаления контекста воспроизведения.

Несколько комментариев к основной рисующей процедуре TForm1.FormPaint.Ее начальный фрагмент

wglMakeCurrent(Canvas.Handle, hrc);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

glOrtho(-1.0,1.0,-1.0,1.0,-1.0,1.0);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

включает следующие действия. Сначала только чторассмотренной командой расширения WGL устанавливается текущий контекст воспроизведения OpenGL. Затем выполняется установка текущих матриц. Дело в том, что OpenGL выполняет различные преобразования в матричной форме и работает с тремя видами матриц: модельно-видовыми (они описывают геометрические преобразования), проективными (они задают положение координатных систем) и текстурными (они влияют на закон наложения текстуры). Некоторые команды библиотеки, в частности, описанная в подразделе 3.4 командаglLoadIdentity, устанавливают вид различных матриц, поэтому перед выполнением таких команд нужно указывать, к какому виду матриц предполагается их применить. Указывает на это параметр команды glMatrixMode: если это строка GL_MODELVIEW, то команды применяются к модельно-видовым матрицам, если GL_PROJECTION, – к проективным, если GL_TEXTURE, – к текстурным. В приведенном фрагменте команда glLoadIdentity сначала применяется к матрице проецирования (устанавливает ее в исходное состояние), а затем – к матрице аффинных геометрических преобразований. Уже известная команда glOrtho задает положение системы координат и объема видимости сцены.

Перечисленные команды относятся к настройкам графического вывода и, как правило, применяются во всех графических программах. Далее в заготовке программы идут команды, назначение которых поясняется в соответствующих разделах учебного пособия. При необходимости они могут быть изменены или удалены.

ПРИЛОЖЕНИЕ Б. Задания по геометрическому моделированию и отображению двухмерных объектов

Задание 1. Система координат и примитивы OpenGL

Цель выполнения задания: изучить на практике отображение простых геометрических фигур в пределах нормализованного объема видимости.

Изучаемые команды

Команды инициализации: auxInitWindowPosition, auxInitWindowSize, glutInitWindowPosition, glutInitWindowSize.

Команды настройки цветов фона и изображения: glClearColor, glClear(GL_COLOR_BUFFER_BIT), glColor.

Команды рисования геометрических примитивов: glVertex, glBegin – glEnd.

Команды задания стиля вычерчивания: glLineWidth, glEnable(GL_LINE_SMOOTH), glEnable(GL_POINT_SMOOTH).

Команда задания стиля (модели) заливки примитивов: glShadeModel(GL_FLAT); .

Варианты заданий приведены в таблице Б2.1.

Таблица Б2.1

Номерварианта

Фигура

Геометрический примитив

1

Треугольник, вписанный в прямоугольник

Треугольник (GL_TRIANGLES), связанные отрезки (GL_LINE_STRIP)

2

Смежные пятиугольник и треугольник

Полигон (GL_POLYGON)

3

«Флажок» – вытянутый прямоугольник и треугольник

Четырехугольник (GL_QUADS), треугольник (GL_TRIANGLES)

4

«Флажок» – вектор и невыпуклый пятиугольник

Отрезок (GL_LINES),

полигон (GL_POLYGON)

5

«Кораблик» – трапеция и вектор

Четырехугольник (GL_QUADS), отрезок (GL_LINES)

6

«Молоток» – трапеция и вытянутый прямоугольник

Полигон (GL_POLYGON), четырехугольник (GL_QUADS)

7

«Лопата» – выпуклый пятиугольник и вытянутый прямоугольник

Полигон (GL_POLYGON), отрезок (GL_LINES)

8

«Дупель один-один» – два смежных квадрата с точками в центрах

Четырехугольник (GL_QUADS), точка (GL_POINTS),

9

Пятиугольник с двумя диагоналями

Треугольник (GL_TRIANGLES), отрезок (GL_LINES)

10

«Часы» –

квадрат, два узких прямоугольника разной длины и крупная точка в центре

Связанные отрезки (GL_LINE_STRIP), четырехугольник (GL_QUADS), точка (GL_POINTS)

11

«Домик» – смежные треугольник и квадрат

Треугольник (GL_TRIANGLES), четырехугольник (GL_QUADS)

12

Правильный шестиугольник с диагоналями и точкой большого размера в центре

Связанные треугольники – «веер» (GL_TRIANGLE_FAN),

точка (GL_POINTS)

Программа выполнения задания

  1. Спроектировать изображение, выбрав координаты вершин, которые ограничивают примитивы. Координаты х и у вершин не должны превышать ±1, координата z берется равной нулю. Выбрать размеры окна вывода. Определить цвет фона (не черный) и цвет изображения – разный для каждого фрагмента изображения.

  2. В программу-заготовку добавить команды задания окна и рисования изображения. Использовать формат команды задания вершин glVertex3f. Получить изображение заданных фигур на экране.

  3. Изменяя координаты х и у вершин в диапазоне (-5,+5), определить границы объема видимости по соответствующим координатам, а также направления координатных осей и точку их начала.

  4. Задать координату z одной из вершин равной +0.5, затем -0.5. Объяснить наблюдаемый эффект. Задать координату z одной из вершин равной +5, затем -5. Объяснить наблюдаемый эффект.

Задание 2. Расстановка объектов в сцене

Цель выполнения задания: практическое изучение средств, необходимых для выполнения сценарных преобразований.

Изучаемые команды

Команды задания геометрических преобразований объектов: glLoadIdentity, glTranslate, glRotate, glScale.

Команды работы с дисплейным списком: glNewList, glEndList, glCallList.

Команды работы со стеком: glPushMatrix, glPopMatrix.

Команды работы с буфером глубины: glEnable(GL_DEPHT_TEST), glClear(GL_DEPTH_BUFFER_BIT).

Варианты задания приведены в таблице Б2.2. В ней точками показано требуемое расположение трех объектов в поле вывода. В графе «Поворот объектов» заданы углы поворота этих объектов в плоскости экрана. Если объектов больше трех, остальные расставляются по усмотрению студента.

Таблица Б2.2

N

варианта

Расположение

объектов в сцене

Поворот объектов

N

варианта

Расположение

объектов в сцене

Поворот объектов

1

А1=150º,

А2=-70º

А3=45º

7

А1=160º,

А2=-80º

А3=60º

2

А1=170º,

А2=-90º

А3=70º

8

А1=220º,

А2=-100º

А3=-80º

3

А1=230º,

А2=-110º

А3=90º

9

А1=240º,

А2=120º

А3=-100º

4

А1=250º,

А2=-130º

А3=110º

10

А1=0º,

А2=-140º

А3=-120º

5

А1=-260º,

А2=150º

А3=-145º

11

А1=270º,

А2=-160º

А3=-10º

6

А1=280º,

А2=170º

А3=-20º

12

А1=-290º,

А2=20º

А3=-45º

Программа выполнения задания

  1. Число объектов в сцене – не менее трех. В качестве объектов сцены использовать геометрические фигуры из задания 1, которые для получения требуемого числа объектов рисуются несколько раз. Применить дисплейные списки. Спроектировать сцену, выбрав необходимые команды и их параметры. Разработать последовательность геометрических преобразований, необходимых для поворота на заданный угол а) всей сцены, б) каждого объекта сцены в отдельности. Пояснить различие. Выбрать цвета фона и фигур.

  2. В программу-заготовку ввести команды сдвига и поворота системы координат. Чтобы упростить размещение объектов в сцене, использовать стек модельно-видовых матриц. Размеры фигур, при необходимости, изменить командой масштабирования. Получить изображение сцены. Надлежащим выбором параметров команд сдвига добиться размещения объектов сцены в соответствии с заданием.

  3. Задать такие параметры команд glTranslate, glRotate, чтобы графические объекты сцены частично перекрывались. Проанализировать вид сцены с включенным и выключенным буфером глубины.

Задание 3. Текстурирование объектов

Цель выполнения задания: повышение реалистичности отображения объектов за счет наложения на их поверхность характерного узора – текстуры; изучение средств текстурирования.

Изучаемые команды

Команды подготовки текстур: glEnable(GL_TEXTURE_2D), glBindTexture, glTexImage2D, auxDIBImageLoad.

Команды наложения текстуры: glTexParameter, glTexCoord.

Задания на текстурирование предусматривают применение в сцене двух текстур: для фоновой заставки и для геометрических объектов. Текстура заставки накладывается на отдельный четырехугольный примитив и имеет тему – лесную, морскую и т.д. Фон, элементы и детальность текстуры определяются студентами самостоятельно, но исходя из темы. Фоновая текстура выполняется инструментами графического редактора и дополняется фамилиями исполнителей. Текстура для объектов сцены имеет геометрический рисунок, выполняемый инструментами растрового графического редактора. Цветовые решения текстур определяются студентами.

Варианты задания на текстурирование приведены в таблице Б2.3.

Таблица Б2.3

Номер варианта

Тема текстуры для фона

Текстура для объектов

1

Осенняя

Поле с треугольниками

2

Космическая

Поле с ломаной линией

3

Зимняя

Поле с разноцветными эллипсами

4

«Техническая»

Концентрические пятиугольники

5

Праздничная

«Пляшущие человечки»

6

Медицинская

Поле с разноцветными трапециями

7

«Вулканическая»

Знаки зодиака

8

Транспортная

Разноцветные синусоиды

9

Компьютерная

Параллельные полосы разной ширины и цвета

10

Музыкальная

Разноцветные треугольные флажки

11

Библиотечная

Треугольник, вписанный в окружность

12

Военная

Векторы, выходящие из одной точки («пауки»)

Программа выполнения задания

1. Спроектировать сцену, используя объекты задания 2 и добавив общую заставку. Изготовить текстуры средствами растрового графического редактора. Размеры текстур выбрать кратными степени числа 2. Текстуры сохранить в формате bmp.

2. В программу-заготовку ввести команды подготовки и наложения текстур на объекты сцены. В программах на C-подобных языках использовать команды расширения GLAUX, в программах на Delphi (ObjectPascal) – свободно распространяемый модуль ВМР.pas.

Для использования модуля ВМР его необходимо присоединить к программе в разделе uses. Загрузка текстуры осуществляется с помощью вызова процедуры

LoadTexture (‘<имя>.bmp’, TexName); ,

где <имя> – имя bmp-файла текстуры, а TexName (типа GLuint) – имя текстурного объекта. Нужно обратить внимание на то, что имя и расширение текстурного файла заключаются в апострофы. После загрузки наложение текстуры на графический объект выполняется обычным образом (glTexCoord).

3. Для лучшего восприятия текстурированных объектов их цвет перед наложением текстур нужно сделать белым (задать единичные значения R-G-B-компонентам в команде glColor).

4. Получить изображение сцены с текстурированными объектами.

5. Изменить расположение текстуры на примитиве, повернув ее на заданный угол.

СПИСОК ЛИТЕРАТУРЫ

  1. Эйнджел Э. Интерактивная компьютерная графика. Вводный курс на базе OpenGL, 2-е издание: Пер. с англ. – М.: Издательский дом «Вильямс», 2001. – 590 с.

  2. Краснов М.В.Open GL в проектах Delphi. – СПб.: BHV-Санкт-Петербург, 2002. – 352 с.

  3. Херн Д., Бейкер М.П. Компьютерная графика и стандарт OpenGL, 3-е издание: Пер. с англ. – М.: Издательский дом «Вильямс», 2005. – 1168 с.

  4. Ву М., Девис Т., Нейдер Дж., Шрайнер Д. OpenGL. Руководство по программированию. Библиотека программиста. 4-е издание. – СПб.: Питер, 2006. – 624 с.

  5. Баяковский Ю.М., Игнатенко А.В. Начальный курс OpenGL. – М.: «Планета знаний», 2007. – 221 с.

  6. Сайт «OpenGL. Программирование с использованием OpenGL». – Доступно из URL: http://www.opengl.org.ru/