Метод set() работает подобно gluLookAtO: он использует значения eye, look, up для вычисления векторов u, v, n по формулам (7.1). Затем метод set() помещает эту информацию в поля камеры и сообщает ее в OpenGL.
Подпрограмма setShapeO еще проще: она помещает значения своих четырех аргументов в соответствующие поля камеры и после этого вызывает подпрограмму gluPerspective(viewangle, aspect. nearDist. farDist) (наряду с glMatrixMode(GL_PROJECTION) и glLoadldentityO) для установки проекционной матрицы.
Главные функции камеры - это slideO, roll О, yaw(), pitchO, которые выполняют относительные изменения положения и ориентации камеры. (Главная причина, по которой в структуре данных класса Camera отводятся поля для eye, u, v, n, заключается в том, чтобы иметь запись «текущей» камеры и затем изменять ее.) В следующем разделе мы рассмотрим работу методов камеры.
7.3.1. «Пилотирование» камеры
Пользователь интерактивно «пилотирует» камеру по сцене, нажимая клавиши или кнопки мыши. Например, нажатие клавиши «м» могло бы вызвать скольжение камеры «вверх», нажатие «г/» - рыскание влево, а нажатие «/» - скольжение вперед. Пользователь может посмотреть, как выглядит сцена с одной
7.3. Встраивание камеры в программу
точки наблюдения, затем изменить положение камеры на лучший наблюдательный пункт и направление и получить новое изображение. Или же пользователь может «пилотировать» камеру по сцене, делая различные снимки. Если эти кадры сохранить и затем просмотреть в быстром темпе, то получится анимация камеры, летающей по сцене.
Всего существует шесть степеней свободы для настройки камеры: она может «скользить» («slide») в трех направлениях и может быть повернута вокруг любой из трех координатных осей. Сначала разработаем функцию slideO.
Скольжение камеры
Скольжение камеры означает ее перемещение без поворотов вдоль одной из ее собственных осей - то есть в направлении u, v или п. Поскольку камера смотрит в сторону отрицательной части оси п, движение вдоль оси п означает «вперед» или «назад». Аналогично движение вдоль оси и означает «влево» или «вправо», а вдоль оси v - «вверх» или «вниз».