5.2.1. Настройка положения фрейма камеры
Как было показано в главе 4, координаты вершин можно задавать в любых приемлемых единицах, а матрицу вида определять с помощью суперпозиции аффинных преобразований, которые задают изменение положения этих вершин. Операции формирования матрицы вида можно рассматривать и как изменение фрейма, а результат применения преобразования вида- как задание положения вершин в другом фрейме. Другими словами, мы определяем объекты в некотором подходящем локальном фрейме, а затем с помощью матрицы вида переводим их из локального фрейма в мировой или фрейм пользователя. В некоторых API этот процесс трактуется таким образом: объекты моделируются в собственной системе координат модели, а преобразование экземпляра переносит их в мировой фрейм.
Объекты моделируются независимо от того, как они потом будут отображаться, а следовательно, и независимо от положения камеры, через которую на них будет "смотреть" пользователь. По умолчанию OpenGL размещает камеру в начале координат мирового фрейма, причем ось проецирования направляется в сторону, противоположную оси z мирового фрейма (рис. 5.11). Следовательно, если матрица вида единичная, то фрейм камеры и мировой фрейм совпадают.
В большинстве приложений в ходе моделирования объекты размещаются в окрестности начала координат, а значит, камера при ее расположении по умолчанию не видит всех объектов сцены. Таким образом, либо нужно сместить камеру так, чтобы в поле ее зрения попали все необходимые объекты, либо нужно "оттащить" объекты так, чтобы они оказались перед камерой. В программном смысле это эквивалентные операции.
Можно считать, что сцена, сформированная в процессе моделирования, имеет единичную матрицу вида, и задавать все вершины с помощью функции glVertex(). Последующие изменения матрицы вида сместят мировой фрейм по отношению к камере и таким образом повлияют на то, как они, в конце концов, будут видны в камере, поскольку вершины заданы относительно преобразованного мирового фрейма. В терминах процесса выполнения программы матрицы проецирования и вида являются компонентами текущего состояния. При формировании примитивов система использует текущее состояние и именно его применяет к вершинам, заданным в программе.