ПРОГРАМИРУЕМ 3D ГРАФИКУ ИСПОЛЬЗУЯ DirectX



Преобразования - часть 2


Теперь давайте попробуем применить полученные знания на практике и воспользуемся объектом C3dMatrix, содержащим массив вещественных величин 4х4, для переноса вектора. Чтобы вы получше представляли себе класс C3dMatrix, привожу исходный текст его конструктора:

C3dMatrix::C3dMatrix()

{

т_00=1.0; т_01°0.0; т_02=0.0; т_03=0.0;

т_10=0.0; т_11=1.0; т_12=0.0; т_13=0.0;

т_20=0.0; т_21=0.0; т_22=1.0; т_23=0.0;

т_30=0.0; т_31=0.0; т_32=0.0; т_33=1.0;

}

В исходном состоянии, задаваемом в конструкторе, эта матрица является матрицей идентичного преобразования, или единичной матрицей. Если умножить вектор на такую матрицу, он не изменится. Приведенный ниже фрагмент, использующий объект C3dMatrix, осуществляет перенос вектора х, у, z со смещениями координат dx, dy, dz:

C3dVector v (х, у, z) ;

C3dMatrix т;

т.Translate(dx, dy, dz);

v = т * v;

Объект C3dVector инициализируется элементами исходного вектора. Затем, после конструирования объекта C3dMatrix (который в первоначальном состоянии совпадает с матрицей идентичного преобразования), вызывается его функция

/b>

Глава 5. Поеобоазования

Translate для занесения в матрицу преобразования переноса. Наконец, вектор умножается на матрицу, и результат присваивается исходному вектору.

Не следует полагать, будто функция C3dMatrix: translate просто инициализирует матрицу; как нетрудно убедиться по приведенному ниже фрагменту, на самом деле она комбинирует преобразование переноса с любыми преобразованиями, уже занесенными в матрицу:

void C3dMatrix::Translate(double dx, double dy, double dz)

{

C3dMatrix tx( 1, О, О, О,

О, 1, О, О, О, 0, 1, О, dx, dy, dz,l);

*this *= tx;

Временная матрица инициализируется элементами для преобразования переноса. Затем текущая матрица умножается на временную матрицу переноса, а результат снова присваивается текущей матрице.

Пользуясь различными функциями класса C3dMatrix, можно комбинировать в одной матрице сразу несколько преобразований и затем применять их к нужному количеству векторов. Удобно также создать отдельные объекты C3dMatrix, каждый из которых соответствует отдельному преобразованию, и просто перемножить их для получения итогового преобразования:




Содержание  Назад  Вперед