glutldleFunc(spinCube);
glutMouseFunc(mouse);
glEnable(GL_DEPTH_TEST); /* Разрешается режим удаления */
= GLUT_DOWN) axis = 0; == GLUT_DOWN) axis = 1; == GLUTJDOWN) axis = 2;
Приложение А. Демонстрационные программы
glutMainLoop();
}
/*-------Конец файла
/* невидимых поверхностей */
*/
А.9. Вращение куба с использованием массива вершин
/* Вращающийся куб.
* При раскраске граней используется линейная
* интерполяция цвета */
/* Программа демонстрирует использование преобразований
* однородных координат и структуру данных, описывающую
* топологию пространственного объекта. Подробно эта
* структура данных рассматривается в главе 4. */
/* С каждой вершиной ассоциирован вектор нормали и цвет. */ /* Центр куба находится в начале координат, а потому
* ненормированные компоненты векторов нормалей
* совпадают с координатами соответствующих вершин */
iinclude <stdlib.h> iinclude <GL/glut.h>
GLfloat vertices!] = {-1.0,-1.0,-1.0,1.0,-1.0,-1.0, 1.0,1.0,-1.0, -1.0,1.0,-1.0, -1.0,-1.0,1.0, 1.0,-1.0,1.0, 1.0,1.0,1.0, -1.0,1.0,1.0};
GLfloat normals[] = {-1.0,-1.0,-1.0,1.0,-1.0,-1.0, 1.0,1.0,-1.0, -1.0,1.0,-1.0, -1.0,-1.0,1.0, 1.0,-1.0,1.0, 1.0,1.0,1.0, -1.0,1.0,1.0};
GLfloat colors[] * {0.0,0.0,0.0,1.0,0.0,0.0, 1.0,1.0,0.0, 0.0,1.0,0.0, 0.0,0.0,1.0, 1.0,0.0,1.0, 1.0,1.0,1.0, 0.0,1.0,1.0};
GLubyte cubelndices[]={0,3,2,1,2,3,7,6,0, 4,7,3,1,2,6,5,4,5,6,7,0,1,5,4};
static GLfloat theta[] * {0.0,0.0,0.0}; static GLint axis = 2;
/* ...............................*/
void display!)
{
/* Программа отображения очищает буфер кадра и z-буфер, А.9. Вращение куба с использованием массива вершин
* поворачивает куб, вычерчивает куб в новой
* ориентации и переключает буферы. */
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity();
glRotatef(theta[0], 1.0, 0.0, 0.0); glRotatef(theta[l], 0.0, 1.0, 0.0); glRotatef(theta[2], 0.0, 0.0, 1.0);
glDrawElements(GL_QUADS, 24, GL_UNSIGNED_BYTE, cubelndices);
glBegin(GL_LINES);
glVertex3f(0.0,0.0,0.0);
glVertex3f(1.0,1.0,1.0); glEnd();