Выбрать главу

 glLoadIdentity();

 //--Определяем точку наблюдения---------------------------------------//

 gluLookAt(0.0, 0.0, 2.5,0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

 //--Сохраняем видовую матрицу, так как дальше будет проводиться поворот колец//

 glPushMatrix();

 //--Производим несколько поворотов на новый угол (это быстрее,--------//

 //--чем умножать предыдущую видовую матрицу на матрицу поворота с-----//

 //--фиксированным углом поворота)-------------------------------------//

 glRotatef (-CurAng,1,1,0);

 glRotatef (CurAng,1,0,0);

 //--Для рисования колец каждое из них надо преобразовать отдельно,----//

 //--поэтому сначала сохраняем видовую матрицу, затем восстанавливаем--//

 glPushMatrix();

 glTranslatef (0,0,-RingHeight/2);

 DrawRing();

 glPopMatrix();

 glPushMatrix();

 glTranslatef (0,RingHeight/2,0);

 glRotatef (90,1,0,0);

 DrawRing();

 glPopMatrix();

 glPushMatrix();

 glTranslatef (-RingHeight/2,0,0);

 glRotatef (90,0,1,0);

 DrawRing();

 glPopMatrix();

 //--Восстанавливаем матрицу для поворотов тетраэдра--------------------//

 glPopMatrix();

 //--Выключаем режим наложения текстуры--------------------------------//

 glDisable(GL_TEXTURE_2D);

 //--Проводим повороты-------------------------------------------------//

 glRotatef(CurAng,1,0,0);

 glRotatef(CurAng/2,1,0,1);

 //--Чтобы тетраэдр вращался вокруг центра, его надо сдвинуть вниз по оси oz//

 glTranslatef(0,-0.33,0);

 //--Задаем цвет диффузного отражения для тетраэдра--------------------//

 glColor3fv(mat_diff2);

 //--Проводим построение тетраэдра-------------------------------------//

 glCallList(TETR_LIST);

}

void Display(void) {

 //--Инициализация (очистка) текущего буфера кадра и глубины-----------//

 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

 //--Построение объектов-----------------------------------------------//

 DrawFigures();

 //--Перестановка буферов кадра----------------------------------------//

 glutSwapBuffers();

}

void Redraw(void) {

 //--Увеличение текущего угла поворота---------------------------------//

 CurAng+=1;

 //--Сигнал для вызова процедуры создания изображения (для обновления)-//

 glutPostRedisplay();

}

int main(int argc, char **argv) {

 //--Инициализация функций библиотеки GLUT-----------------------------//

 glutInit(&argc, argv);

 //--Задание режима с двойной буферизацией, представление цвета в формате RGB,--//

 //--использование буфера глубины --//

 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);

 //--Создание окна приложения-----------------------------------------//

 glutCreateWindow("Example of using OpenGL");

 //--Регистрация функции построения изображения-----------------------//

 glutDisplayFunc(Display);

 //--Регистрация функции обновления изображения-----------------------//

 glutIdleFunc(Redraw);

 //--Инициализация функций OpenGL-------------------------------------//

 Init();

 //--Цикл обработки событий-------------------------------------------//

 glutMainLoop();

 return 0;

}

Результат работы программы:

В программе используется только файл glut.h, который содержит обращения к файлам gl.h и glu.h, поэтому отдельно подключать их не нужно.

Большим достоинством OpenGL является независимость большинства команд. Например, чтобы отключить наложение текстуры, достаточно закомментировать вызов функции TextureInit(), а чтобы получить статичное изображение достаточно не регистрировать функцию обновления изображения вызовом функции glutIdleFunc(). В этом случае можно использовать режим с одним буфером, заменив GL_DOUBLE на GL_SINGLE в команде glutInitDisplayMode() и добавив команду glFlush() в конце процедуры Display() для очистки этого буфера.

Использованные материалы:

1. Тихомиров Ю. Программирование трехмерной графики. СПб., BHV 1998.

2. Visual Introduction in OpenGL, Siggraph’98.

3. The OpenGL graphics system: a specification (version 1.1).

4. Программирование GLUT: окна и анимация. Miguel Angel Sepulveda, LinuxFocus.

5. The OpenGL Utility Toolkit (GLUT) Programming Interface, API version 3, specification.