Введение в OpenGL - [13]

Шрифт
Интервал

> glColorMaterial(GL_FRONT_AND_BACK,GL_DIFFUSE);

> //--Создания указателя на quadric-объект для построения колец---------//

> QuadrObj=gluNewQuadric();

> //--Определение свойств текстуры--------------------------------------//

> TextureInit();

> //--Задание перспективной проекции------------------------------------//

> glMatrixMode(GL_PROJECTION);

> gluPerspective(89.0,1.0,0.5,100.0);

> //--Далее будет проводиться только преобразование объектов сцены------//

> glMatrixMode(GL_MODELVIEW);

>}

>void DrawFigures(void) {

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

> glEnable(GL_TEXTURE_2D);

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

> glColor3fv(mat_diff1);

> //--Чтобы не проводить перемножение с предыдущей матрицей загружаем единичную матрицу//

> 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.



Еще от автора Неизвестный Автор
Галчонок

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Призраки ночи

В книге собраны предания и поверья о призраках ночи — колдунах и ведьмах, оборотнях и вампирах, один вид которых вызывал неподдельный страх, леденивший даже мужественное сердце.


Закат  вечности

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


mmmavro.org | День 131, Победа

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


mmmavro.org | День 132, Поэт

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Песнь о Нибелунгах

…«Песнь о Нибелунгах» принадлежит к числу наиболее известных эпических произведений человечества. Она находится в кругу таких творений, как поэмы Гомера и «Песнь о Роланде», «Слово о полку Игореве» и «Божественная комедия» Данте — если оставаться в пределе европейских литератур…В. Г. Адмони.


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.