Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

675

.pdf
Скачиваний:
1
Добавлен:
06.12.2022
Размер:
4.11 Mб
Скачать

Возвращать систему координат после завершения преобразований целесообразно, чтобы легче было проектировать последующие преобразования. Это также необходимо делать, если:

все преобразования связаны с событием OnPaint, чтобы, например, изменение размеров окна не приводило бы объекты сцены в движение друг относительно друга;

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

Рис. 7. Преобразования координат

В общем случае матричные преобразования в OpenGL нужно записывать в обратном порядке, поскольку матрица текущего преобразования умножается справа на матрицу нового преобразования. Например, если нужно сначала повернуть объект, а затем передвинуть его, сначала нужно вызвать glTranslate(), потом — glRotate(), а после этого определять сам объект. Тогда матрица полного преобразования будет:

M= MTranslateMRotate.

Рассмотрим пример поворота полигона вокруг произвольной точки[2], которая каждый разменяет свое положение. Всеточки фигур задаются в исходных координатах, а расположение их на сцене — матрицами преобразования (табл. 6).

3 1

 

Таблица 6

 

 

glTranslatef (0.4, 0.1, 0.0);

Задание матрицы переноса

glEnable (GL_POINT_SMOOTH);

Задание режима сглаживания точки

 

 

For i := 0 to 5 do begin

Рисуем шесть полигонов с точками внутри

glBegin (GL_POINTS);

Рисуем точки

glVertex2f (0.0, 0.0);

Задаем исходные координаты точки, которые

glEnd;

умножаются на матрицу переноса

 

автоматически

glTranslatef (-0.3, 0.3, 0.0);

Задаем матрицы поворота и переноса, которые

glRotatef (60, 0, 0, 1);

записываются в порядке, обратном реальному

 

действию. Поворот на плоскости производится

 

вокруг оси, перпендикулярной этой плоскости (в

 

данном случае – вокруг оси Z). Фактически

 

формируется текущая матрица преобразования

 

путем перемножения двух матриц переноса и

 

одной матрицы поворота

glBegin (GL_POLYGON);

Рисуем полигон

glVertex2f (-0.125, -0.125);

Определяем вершины полигона в исходных

glVertex2f (-0.125, 0.125);

координатах, которые автоматически

glVertex2f (0.125, 0.125);

умножаются на текущую матрицу

glVertex2f (0.125, -0.125);

преобразования

glEnd;

 

end;

Завершаем цикл рисования полигонов

glTranslatef (-0.4, -0.1, 0.0);

Возвращаем систему координат в исходное

 

положение

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

Перед началом преобразований текущую матрицу преобразования запоминают функциейglPushMatrix, а затемвосстанавливаютфункциейglPopMatrix.Этифункцииоперируютсостеком, что позволяет последовательно запоминать (проталкивать) и восстанавливать (выталкивать) несколько состояний матрицы преобразования.

Тогда предыдущий пример можно переписать так [2]:

For i := 0 to 5 do begin glPushMatrix;

glTranslatef (-0.7 * cos (Pi * i / 3), 0.7 * sin (Pi * i / 3), 0.0); glRotatef (-60 * i, 0, 0, 1);

3 2

glBegin (GL_POLYGON); glVertex2f (-0.25, -0.25); glVertex2f (-0.25, 0.25); glVertex2f (0.25, 0.25); glVertex2f (0.25, -0.25);

glEnd;

glPopMatrix;

Еще один прием сокращения вычислений — использование единичной матрицы преобразований. Вызов функции glLoadIdentity()приводиткзаменетекущейматрицы наединичную, т.е. к сбросу всех предыдущих состояний матрицы преобразования.

Варианты заданий

Написать программу анимирования сложных фигур (рис. 8). Во всех вариантах фигура вписывается в окно формы, имеющее координаты нижнего левого угла [–1; –1] и верхнего правого — [1; 1]. Форма должна иметь переключатель режимов отображения полигонов (с заливкой, контуром или угловыми точками), а также элементы управления цветовой заливкой (в том числе — различными цветами в вершинах). В контурном режиме должна быть возможность просмотра контура всей фигуры и отдельных составляющих. Должна быть возможность управления направлением и скоростью движения.

Контрольные вопросы

1.Какие системы координат используются в OpenGL?

2.Перечислите виды матричных преобразований в OpenGL. Каким образомпроисходят преобразования объектоввOpenGL?

3.Какая последовательность вызовов команд glTranslate(), glRotate()соответствует переносу по горизонталина 20 единиц и повороту на 90°?

4.Чтотакое видовые координаты?Нормализованные координаты?

5.ОпишитеназначениефункцийglLoadIdentity(),glPushMatrix

иglPopMatrix.

3 3

3 4

3 5

6 3

Рис. 8. Варианты заданий Примечания. 1. При выполнении заданий целесообразно геометрию всех элементов сцены описывать в отдельных

процедурах.

2. При необходимости сначала следует записать формулы для расчета координат.

Литература

1.OpenGL. Официальное руководство программиста / М. Ву, Дж. Нейдер, Т. Девис, Д. Шрайнер. СПб., 2002. 592 с.

2.Краснов М. OpenGL. Графика в проектах Delphi. СПб., 2001. 352 с.

3.Тихомиров Ю. OpenGL. Программирование трехмерной графики. СПб., 2002. 304 с.

4.Райт Р., Липчак Б. OpenGL. Суперкнига, 3-е изд. М., 2006. 1040 с.

3 7

Оглавление

 

Введение................................................................................................................................................

3

Требования к выполнению лабораторных работ...........................................................................

4

Лабораторная работа № 1. Начало работы. Примитивы «ТОЧКА» и «ОТРЕЗОК» ...............

6

Лабораторная работа № 2. Построение сложных фигур с использованием полигонов

 

(треугольников, четырехугольников и многоугольников) .................................................

22

Лабораторная работа № 3. Геометрические преобразования на плоскости .........................

28

Литература ...................................................................................................

37

3 8

Учебное издание

Соловьев Леонид Юрьевич Субботина-Чукальская Ольга Валентиновна

ГЕОМЕТРИЧЕСКИЕ ПОСТРОЕНИЯ НА ПЛОСКОСТИ СРЕДСТВАМИ OPENGL

Методические указания

Редактор И.В. Васильева

Компьютерная верстка Ю.В. Борцова

Изд. лиц. ЛР № 021277 от 06.04.98. Подписано в печать 17.11.08.

2,6 печ. л.

2,5 уч.-изд. л.

Тираж 100 экз.

Заказ № 1933

 

 

ИздательствоСибирскогогосударственногоуниверситетапутейсообщения 630049Новосибирск,ул.Д.Ковальчук,191

Тел./факс:(383)328-03-81.Е-mail:press@stu.ru

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]