После знакомства с концепцией взаимного размещения фреймов невольно возникает вопрос, а как все это реализовано в OpenGL. В дальнейшем для определенности будем считать, что камера перемещается относительно мирового фрейма. В общих чертах мы рассмотрим три подхода: один - в этом разделе, а два других - в разделе 5.2.2. Еше два подхода я предлагаю читателям проанализировать самостоятельно при выполнении упр. 5.2 и 5.3.

Сначала зададим положение камеры косвенно посредством последовательности поворотов и сдвигов в матрице вида. Этот подход является, по сути, реализацией преобразований экземпляра, описанных в главе 4. При этом нужно обратить особое внимание на два обстоятельства. Во-первых, как правило, в программе стремятся определиться с положением камеры еще до того, как будут созданы отображаемые объекты1. Во-вторых, применение преобразований по отношению к камере может привести к эффекту, противоположному ожидаемому.

Рассмотрим объект, центр которого находится в начале координат. Камера находится в начальном положении - в начале координат, а ее оптическая ось направлена вдоль отрицательной полуоси г. Пусть нам требуется "посмотреть" на ту грань объекта, которая видна со стороны положительной полуоси х. Следовательно, нужно отодвинуть камеру от начала координат. Если при этом не изменять ориентацию камеры, то смещать ее нужно вдоль положительной полуоси z. Соответствующее преобразование реализуется функцией В графических программах анимации используется другой прием - положение камеры часто меняется в зависимости от творческих планов режиссера. Камера то фиксируется и наблюдает за динамически изменяющейся сценой, то "закрепляется" на движущемся объекте (см. упр. 5.3).

5.2. Размещение камеры

glTranslatef(0.0, 0.0, -d);

где d - положительное число.

Для многих удобнее интерпретировать эту операцию как сдвиг фрейма камеры относительно мирового фрейма. Такая точка зрения базируется на классической графике. В компьютерной графике распространен другой подход - считается, что объект установлен в фиксированном фрейме, а наблюдатель "бегает" вокруг него в поисках подходящего ракурса.В классической графике наблюдатель занимает доминирующую позицию. Концептуально процесс визуализации выполняется таким образом: мы берем объект, ориентируем его так, как считаем нужным, и переносим в нужное место. Одно из следствий классического подхода состоит в том, что расстояние измеряется от наблюдателя до объекта, а не от объекта до наблюдателя, как это делается в большинстве физических приборов. В результате классический подход приводит к левостороннему фрейму камеры. Во многих графических системах, в том числе и OpenGL, следуют этому подходу, моделируя в правосторонней системе координат, а визуализируя - в левосторонней. Это решение, хотя и корректное с технической точки зрения, кажется весьма странным для большинства пользователей. В OpenGL расстояния, характеризующие параллелепипед видимости (те, которые используются в качестве аргументов вызова glOrtho()), отсчитываются от камеры, что эквивалентно использованию левостороннего фрейма камеры.


⇐ Предыдущая| |Следующая ⇒