В листинге также приведены оси x, у, z, нарисованные с коническими наконечниками стрелок. Изображение основной системы координат может помочь наблюдателю сориентироваться. Для рисования оси х ось z поворачивается на 90° относительно оси у, чтобы создать повернутую систему координат, и ось х рисуется заново при этой новой ориентации. Отметим, что эта ось рисуется без заключения ее в «скобки» gl PushMatri х( ) и gl PopMatrixO, так что следующий поворот для создания оси у осуществляется в уже повернутой системе координат. Убедитесь, что этот поворот правильный.

Отметим, что стороны большого куба, параллельные в трехмерном пространстве, изображаются также параллельными - это результат использования параллельной проекции. Данный куб выглядит несколько неестественным, потому что мы привыкли видеть мир в перспективной проекции. Как мы увидим в главе 7, если вместо параллельной проекции использовать перспективную, то параллельные ребра не будут нарисованы параллельными.

Пример 5.6.3. Визуализация трехмерной сцены с затенением В этом примере мы разработаем немного более сложную сцену, чтобы проиллюстрировать дальнейшее использование моделирующих преобразований. Мы также покажем, как OpenGL обеспечивает создание гораздо более реалистичных изображений трехмерных объектов с помощью добавления теней и корректного удаления невидимых поверхностей.

На рис. 5.56 показаны два вида одной сцены. В обоих случаях используется камера, установленная функцией

gluLookAt(2.3. 1.3. 2, 0. 0.25. 0. 0.0, 1.0, 0.0).

5.6. Рисование трехмерных сцен с применением OpenGL

Френсис Хилл

а Рис. 5.56. Простая трехмерная сцена: а) использование большого отображаемого объема; б) использование малого отображаемого объема На рис. 5.56, а используется большой отображаемый объем, заключающий в себе всю сцену; на рис. 5.56, б используется маленький отображаемый объем, заключающий в себе только малую часть этой же сцены, что обеспечивает изображение крупным планом.

Сцена содержит в себе три объекта, лежащих на столе в углу «комнаты». Каждая из трех стен создана путем сплющивания куба в тонкий лист и перемещения его в нужную позицию. (Эти стены тоже выглядят несколько неестественно из-за использования параллельной проекции.) Переключатель (jack) составлен из трех вытянутых сфер, ориентированных под прямыми углами друг к другу, и шести маленьких сфер на их концах. Стол состоит из столешницы и четырех ножек. Каждая из этих пяти частей стола представляет собой куб, масштабированный до нужного размера и формы. Чертеж этого стола показан на рис. 5.57; он зависит от четырех параметров, характеризующих размер его частей: topWidth (ширина столешницы), topThick (толщина столешницы), legLen (высота ножки) и leg Thick (толщина ножки). Подпрограмма tableLegC) рисует ножку и вызывается четыре раза внутри подпрограммы tablet) для рисования ножек в четырех различных местах. Использование различных параметров внутри tableLeg() обеспечивает вызов различных преобразований моделирования. Как обычно, функции моделирования заключены в скобки glPushMathx(), glPopMatrix() для изоляции преобразований, которые они проделывают.


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