Опубликован: 02.12.2011 | Доступ: свободный | Студентов: 980 / 117 | Оценка: 5.00 / 4.00 | Длительность: 09:26:00
Специальности: Программист
Теги: .net, open source, opengl
Лекция 6:

Координатные преобразования в OpenGL

< Лекция 5 || Лекция 6: 123456 || Лекция 7 >
Аннотация: В лекции рассматриваются видовые и перспективные преобразования, выполняемые библиотекой OpenGL при создании изображений.

Цель лекции: Изучить команды видовых и перспективных преобразований библиотеки OpenGL и их реализацию в Object Pascal и в C# с использованием библиотеки OpenTK.

Примеры на C# (WinForms) и Object Pascal (Delphi)

Пример № 5.1 Пример демонстрирует координатные преобразования.

Пример № 5.2 Пример демонстрирует формирование изображения цилиндра без освещения с использованием четырехугольников с общими гранями.

Системы координат OpenGL

Задание координат примитивов в OpenGL выполняется в мировой (правосторонней) системе координат, в которой ось OZ направлена на наблюдателя ( рис. 5.1).

Правосторонняя система координат (мировая)

Рис. 5.1. Правосторонняя система координат (мировая)
Левосторонняя система координат (видовая)

Рис. 5.2. Левосторонняя система координат (видовая)

Единичный масштаб в системе координат может быть выбран произвольно. Единица масштаба может, например, соответствовать 1 м, 1 км или 1 нм. Это позволяет использовать OpenGL с одинаковой легкостью для изображения как макрообъектов, так и объектов микромира.

Для построения проекции используется левосторонняя система координат (видовая), в которой ось OZ направлена от наблюдателя ( рис. 5.2). Преобразование одной системы координат в другую библиотека выполняет с помощью матрицы проекции.

Однородные координаты

Для задания координат объектов в OpenGL используются однородные координаты. Это позволяет представлять различные преобразования в виде квадратных матриц размером 4*4, а сложные преобразования представлять в виде произведения матриц, реализующих более простые преобразования.

В OpenGL для представления координат вершин используется вектор-столбец. Все матрицы библиотеки, используемые в библиотеке OpenGL, являются вертикальными:

 \left( \begin{array}{cccc}
a_1&a_5 &a_9 &a_{13} \\
a_2 & a_6 & a_{10} & a_{14}\\
a_3 & a_7 & a_{11}& a_{15}\\
a_4 & a_8 & a_{12}& a_{16}\\\end{array} \right)

Схема координатных преобразований

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

Последовательность координатных преобразований OpenGL

Рис. 5.3. Последовательность координатных преобразований OpenGL

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

Значения матриц хранятся внутри библиотеки. OpenGL предоставляет набор команд для операций над ними. Ниже более подробно описан каждый из этапов координатных преобразований.

Видовые преобразования

Входными данными для этого этапа являются координаты примитивов, задаваемые с помощью команды Vertex и её аналогов (например, команды Rect). Координаты вершин примитивов умножаются на текущую видовую матрицу. Результатом умножения являются видовые координаты вершин:

\begin{pmatrix}x_e\\y_e\\z_e\\w_e\\\end{pmatrix}=M\begin{pmatrix}x_0\\y_0\\z_0\\w_0\\\end{pmatrix}

Обычно видовая матрица используется для таких преобразований как перенос, масштабирование и поворот. Для выполнения этих операций библиотека реализует команды Translate, Scale, Rotate. Каждая из этих команд формирует матрицу, осуществляющую соответствующее преобразование, и умножает её на текущую матрицу. Если M – текущая видовая матрица, T – матрица преобразования, то результирующая матрица M’, которая заменит текущую матрицу, будет получена в результате операции:

M’ = M * T

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

Перспективные преобразования

На этом этапе координатных преобразований видовые координаты вершин (полученные на предыдущем этапе вычислений) умножаются на матрицу проекций P.

\begin{pmatrix}x_c\\y_c\\z_c\\w_c\\\end{pmatrix}=P\begin{pmatrix}x_e\\y_e\\z_e\\w_e\\\end{pmatrix}

В библиотеке реализованы две команды для формирования наиболее часто используемых проекций: команда Ortho - для формирования матрицы параллельной проекции и команда Frustum – для получения матрицы центральной перспективной проекции.

При выполнении этих команд определяется область видимости трехмерной сцены. Матрица проекции, кроме выполнения проекционных преобразований, также выполняет масштабирование координат видимой области к интервалу [-1,1] для каждой из осей координат. Преобразованные таким образом координаты вершин называются усечёнными координатами.

Деление перспективы

На третьем этапе выполняется преобразование нормализованных координат вершин к декартовым координатам, путем деления каждой из первых трех координат на четвёртую:

\begin{pmatrix}x_d\\y_d\\z_d\end{pmatrix}=\begin{pmatrix}x_c/w_c\\y_c/w_c\\z_c/w_c\end{pmatrix}

В терминах OpenGL это преобразование носит название "деление перспективы". Результатом выполнения этого преобразования является получение декартовых координат вершин.

< Лекция 5 || Лекция 6: 123456 || Лекция 7 >
Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!

Лариса Парфенова
Лариса Парфенова

1) Можно ли экстерном получить второе высшее образование "Программная инженерия" ?

2) Трудоустраиваете ли Вы выпускников?

3) Можно ли с Вашим дипломом поступить в аспирантуру?