Файл: графическая библиотека opengl.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 09.06.2020

Просмотров: 1703

Скачиваний: 4

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

 91

периодической

 

проверки

 

совершения

 

того

 

или

 

иного

 

события

 

надо

 

зарегистрировать

 

функцию

которая

 

будет

 

его

 

обрабатывать

Для

 

этого

 

используются

  

функции

 

вида

void 

glutDisplayFunc 

 (void (*

func

) (void)) 

void 

glutReshapeFunc

 (void (*

func

) (int width,  

                                    int height)) 

void 

glutMouseFunc

  (void (*

func

) (int button,  

                     int state, int x, int y)) 

void 

glutIdleFunc

 (void (*

func

) (void)) 

void 

glutMotionFunc

 (void (*

func

)(int 

x

, int 

y

)); 

void 

glutPassiveMotionFunc

 (void (*

func

)(int 

x

, int 

y

)); 

 

Параметром

   

для

 

них

 

является

 

имя

 

соответствующей

 

функции

 

заданного

 

типа

С

 

помощью

 

glutDisplayFunc()

 

задается

 

функция

 

рисования

 

для

 

окна

 

приложения

которая

 

вызывается

 

при

 

необходимости

 

создания

 

или

 

восстановления

 

изображения

Для

 

явного

 

указания

что

 

окно

 

надо

 

обновить

иногда

 

удобно

 

использовать

 

функцию

 

void 

glutPostRedisplay

 (void) 

 

Через

 

glutReshapeFunc(

устанавливается

 

функция

 

обработки

 

изменения

 

размеров

 

окна

 

пользователем

которой

 

передаются

 

новые

 

размеры

glutMouseFunc()

 

определяет

 

функцию

 – 

обработчик

 

команд

 

от

 

мыши

а

 

glutIdleFunc()

 

задает

 

функцию

которая

 

будет

 

вызываться

 

каждый

 

раз

когда

 

нет

 

событий

 

от

 

пользователя

Функция

определяемая

 

glutMotionFun

с

 

вызывается

когда

 

пользователь

 

двигает

 

указатель

 

мыши

удерживая

 

нажатой

 

кнопку

 

мыши

glutPassiveMotionFunc

  

регистрирует

 

функцию

вызываемую

если

 

пользователь

 

двигает

 

указатель

 

мыши

 

и

 

не

 

нажато

 

ни

 

одной

 

кпопки

 

мыши

Контроль

   

всех

 

событий

 

происходит

 

внутри

 

бесконечного

 

цикла

 

в

 

функции

  

void  

glutMainLoop

  (void) 

 

которая

 

обычно

 

вызывается

 

в

 

конце

 

любой

 

программы

использующей

 

GLUT. 

Структура

 

приложения

использующего

 

анимацию

будет

 

следующей


background image

 92

 

 #include <GL/glut.h>   
 
 void MyIdle(void) 
 { 
 /*

Код

который

 

меняет

 

переменные

определяющие

 

следующий

  

кадр

 */ 

… 
}; 
 
void MyDisplay(void) 

 /* 

Код

 OpenGL, 

который

 

отображает

 

кадр

 */ 

  … 

 /* 

После

 

рисования

 

переставляем

  

буферы

 */ 

  glutSwapBuffers(); 
 }; 
 
 
void main(int argcp, char **argv) 
{   

 /* 

Инициализация

 GLUT */ 

 glutInit(&argcp, argv);    

 glutInitWindowSize(640, 480);   
 glutInitWindowPosition(0, 0);   

 /* 

Открытие

 

окна

 */ 

 glutCreateWindow("My OpenGL Application");   

 /* 

Выбор

 

режима

:  

двойной

 

буфер

 

и

 RGBA 

цвета

 */  

 glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | 
GLUT_DEPTH);   

 /* 

Регистрация

 

вызываемых

 

функций

 */   

 glutDisplayFunc(MyDisplay);   
 glutIdleFunc(MyIdle);   

 /* 

Запуск

 

механизма

 

обработки

 

событий

 */   

 glutMainLoop();   
};     
 

