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,


⇐ вернуться назад | | далее ⇒