Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки? Спасибо! |
Координатные преобразования в OpenGL
Проекционные преобразования
Проекционные преобразования определяются матрицей проекции и выполняются после видовых преобразований ( рис. 5.3).
Матрица проекции выполняет несколько функций:
- Ограничивает область видимости объемной сцены. Для этого в командах Ortho и Frustum в качестве параметров передаются три пары координат для трех осей координат. С ограничением области вывода неразрывно связана операция усечения координат. Результатом этого преобразования является преобразование координат вершин видимой области сцены для каждой из осей координат, таким образом, чтобы они находились в интервале от –1 до 1.
- Определяет перспективные преобразования.
- Выполняет преобразование мировой (правосторонней) системы координат ( рис. 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}](/sites/default/files/tex_cache/e82cd7548275f9aef1877aaea351a356.png)
Диагональные элементы матрицы выполняют усечение каждой из осей координат в соответствии с границами области видимости, определяемой командой Ortho. В результате координаты видимой области находятся в интервале [-1;1] для каждой из осей. Поэтому диагональные элементы имеют вид дроби с числом 2 в качестве числителя (длина области видимости в усеченных координатах) и знаменателя, который равен длине области видимости в мировых координатах.
Элемент в третьем столбце матрицы имеет отрицательный знак для изменения направления оси OZ на противоположное, и преобразует мировую систему координат в видовую.
Элементы матрицы четвертого столбца переносят изображение в центр системы координат с учётом усечения координат.
Центр сцены для параллельной проекции имеет координаты:
![x = (r-l)/2\\y = (t-b)/2\\z =–(f-n)/2](/sites/default/files/tex_cache/5aba84c50918587e0accb5bc7b262a50.png)
Формируемая командой Ortho матрица () умножается на текущую матрицу (M
результирующая матрица (
) заменяет текущую матрицу:
![M’ = P*M](/sites/default/files/tex_cache/6f1f29d830b44ff4b95e1d7ae018bd6e.png)
Перспективная проекция
Для задания центральной перспективной проекции в 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=\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}](/sites/default/files/tex_cache/5ad6c65384f71fc5c99937445acd86e3.png)
При выполнении команды Frustum матрица перспективной проекции () умножается на текущую матрицу (
), и результирующая матрица (
) замещает текущую матрицу:
![M’ = P*M](/sites/default/files/tex_cache/6f1f29d830b44ff4b95e1d7ae018bd6e.png)
Центр сцены имеет координаты:
![x = f*(r+l)/(f+n)\\
y = f*(t+b)/ (f+n)\\
z =–(2*f*n)/ (f+n)\\](/sites/default/files/tex_cache/cce8be0be4a3b77ec848fd0aa0f1c64a.png)
После умножения на матрицу проекции координаты вершин будут в интервале [-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}](/sites/default/files/tex_cache/5617e49e458181228b328a1e6652c8a6.png)
где – координаты центра области вывода изображения:
![ox=x+w/2;\\ oy=y+h/2;\\
x_d,y_d,z_d – декартовые\ координаты\ вершины.](/sites/default/files/tex_cache/2fa424fa6f4e44666a7e006dcf87f922.png)