Как же управлять креном, тангажом и курсом камеры? Функция gluLookAtO удобна для установки исходной камеры, поскольку обычно у нас имеются четкие представления о выборе eye и look. Труднее зрительно представить выбор вектора up для получения определенного крена и еще более трудно осуществлять относительные настройки для камеры в дальнейшем, используя только gluLookAtO. (Функция gluLookAtO работает с декартовыми координатами, в то время как ориентация имеет дело с углами и поворотами вокруг осей.) В OpenGL нет прямого доступа к направлениям u, v, п, поэтому мы своими силами введем их в программу. Это значительно упростит описание и настройку камеры.
Что делает gluLookAt(): некоторое математическое обоснование Какими же будут направления u, v, п при выполнении функции gluLookAtO для заданных значений eye, look и up? Давайте разберемся, что делает gluLookAtO и почему она делает именно это.
Как показано на рис. 7.7, а, нам известны положения eye и look, а также направление up. Тогда сразу ясно, что вектор п должен быть параллелен вектору eye-look, как показано на рис. 7.7, б, поэтому устанавливаем п = eye - look (нормирование п и других векторов мы можем произвести позднее.)
Рис. 7.7. Построение векторов u, v и п Теперь нам нужно найти векторы и и V, которые перпендикулярны вектору п и друг другу. Направление и указывает «от» камеры, поэтому вполне естественно сделать его перпендикулярным к вектору ир, который пользователь назначил направлением «вверх». Такое допущение делается в функции д1|Л.оокАт.О в любом случае, поэтому направление и перпендикулярно к п и к ир. Верный способ построить вектор, перпендикулярный к двум заданным, - это вычислить их векторное произведение, поэтому положим и = ир х п. (Пользователь не должен выбирать направление ир параллельным п, поскольку в таком случае длина вектора и будет равна нулю. Почему?) Мы выбираем и = ир х п, а не п х ир, чтобы вектор и указывал «вправо» при взгляде по направлению -п.