Иллюстрированный самоучитель по Visual Studio .NET

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

Предположим, например, что текущая (current) матрица С размерностью 4x4 равна единичной С = 1 и поступает команда glTranslated (dx, dy, dz);. Эта команда создает матрицу сдвига Т и умножает ее справа на текущую (единичную) матрицу (С = I*Т). Затем она вновь записывает результат в текущую матрицу С.

Теперь текущая матрица приняла вид:

  1 0 0 dx  
C= 0 1 0 dy  
  0 0 1 dz  
  0 0 0 1  

Если после этого дать команду glVertexSd (x, у, z); то координаты точки (х, у, z) преобразуются по правилам умножения матрицы на вектор:

1 0 0|| dx || x|     |x +dx|
0 1 0|| dy || y| =   |y +dy|
0 0 1|| dz || z|     |z +dz|
0 0 0|| 1 || 1|     |1  

Примечание
Вы должны помнить, что вершины всех примитивов в OpenGL заданы 4-компонентным вектором (х, у, z, w). По умолчанию нормирующий компонент w-1. При работе с двухмерными изображениями мы для всех вершин задаем координату z = 0. Обратите внимание на то, как четвертый компонент w помогает производить преобразования, в нашем случае сдвиг, а команда glTranslate* учитывает координаты сдвигов вдоль трех пространственных осей (dx, dy, dz)
.

Команды вращения glRotate* и растяжения-сжатия glScale* действуют сходным образом. В функции onDraw, приведенной ниже, начальный поворот и последующие вращения вокруг оси Y осуществляются вызовом:

glRotated (gdAngleY, 0., 1., 0.);.

Аналогичный вызов:

glRotated (gdAngleX, 1., 0., 0.);

Вращает все точки примитивов вокруг оси X.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.