Введение в 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, Победа

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


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

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


Саньтии Веды Перуна

Саньтии Веды Перуна (Книга Мудрости Перуна) одно из древнейших Славяно-Арийских Священных Преданий, сохраненных Жрецами-хранителями Древнерусской Инглиистической церкви Православных Староверов-Инглингов.


Рекомендуем почитать
Изучаем Java EE 7

Java Enterprise Edition (Java EE) остается одной из ведущих технологий и платформ на основе Java. Данная книга представляет собой логичное пошаговое руководство, в котором подробно описаны многие спецификации и эталонные реализации Java EE 7. Работа с ними продемонстрирована на практических примерах. В этом фундаментальном издании также используется новейшая версия инструмента GlassFish, предназначенного для развертывания и администрирования примеров кода. Книга написана ведущим специалистом по обработке запросов на спецификацию Java EE, членом наблюдательного совета организации Java Community Process (JCP)


Геймдизайн. Рецепты успеха лучших компьютерных игр от Super Mario и Doom до Assassin’s Creed и дальше

Что такое ГЕЙМДИЗАЙН? Это не код, графика или звук. Это не создание персонажей или раскрашивание игрового поля. Геймдизайн – это симулятор мечты, набор правил, благодаря которым игра оживает. Как создать игру, которую полюбят, от которой не смогут оторваться? Знаменитый геймдизайнер Тайнан Сильвестр на примере кейсов из самых популярных игр рассказывает как объединить эмоции и впечатления, игровую механику и мотивацию игроков. Познакомитесь с принципами дизайна, которыми пользуются ведущие студии мира! Создайте игровую механику, вызывающую эмоции и обеспечивающую разнообразие.


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

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


MFC и OpenGL

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


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

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


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

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