Рисование SDL с помощью камеры
Нетрудно встроить камеру в приложение, которое читает SDL-файлы, как описывалось в главе 5. Тогда там фигурируют два глобальных объекта, а именно:
Camera cam: Scene sen:
и в подпрограмме mainO SDL-файл читается и анализируется посредством функции sen.read ("myScene. dat"). И, наконец, в подпрограмме myDisplay(void) следует просто заменить glutWireTeapot(l.O) на sen. drawSceneOpenGK).
Практические упражнения
7.3.1. Реализация pitch() и yaw()
Напишите функции void Camera:: pitchCfloat angle) и void Camera:: yaw(float angle), которые осуществляют соответственно тангаж и рыскание камеры. Сделайте так, чтобы положительное значение рыскания поворачивало камеру «влево», а положительное значение тангажа поворачивало камеру «вверх».
7.3.2. Создание универсальной функции поворота rotate()
Напишите функцию void Camera:: rotate(Vector3 axis, float angle), которая поворачивает камеру на угол angle градусов вокруг оси axis. Эта функция должна осуществлять поворот всех трех осей - u, v, п - вокруг точки наблюдения (eye).
7.4. Перспективные проекции трехмерных объектов Трактуйте их в терминах цилиндра, сферы, конуса, причем всех в перспективе.
Поговорка Ашанти (Ashanti)
Располагая классом Camera, мы можем передвигаться по трехмерным сценам и уже готовы создавать картины. С помощью OpenGL мы создаем каждую картину посредством передачи вершин объектов (вроде сеток, представляющих чайник или шахматную фигуру) в графический конвейер, как это описывалось в главе 5. На рис. 7.11 демонстрируется графический конвейер, но с одним новым элементом.
Рис. 7.11. Снова графический конвейер
Напомним, что каждая вершина v умножается на матрицу моделирования-вида (VM). Моделирующая часть этой матрицы (М) осуществляет все преобразования моделирования объекта; видовая часть матрицы ( V) предназначена для преобразования, задаваемого положением и ориентацией камеры. После выхода из этой матрицы вершина имеет координаты наблюдателя (eye coordinates) - то есть коорди-