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

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

< Лекция 5 || Лекция 6: 123456 || Лекция 7 >

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

Проекционные преобразования определяются матрицей проекции и выполняются после видовых преобразований ( рис. 5.3).

Матрица проекции выполняет несколько функций:

  1. Ограничивает область видимости объемной сцены. Для этого в командах Ortho и Frustum в качестве параметров передаются три пары координат для трех осей координат. С ограничением области вывода неразрывно связана операция усечения координат. Результатом этого преобразования является преобразование координат вершин видимой области сцены для каждой из осей координат, таким образом, чтобы они находились в интервале от –1 до 1.
  2. Определяет перспективные преобразования.
  3. Выполняет преобразование мировой (правосторонней) системы координат ( рис. 5.1) в видовую (левостороннюю) систему координат ( рис. 5.2). Преобразование заключается в изменении направления оси OZ на противоположное.

Результатом умножения видовых координат вершин на матрицу проекций является получение усеченных координат вершин видимой области, лежащих в интервале от -1 до 1 для каждой из осей координат.

Параллельная проекция

Для формирования матрицы параллельной проекции используется команда

Ortho(l, r, b, t, n, f: GLdouble)

Команда имеет шесть параметров. Каждая пара параметров определяет координаты границ области видимости для каждой из осей координат:

l, r – левая и правая границы области видимости вдоль оси OX;

b, t – нижняя и верхняя границы области видимости вдоль оси OY;

n, f – ближняя и дальняя границы области видимости вдоль оси OZ.

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

Команда Ortho формирует матрицу:

P=\begin{pmatrix}\frac{2}{r-l} & 0 & 0 & -\frac{r+l}{r-l}\\0 & \frac{2}{t-b} & 0 & -\frac{t+b}{t-b}\\0 & 0 & -\frac{2}{f-n} & -\frac{f+n}{f-n}\\ 0& 0 & 0 &1\end{pmatrix}

Диагональные элементы матрицы \text{2/(r-l), 2/(t-b) и –2/(f-n)} выполняют усечение каждой из осей координат в соответствии с границами области видимости, определяемой командой Ortho. В результате координаты видимой области находятся в интервале [-1;1] для каждой из осей. Поэтому диагональные элементы имеют вид дроби с числом 2 в качестве числителя (длина области видимости в усеченных координатах) и знаменателя, который равен длине области видимости в мировых координатах.

Элемент –2/(f-n) в третьем столбце матрицы имеет отрицательный знак для изменения направления оси OZ на противоположное, и преобразует мировую систему координат в видовую.

Элементы матрицы четвертого столбца переносят изображение в центр системы координат с учётом усечения координат.

Центр сцены для параллельной проекции имеет координаты:

x = (r-l)/2\\y = (t-b)/2\\z =–(f-n)/2

Формируемая командой Ortho матрица (P) умножается на текущую матрицу (M), результирующая матрица (M’) заменяет текущую матрицу:

M’ = P*M

Перспективная проекция

Для задания центральной перспективной проекции в OpenGL используется команда Frustum:

Frustum (l, r, b, t, n, f: GLdouble);

Команда Frustum имеет шесть параметров, которые определяют граничные координаты области видимости:

  • l, r – левая и правая границы области видимости вдоль оси OX;
  • b, t – нижняя и верхняя границы области видимости вдоль оси OY;
  • n, f – ближняя и дальняя границы области видимости вдоль оси OZ.

Ближняя граница оси OZ (параметр n) так же определяет положение плоскости проекции, которая располагается перпендикулярно оси OZ.

Точка наблюдения находится в начале координат. Видимый объем представляет собой усеченную пирамиду, проекция видимой области формируется на плоскости усечения, перпендикулярной оси OZ. Значения l, r, b, t задаются для ближней к наблюдателю плоскости отсечения. Значения n и f должны быть положительными.

Команда Frustum формирует матрицу (P):

P=\begin{pmatrix}\frac{2n}{r-l} & 0 & \frac{r+l}{r-l} & 0\\0 & \frac{2n}{t-b} & \frac{t+b}{t-b} & 0\\0 & 0 & -\frac{f+n}{f-n}&-\frac{2fn}{f-n}  \\ 0& 0 & -1 &0\end{pmatrix}

При выполнении команды Frustum матрица перспективной проекции (P) умножается на текущую матрицу (M), и результирующая матрица (M’) замещает текущую матрицу:

M’ = P*M

Центр сцены имеет координаты:

x = f*(r+l)/(f+n)\\
y = f*(t+b)/ (f+n)\\
z =–(2*f*n)/ (f+n)\\

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

Эффект перспективы зависит от расстояния ближней плоскости до наблюдателя. Чем ближе плоскость проекции расположена к точке наблюдения, тем больше эффект перспективы.

Определение области вывода

На последнем этапе координатных преобразований вычисляются координаты области вывода. Координаты области вывода определяются с помощью команды:

Viewport (x,y: GLint; w, h: GLsizei);

Команда имеет четыре параметра:

  • x, y – координаты верхнего левого угла области вывода;
  • w, h – ширина и высота области вывода.

Оконные координаты проекции вычисляются как

P=\begin{pmatrix}x_w\\z_w\\z_w\\\end{pmatrix}=\begin{pmatrix}(w/2)x_d+o_x\\(h/2)y_d+o_y\\((f-n)/2)z_d+o\end{pmatrix}

где o_x,o_yкоординаты центра области вывода изображения:

 ox=x+w/2;\\ oy=y+h/2;\\
x_d,y_d,z_d – декартовые\ координаты\ вершины.
< Лекция 5 || Лекция 6: 123456 || Лекция 7 >
Владислав Нагорный
Владислав Нагорный

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

Спасибо!

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

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

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

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