cam.set(4. 4. 4. 0. 0. 0. 0. 1. 0): // make the initial camera // задаем начальную камеру
cam.setShape(30.0f. 64.Of/48.Of. 0.5f. 50.Of):
glutMainLoopO:
}
В листинге 7.3 показано, как можно использовать класс Camera и OpenGL для «пилотирования» камеры по сцене. Данная сцена состоит из единственного чайника. Камера - это глобальный объект, он устанавливается в подпрограмме mainO при выборе подходящего стартового вида и формы. При нажатии какой-либо клавиши вызывается подпрограмма myKeyboardO, и камера скользит или поворачивается-в зависимости от того, какая клавиша нажата. Если, например, нажата «Р», то камера тангажирует вверх на один градус. Если нажато сочетание «CTRL F»1 (клавиша «F» нажимается при удерживании клавиши CTRL в нажатом состоянии), то камера тангажирует на один градус вниз. После выполнения нажатия на клавишу подпрограмма glutPostRedisplayO вновь вызывает функцию myDisplayO для рисования нового изображения.
Обратите внимание на вызов подпрограммы glutSwapBuffersO2. В нашем приложении для быстрого и плавного перехода от одного изображения к другому применяется двойная буферизация (double buffering). Для хранения созданных изображений используются два буфера памяти. Устройство отображения (дисплей) переключается с показа одного буфера на показ второго с помощью функции glutSwapBuffersO.
1 На большинстве клавиатур нажатие CTRL и клавиши буквы возвращает значение ASCII-кода на 64 единицы меньше, чем ASCII-код, возвращаемый самой этой буквой.
2 Для задействования двойной буферизации функция gl utlnitDi spl ay( ) должна иметь в качестве аргумента GLUT_DOUBLE.
Трехмерный просмотр
Каждое новое изображение рисуется в невидимом буфере, а после завершения рисования дисплей переключается на него. Таким образом, зритель не видит, как экран очищается и как новая картинка медленно появляется строка за строкой, что очень раздражает. Вместо этого «старая» картинка отображается все время, пока «новая» картинка создается «за экраном», после чего дисплей очень быстро переключается на вновь нарисованное изображение.