glMatrixMode (GL_MODELVIEW); glColor3f (0.0, 0.0, 1.0);
/* Текущий цвет устанавливается синим. */
glRecti (50, 100, 200, 150);
/* Отображается синий прямоугольник. */
glPushMatrix ( ); // Копируется единичная матрица (верхняя). glColor3f (1.0, 0.0, 0.0);
/* Текущий цвет устанавливается красным. */
glTranslatef (-200.0, -50.0, 0.0);
/* Задаются параметры трансляции. */
glRecti (50, 100, 200, 150);
/* Отображается красный транслированный прямоугольник. */ glPopMatrix ( ); // Матрица трансляции выбрасывается. glPushMatrix ( ); // Копируется единичная матрица (верхняя). glRotatef (90.0, 0.0, 0.0, 1.0);
/* Задается поворот на 90 градусов вокруг оси z. */
glRecti (50, 100, 200, 150);
/* Отображается красный повернутый прямоугольник. */ glPopMatrix ( ); /* Матрица поворота отбрасывается. */ glScalef (-0.5, 1.0, 1.0);
/* Задаются параметры масштабирования-отражения. */
•glRecti (50, 100, 200, 150);
/* Отображается красный преобразованный прямоугольник. */
В последнем примере программирования геометрических преобразований приведем код OpenGL для трехмерного сложного преобразования, рассмотренного в разделе 5.13. Поскольку OpenGL умножает матрицы справа по мере их вызова, преобразования нужно активизировать в обратном порядке по сравнению с тем, как они должны применяться. Следовательно, каждое последующее преобразование добавляется справа от сложной матрицы. Поскольку мы еще не изучали трехмерные процедуры наблюдения OpenGL (глава 7), данную программу можно написать с помощью двухмерных операций наблюдения OpenGL, применяя геометрические преобразования к объектам на плоскости ху.
class wcPt3D { public:
GLfloat x, у, z; };
/* Процедура генерации матрицы поворота вокруг
* оси, определенной точками pi и р2. */
void rotate3D (wcPt3D pi, wcPt3D p2, GLfloat thetaDegrees)
{
/* Задаются компоненты вектора оси вращения. */ float vx = (р2.х - pl.x);
float vy = (p2.y - pl.y);
float vz = (p2.z - pl.z);
/* В обратном порядке задается последовательность
* трансляции-поворота-трансляции: */
glTranslatef (pl.x, pl.y, pl.z);
/* Точка pi возвращается в исходное положение. */
/* Поворот вокруг оси, проходящей через начало
* координат: */
glRotatef (thetaDegrees, vx, vy, vz); glTranslatef (-pl.x, -pl.y, -pl.z);
/* Точка pi транслируется в начало координат. */
}
/* Процедура генерации матрицы преобразования
* масштабирования относительно произвольной
* неподвижной точки. */
void scale3D (GLfloat sx, GLfloat sy, GLfloat sz,