float uy = (p2.y - pl.y) / axisVectLength;
float uz = (p2.z - pl.z) / axisVectLength;
/* Задается матрица трансляции для перемещения pi
* в начало координат, и выполняется свертка матрицы
* трансляции с matComposite.
*/
translate3D (-pl.x, -pl.y, -pl.z);
/* Матрица matQuatRot инициализируется как единичная. */ matrix4x4SetIdentity (matQuatRot);
matQuatRot [0][0] = ux*ux*oneC + cosA;
matQuatRot [0] [1] = ux*uy*oneC - uz*sinA;
matQuatRot [0][2] = ux*uz*oneC + uy*sinA;
matQuatRot [1][0] = uy*ux*oneC + uz*sinA;
matQuatRot [1][1] = uy*uy*oneC + cosA;
matQuatRot [1]E2] = uy*uz*oneC - ux*sinA;
matQuatRot [2][0] = uz*ux*oneC - uy*sinA;
matQuatRot [2][1] = uz*uy*oneC + ux*sinA;
matQuatRot [2][2] = uz*uz*oneC + cosA;
/* Выполняется свертка матрицы matQuatRot со сложной матрицей. */ matrix4x4PreMultiply (matQuatRot, matComposite);
/* Строится матрица обратной трансляции для точки pi, и
* выполняется ее свертка со сложной матрицей.
*/
translate3D (pl.x, pl.y, pl.z);
}
/* Процедура генерации матрицы трехмерного масштабирования. */ void scale3D (Gfloat sx, GLfloat sy, GLfloat sz, wcPt3D fixedPt) {
Matrix4x4 matScale3D;
/* Матрица масштабирования инициализируется
* как единичная.
*/
matrix4x4SetIdentity (matScale3D); matScale3D [0][0] = sx;
matScale3D [0][3] = (1 - sx) * fixedPt.x;
matScale3D [1][1] = sy;
matScale3D [1][3] = (1 - sy) * fixedPt.y;
matScale3D [2] [2] = sz;
matScale3D [2][3] = (1 - sz) * fixedPt.z;
/* Выполняется свертка матрицы matScale3D со сложной
* матрицей.
*/
matrix4x4PreMultiply (matScale3D, matComposite);
}
void displayFcn (void)