ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 09.06.2020
Просмотров: 1703
Скачиваний: 4
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.
Структура
приложения
,
использующего
анимацию
,
будет
следующей
:
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().
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
)
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
.
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)