В заключение посмотрим, какие величины функция gluLookAtO заносит в матрицу моделирования-вида. Из главы 5 мы знаем, что матрица моделирования-вида является произведением двух матриц: матрицы У, ответственной за преобразование точек из мировых координат в координаты камеры, и матрицы М, осуществляющей все преобразования моделирования, применяемые к этим точкам. Функция gluLookAtO строит матрицу У и умножает ее справа на текущую матрицу. Поскольку задача матрицы У заключается в преобразовании мировых координат в координаты камеры, она должна преобразовывать систему координат камеры в исходную позицию камеры, как показано на рис. 7.9. Это означает, что матрица У должна преобразовать точку eye в начало координат, вектор и в вектор i, v в j, п в к. Имеется несколько способов получения матрицы У, однако проще убедиться, что подойдет такая матрица:
V =
(их иу иг dx\
vx vy vz dy
nx ny nz dz
0 0 0 0
(7.2)
7.2. Снова о камере
как и должно быть, где точка eye расширена до однородных координат. Проверьте также, что
и что матрица ^преобразует вектор V в (0,1,0,0)7", а вектор п - в (0,0,1,0)г. Матрица ^создается функцией д!и1.оокАт.() и умножает ее справа на текущую матрицу. У нас будет возможность произвести такую операцию позднее, когда мы встроим в программу нашу собственную камеру.
X
Рис. 7.9. Преобразования, осуществляемые функцией gluLookAtQ
1 Ввиду того, что нельзя скалярно перемножать точку и вектор, вместо точки eye нужно взять вектор eye - (0,0,0).
Трехмерный просмотр
Практические упражнения
7.2.1. Нахождение крена, тангажа и курса по заданным векторам и, V, п Пусть камера задана системой координат, образованной ортами и, V, п. Курс и тангаж камеры определяются путем выражения вектора -п в сферических координатах. Используя приложение Б, покажите, что курс = агсг£(-я,, -пх), тангаж = виг^-я ).
Далее, крен камеры - это угол между осью и и горизонтом. Для определения крена построим горизонтальный вектор Ь, лежащий в плоскости иь. Покажите, что Ь = j х п удовлетворяет этим требованиям. Кроме того, покажите, что угол между векторами Ь и и определяется формулой: