OpenGL. Компьютерная графика. Васильев С.А. - 27 стр.

UptoLike

Составители: 

29
1
Z
Y
X
=
151173
141062
13951
12840
mmmm
mmmm
mmmm
mmmm
1
z
y
x
В OPENGL ВСЕ ОПЕРАЦИИ ПРЕОБРАЗОВАНИЙ ОСУЩЕСТВЛЯЮТСЯ С ТЕКУЩЕЙ
МАТРИЦЕЙ. ПРИ ЭТОМ, РАЗЛИЧАЮТ ТРИ ВИДА МАТРИЦ: МОДЕЛЬНО-ВИДОВАЯ, МАТ-
РИЦА ПРОЕКЦИИ И МАТРИЦА ТЕКСТУРЫ. МОДЕЛЬНО-ВИДОВАЯ МАТРИЦА УЧАСТВУЕТ
В ПРЕОБРАЗОВАНИЯХ КООРДИНАТ ОБЪЕКТОВ В МИРОВОЙ СИСТЕМЕ КООРДИНАТ, А
ИМЕННО, ПЕРЕМЕЩЕНИИ, МАСШТАБИРОВАНИИ И ПОВОРОТАХ. СПОСОБ ПРОЕКЦИИ
ГРАФИЧЕСКИХ ОБЪЕКТОВ НА ПЛОСКОСТЬ ЭКРАНА ОПРЕДЕЛЯЕТ МАТРИЦА ПРОЕЦИ-
РОВАНИЯ. СВЯЗЬ КООРДИНАТ ТОЧЕК ИЗОБРАЖЕНИЯ ТЕКСТУРЫ С КООРДИНАТАМИ
ТОЧЕК ПОВЕРХНОСТИ ГРАФИЧЕСКОГО ОБЪЕКТА ОПРЕДЕЛЯЕТ МАТРИЦА ТЕКСТУР.
ОПРЕДЕЛЕНИЕ ТЕКУЩЕЙ МАТРИЦЫ ПРЕОБРАЗОВАНИЙ ОСУЩЕСТВЛЯЕТСЯ КО-
МАНДОЙ: VOID GLMATRIXMODE (GLENUM MODE), ГДЕ MODE ПРИНИМАЕТ ЗНАЧЕНИЕ
КОНСТАНТ СОГЛАСНО ТАБЛИЦЫ.
Mode
Вид матрицы
GL_MODELVI
EW
Модельно-
видовая
GL_PROJECTI
ON
Проекции
GL_TEXTURE
Текстуры
Внимание! Умножение координат объекта на текущую матрицу происходит в момент вызова соот-
ветствующей команды OpenGL, определяющей координату.
Для заполнения текущей матрицы преобразований соответствующими значениями предназначена
специальная команда:
void glLoadMatrix[f d] (GLtype *m)
Например, для формирования единичной матрицы можно воспользоваться следующим кодом
GLfloat mId[4][4] = { 1.0f, 0.f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f};
glLoadMatrixf(&mId[0][0]);
Внимание! В массив матрица записывается по столбцам.
Кстати, такой вид записи матрицы в программе хорошо согласуется с общепринятым подходом в
компьютерной графике, когда точка в пространстве задается вектором строкой. В этом случае при лю-
бом преобразовании вектор-строка умножается на матрицу преобразования, что требует изменения рас-
становки элементов в матрице (строки меняются местами со столбцами). Например, для задачи одновре-
менного увеличения масштаба геометрического объекта по оси y в 2 раза и смещении его точек по оси x
на 3 единицы, по оси z на 4 единицы достаточно сформировать массив в виде
GLfloat mST[4][4] = { 1.0f, 0.f, 0.0f, 0.0f,
0.0f, 2.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f,
3.0f, 0.0f, 4.0f, 1.0f};
и передать его в текущую матрицу преобразования
glLoadMatrixf(&mST[0][0]);
Внимание! Примите этот дополнительный пример, как рекомендацию к использованию на практи-
ке для написания высокоэффективного кода графической программы.
Единичная матрица часто используется в OpenGL и для облегчения программирования предусмот-
рена команда glLoadIdenty(), которая устанавливает единичную матрицу текущего преобразования.
Иногда приходится умножать текущую матрицу на другую матрицу. Для этой цели используется
команда void glMultMatrix[f d] (GLtype *m), где параметр m задет матрицу размером 4×4, на которую
будет умножаться текущая матрица.