Перспективная проекция
Предположим, например, что текущая (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.