Положение камеры следует выбрать на диагонали исходного фрейма, т.е.
В результате получим ту же матрицу вида, что и в разделе 5.2.1.
Описанный выше метод задания положения камеры является только одним из многих. В некоторых ситуациях удобнее задавать ориентацию камеры косвенно с помощью точки визирования на рассматриваемом объекте. Рассмотрим компоновку камеры и объекта, представленную на рис. 5.17. Камера находится в точке е, которая задана в координатах мирового фрейма, а ее оптическая ось направлена таким образом, что проходит через вторую точку а, которая называется точкой визирования (at point). Этими двумя точками определяется вектор нормали к картинной плоскости:
n = е-а.
После этого остается только определиться с направлением вектора вертикали картинной плоскости, который, как и раньше, можно задать вектором вертикали вида. В составе OpenGL имеется функция gluLookAt(), которая позволяет изменить матрицу вида в соответствии с заданной точкой визирования и заданным вектором вертикали вида:
gluLookAt(eyex, еуеу, eyez, atx, aty, atx, upx, upy, upz); Аргументы функции имеют следующий смысл:
еуех, еуеу, eyez - компоненты точки привязки вида;
atx, aty, atx - компоненты точки визирования;
upx, upy, upz-компоненты точки, которая задает вектор вертикали вида.
В приложениях, имеющих дело с различными тренажерами, ни один из описанных способов задания положения камеры не подходит. В симу-ляторе полета пилот управляет программой отображения, задавая три угла ориентации воображаемого летательного аппарата: крена (roll), тангажа (pitch) и рыскания (yaw). Эти углы задаются относительно осей системы координат аппарата, центр которой находится в его центре масс (рис. 5.18). Следовательно, и изображение, которое видит пилот, должно формироваться в зависимости от этих углов и расстояния между
5.2. Размещение камеры
аппаратом и объектами. Исходя из этого, матрица вида может формироваться из матрицы сдвига и трех канонических матриц поворота вокруг осей координат (см. упр. 5.2).