ПРЕОБРАЗОВАНИЕ КООРДИНАТ

Любое графическое приложение в конечном итоге преобразует координаты вершин графического объекта в оконные координаты графического устройства. В OpenGL это преобразование проходит за несколько основных этапов:

  • 1. Модельно-видовое преобразование.
  • 2. Преобразование проекции и нормализация.
  • 3. Преобразование к области вывода.

Матричные операции

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

Все преобразования координат в OpenGL происходят на уровне матричных операций. Все матрицы имеют размер 4x4 и участвуют в преобразовании координат по следующему правилу:

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

Определение текущей матрицы преобразований осуществляется командой: void glMatrixMode (GLenum mode), где mode принимает значение констант согласно таблицы.

Mode

GL_MODELVIEW

GL_PROJECTION

GL.TEXTURE

Вид матрицы Модельно-видовая Проекции Текстуры

Внимание} Умножение координат объекта на текущую матрицу происходит в момент вызова соответствующей команды OpenGL, определяющей координату.

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

void glLoadMatrix [f d] (GLtype *m)

Например, для формирования единичной матрицы можно воспользоваться следующим кодом

GLfloat mid [4] [4] = {l.Of, O.f, O.Of, O.Of,

O.Of, l.Of, O.Of, O.Of,

O.Of, O.Of, l.Of, O.Of, O.Of, O.Of, O.Of, l.Of};

glLoadMatrixf(&mId[0][0]);

Внимание} В массив матрица записывается по столбцам.

Кстати, такой вид записи матрицы в программе хорошо согласуется с общепринятым подходом в компьютерной графике, когда точка в пространстве задается вектором-строкой. В этом случае при любом преобразовании вектор-строка умножается на матрицу преобразования, что требует изменения расстановки элементов в матрице (строки меняются местами со столбцами). Например, для задачи одновременного увеличения масштаба геометрического объекта по оси у в 2 раза и смещении его точек по оси х на 3 единицы, по оси г на 4 единицы достаточно сформировать массив в виде

GLfloat mST[4][4] = {l.Of, O.f, O.Of, O.Of,

O.Of, 2.0f, O.Of, O.Of,

O.Of, O.Of, l.Of, O.Of, 3.0f, O.Of, 4.0f, l.Of};

и передать его в текущую матрицу преобразования glLoadMatrixf(&mST[0] [0]);

Внимание'. Примите этот дополнительный пример, как рекомендацию к использованию на практике для написания высокоэффективного кода графической программы.

Единичная матрица часто используется в OpenGL и для облегчения программирования предусмотрена команда glLoadldentyO, которая устанавливает единичную матрицу текущего преобразования.

Иногда приходится умножать текущую матрицу на другую матрицу. Для этой цели используется команда void glMultMatrix [f d] (GLtype */n), где параметр m задет матрицу размером 4x4, на которую будет умножаться текущая матрица.

Состояние матриц преобразования можно сохранять и вызывать по мере надобности. Для это существуют команды:

void glPushMatrix (void)

void glPopMatrix (void)

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

 
Посмотреть оригинал
< Пред   СОДЕРЖАНИЕ   ОРИГИНАЛ   След >