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


Перспективная проекция - часть 3


Предположим, например, что текущая (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., l., 0.);. Аналогичный вызов glRotated (gdAngleX, 1., 0., 0.); вращает все точки примитивов вокруг оси X:

void _stdcall OnDraw()

{

glClear(GL_COLOR_BOFFER_BIT I GL_DEPTH_BUFFER_BIT);

//== Будем пользоваться услугами матрицы моделирования glMatrixMode <GL_MODELVIEW);

glLoadldentity ();

//=== Задаем смещение координат точек будущих примитивов glTranslated(gdTransX, gdTransY, gdTransZ);

//===Задаем вращение координат точек будущих примитивов

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

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

//====== Координаты точек куба (центр его в нуле)



Начало  Назад  Вперед