В

 

случае

 , 

если

 

приложение

 

должно

 

строить

 

статичное

 

изображение

можно

 

заменить

 

GLUT_DOUBLE

 

на

 

GLUT_SINGLE

так

 

как

 

одного

 

буфера

 

в

 

этом

 

случае

 

будет

 

достаточно

,  

и

 

убрать

 

вызов

 

функции

 

glutIdleFunc().

  


background image

 93

Приложение

 B.  

 

Примитивы

 

библиотек

 GLU 

и

 GLUT 

Рассмотрим

 

стандартные

 

команды

 

построения

 

примитивов

которые

 

реализованы

 

в

 

библиотеках

 GLU 

и

 GLUT. 

Чтобы

 

построить

 

примитив

 

из

 

библиотеки

 GLU, 

надо

 

сначала

 

создать

 

указатель

 

на

 quadric-

объект

 

с

 

помощью

 

команды

 

gluNewQuadric()

а

 

затем

 

вызвать

 

одну

 

из

 

команд

 

gluSphere()

gluCylinder()

gluDisk()

gluPartialDisk()

Рассмотрим

 

эти

 

команды

 

отдельно

void 

gluSphere

 (GLUquadricObj  *

qobj

, GLdouble

 radius

                GLint

 slices

, GLint

 stacks

 

Эта

 

функция

 

строит

 

сферу

 

с

 

центром

 

в

 

начале

 

координат

 

и

 

радиусом

 

radius

При

 

этом

 

число

 

разбиений

 

сферы

 

вокруг

 

оси

 z 

задается

 

параметром

 

slices

а

 

вдоль

 

оси

 z – 

параметром

 

stacks

void

 gluCylinder

 (GLUquadricObj  *

qobj

                  

GLdouble

 baseRadius

                  

GLdouble 

topRadius

,  

                  

GLdouble

 height

GLint

 slices

,  

                  

GLint

 stacks

 

Данная

 

функция

 

строит

 

цилиндр

 

без

 

оснований

 (

кольцо

), 

продольная

 

ось

 

параллельна

 

оси

 z, 

заднее

 

основание

 

имеет

 

радиус

 

baseRadius

и

 

расположено

 

в

 

плоскости

 z=0, 

переднее

 

основание

 

имеет

 

радиус

 

topRadius

 

и

 

расположено

 

в

 

плоскости

 z= 

height

Если

 

задать

 

один

 

из

 

радиусов

 

равным

 

нулю

то

 

будет

 

построен

 

конус

Параметры

 

slices

 

и

 

stacks

 

имеют

 

аналогичный

 

смысл

что

 

и

 

в

 

предыдущей

 

команде

void 

gluDisk 

(GLUquadricObj  *

qobj

,  

              GLdouble 

innerRadius

,  

              GLdouble 

outerRadius

,  

              GLint 

slices

,  

              GLint 

loops

)  

 


background image

 94

Функция

 

строит

 

плоский

 

диск

  (

круг

с

 

центром

 

в

 

начале

 

координат

 

и

 

радиусом

 

outerRadius

При

 

этом

 

если

 

значение

 

innerRadius

 

отлично

 

от

 

нуля

то

 

в

 

центре

 

диска

 

будет

 

находиться

 

отверстие

 

радиусом

 

innerRadius

Параметр

 

slices

 

задает

 

число

 

разбиений

 

диска

 

вокруг

 

оси

 z, 

а

 

параметр

 

loops

 – 

число

 

концентрических

 

колец

перпендикулярных

 

оси

 z.

 

void 

gluPartialDisk 

(GLUquadricObj *

qobj

,  

                     GLdouble 

innerRadius

,  

                     GLdouble 

outerRadius

,  

                     GLint 

slices

,  

                     GLint 

loops

,  

                     GLdouble 

startAngle

                     GLdouble 

sweepAngle

); 

  

Отличие

 

этой

 

команды

 

от

 

предыдущей

 

заключается

 

в

 

том

что

 

она

 

строит

 

сектор

 

круга

начальный

 

и

 

конечный

 

углы

 

которого

 

отсчитываются

 

против

 

часовой

 

стрелки

 

от

 

положительного

 

направления

 

оси

 y 

и

 

задаются

 

параметрами

 

startAngle

 

и

 

sweepAngle

Углы

 

измеряются

 

в

 

градусах

Команды

проводящие

 

построение

 

примитивов

 

из

 

библиотеки

 

GLUT, 

реализованы

 

через

 

стандартные

 

примитивы

 OpenGL 

и

 GLU. 

Для

 

построения

 

нужного

 

примитива

 

достаточно

 

произвести

 

вызов

 

соответствующей

 

команды

void 

glutSolidSphere 

 (GLdouble 

radius

,  

                       GLint 

slices

,  

                       GLint 

stacks

void 

glutWireSphere 

 (GLdouble 

radius

,  

                      GLint 

slices

,  

                      GLint 

stacks

 

Команда

 

glutSolidSphere()

 

строит

 

сферу

а

 

glutWireSphere()–

каркас

 

сферы

 

радиусом

 

radius

Остальные

 

параметры

 

те

 

же

что

 

и

 

в

 

предыдущих

 

командах

.

 

void 

glutSolidCube 

(GLdouble 

size

void 

glutWireCube 

 (GLdouble 

size

 

Команды

 

строят

 

куб

 

или

 

каркас

 

куба

 

с

 

центром

 

в

 

начале

 

координат

 

и

 

длиной

 

ребра

 

size

.

 


background image

 95

void 

glutSolidCone 

 (GLdouble 

base

, GLdouble 

height

,  

                    GLint 

slices

, GLint 

stacks

void 

glutWireCone 

 (GLdouble base, GLdouble height,  

                   GLint 

slices

, GLint 

stacks

 

Эти

 

команды

 

строят

   

конус

 

или

 

его

 

каркас

 

высотой

 

height

 

и

 

радиусом

 

основания

 

base

расположенный

 

вдоль

 

оси

 z. 

Основание

 

находится

  

в

 

плоскости

 z=0.   

void 

glutSolidTorus 

(GLdouble 

innerRadius

,  

                     GLdouble 

outerRadius

,  

                     GLint 

nsides

,  

                     GLint 

rings

void 

glutWireTorus 

 (GLdouble 

innerRadius

,  

                     GLdouble 

outerRadius

,  

                     GLint 

nsides

                     GLint 

rings

 

Эти

 

команды

 

строят

 

тор

 

или

 

его

 

каркас

 

в

 

плоскости

 z=0. 

Внутренний

 

и

 

внешний

 

радиусы

 

задаются

 

параметрами

 

innerRadius

outerRadius

Параметр

 

nsides

 

задает

 

число

 

сторон

 

в

 

кольцах

составляющих

 

ортогональное

 

сечение

 

тора

а

 

rings 

– 

число

 

радиальных

 

разбиений

 

тора

void 

glutSolidTetrahedron

  (void) 

void 

glutWireTetrahedron

  (void) 

 

Эти

 

команды

 

строят

 

тетраэдр

  (

правильную

 

треугольную

 

пирамиду

или

 

его

 

каркас

при

 

этом

 

радиус

 

описанной

 

сферы

 

вокруг

 

него

 

равен

 1.  

void 

glutSolidOctahedron

  (void) 

void 

glutWireOctahedron 

 (void) 

 

Эти

 

команды

 

строят

 

октаэдр

 

или

 

его

 

каркас

радиус

 

описанной

 

вокруг

 

него

 

сферы

 

равен

 1. 

void 

glutSolidDodecahedron

  (void) 

void 

glutWireDodecahedron

  (void) 

 

Эти

 

команды

 

строят

 

додекаэдр

 

или

 

его

 

каркас

радиус

 

описанной

 

вокруг

 

него

 

сферы

 

равен

 

квадратному

 

корню

 

из

 

трех

.

 

void 

glutSolidIcosahedron 

 (void) 

void 

glutWireIcosahedron

  (void)