675
.pdfВозвращать систему координат после завершения преобразований целесообразно, чтобы легче было проектировать последующие преобразования. Это также необходимо делать, если:
—все преобразования связаны с событием 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