КГ_10глава (1024131), страница 2

Файл №1024131 КГ_10глава (Компьютерная графика) 2 страницаКГ_10глава (1024131) страница 22017-07-12СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 2)

Результат работы программы показан на рис. 10.2.

Рис. 10.2. Изображение объектов и направление осей мировых координат

в программе StudexSl

Для иллюстрации работы Z-буфера (в OpenGL он называется буфером глу­бины — depth buffer) сначала рисуем грани пирамиды, а потом шахматное поле, которое расположено ниже. Грани пирамиды также рисуем все пять (хотя здесь видны только две), причем так, чтобы при отсутствии Z-буфера получался бы заведомо неправильный результат. Проверьте это, попробуйте отключить Z-буфер. Для этого достаточно удалить из текста оператор glEnable (GL_depth_test) . Что получится?

Программа StudexSl может служить простейшим примером построения изо­бражения трехмерных объектов в заданной проекции. Изображение на рис. 10.2 вполне правдоподобно передает форму объектов. Однако в данной программе отсутствуют многие важные элементы построения реалистичных изображений. В первую очередь это относится к освещению. Так, например, грани пирамиды здесь закрашены разными цветами — передняя грань более светлым цветом, а боковая грань более темным. Эти цвета мы задали вызо­вом функций gicoior3f перед выводом соответствующих граней. Значения цветов выбраны произвольно. Здесь никак не были использованы возможно­сти, которые предоставляет OpenGL для моделирования освещения.

10.4. Моделирование освещения

Для того чтобы поручить OpenGL изображать объекты в соответствии с некоторой моделью освещения, необходимо вызвать функцию glEnabie (gl_lighting) . Может быть использовано несколько источников света. Максимальное количество источников света зависит от версии реали­зации OpenGL. Источники света имеют номера от 0 до некоторого макси­мального значения. Включение i-го источника выполняется функцией

glEnabie (GL_LIGHTi), а выключение — функцией glDisable (GL_LIGHTi) . Так,

например, чтобы заставить светить нулевой источник, необходимо вызвать

функцию glEnabie (GL_LIGHT0).

Каждый источник света можно (и нужно) настроить индивидуально. Делает­ся ЭТО ВЫЗОВОМ функций glLightf, glLighti ИЛИ glLightfv, glLightiv (век-

торные разновидности). Функции различаются типами и количеством аргу­ментов. Рассмотрим некоторые примеры настройки.

Определить положение источника света gl_lighto можно следующим об­разом:

В массив lightpos [ ] необходимо записать однородные мировые координаты источника света в виде (x, у, z, w). При вызове glLightfv эти координаты бу­дут преобразованы в соответствии с ракурсом показа, определяемом видовой матрицей. При w=1 будет обеспечено правильное соответствие закрашивания объектов расположению источника.

Направление действия источника света задается так:

В массиве iightdirection[] должны быть указаны координаты радиус-век­тора в относительных единицах (х, у, z), направленного от источника света.

Угол распространения света от точечного направленного источника можно задать так:

где angle — угол в градусах в диапазоне от 0 до 90°. При этом свет в про­странстве ограничивается конусом. Также допустимо значение angle = 180, которое соответствует равномерному распространению света во все стороны.

Этим далеко не исчерпываются возможности функций glLightf, glLighti, glLightfv и glLightiv для установки параметров источников света. Для наи­более полного ознакомления обратитесь к документации по Win32 SDK [61].

Необходимо учитывать, что многие параметры, в том числе и для источни­ков света, в OpenGL установлены по умолчанию. Так, например, для источ­ника gllighto установлен по умолчанию равномерный рассеянный свет (angle = 180). Кроме того, установки по умолчанию неодинаковы для раз­личных ИСТОЧНИКОВ GLLIGHTi.

Кроме параметров настройки источника света еще одним важнейшим аспек­том моделирования освещения является задание нормалей к поверхностям. При выводе каждого объекта OpenGL определяет взаимную ориентацию век­тора направления источника света и текущего вектора нормали. По умолча­нию установлено направление вектора нормали как (0, 0, 1), то есть вектор направлен вдоль оси z мировых координат. Направление текущего вектора нормали не изменяется до тех пор, пока не будет вызвана функция giNomai, например:

где пх, пу и nz — это координаты радиус-вектора нормали. Для данной функции они должны быть в диапазоне (-1.0, 1.0). Существуют и другие разновидности для glNormai, отличающиеся типами числовых значений коор­динат.

Таким образом, при выводе каждой отдельной полигональной грани необхо­димо вначале устанавливать направление текущего вектора нормали. Для корректного расчета взаимного расположения векторов нормалей и направ­лений источников света при различных ракурсах показа необходимо устано­вить режим нормализации векторов

Для правильного вывода освещаемых объектов нужно также определять свойства материала поверхности. Если предполагается изображать освещен­ными цветные объекты, то следует установить

Суммируем полученные сведения в программе studex52.

Результат работы программы studex52 показан на рис. 10.3.

Рис. 10.3. Моделирование освещения (свет справа сверху)

10.5. Стандартные объемные формы

В OpenGL предусмотрены некоторые стандартные, наиболее часто исполь­зуемые трехмерные объекты. Набор таких форм представлен в библиотеке GLU (Utility Library), которая реализована в виде модуля giu32.dll и являет­ся неотъемлемой частью OpenGL. Она включает в себя несколько функций управления проекциями (одну из которых — gluPerspective мы уже исполь­зовали), функции работы с полигонами, кривыми и поверхностями типа В-сплайнов и другие функции.

Рассмотрим функции gluCylinder, gluSphere, gluDisk И gluPartialDisk (рис. 10.4—10.7).

Перечисленные объекты названы "quadric objects". Параметры slices и stacks определяют количество плоских граней, используемых для аппрокси­мации поверхности. Для того чтобы нарисовать подобный объект, необхо-

Рис. 10.4. Цилиндр

Рис. 10.5. Шар

Рис. 10.6. Диск

Рис. 10.7. Часть диска

димо вызвать функцию giuNewQuadric, а после рисования освободить память ВЫЗОВОМ функции gluDeleteQuadric.

По умолчанию каждый объект рисуется со сплошным заполнением. Изме­нить СТИЛЬ показа МОЖНО ВЫЗОВОМ функции gluQuadricDrawStyle. МОЖНО за-

дать такие стили показа — в виде точек, расположенных в вершинах много­угольника, каркасное изображение, сплошное заполнение и силуэт (разно­видность каркасного). Например, вызов

дает каркасное изображение.

Объекты данного типа располагаются в пространстве в центре координат (0, 0, 0) с учетом матрицы glmodelview. Поэтому, чтобы нарисовать изобра­жение объекта в требуемом месте, нужно соответствующим образом изме­нить эту матрицу, например, С ПОМОЩЬЮ функций glTranslate И glRotate.

Нижеприведенный пример иллюстрирует показ объектов типа "quadric

objects".

Файл studex53. срр:

Т); , 40);

tion);

Изображение в окне программы studex53 приведено на рис. 10.8.

Рис. 10.8. Цилиндры, шар и диск

При подготовке этого рисунка к печати был изменен цвет фона на белый. Однако на экране монитора синий цвет выглядит значительно лучше (в тек­сте программы: giciearColor(0, 0, 0.5, l.0f)).

10.6. Текстура

В OpenGL имеется достаточно полный набор средств для построения тексту-рированных изображений.

В качестве текстуры можно использовать растровое изображение. Оно может быть одномерным или двумерным. Для наложения текстуры необходимо вы­полнить несколько операций.

1. Сначала открыть в памяти массив, в котором будет храниться растр тек­стуры. Число байт массива рассчитывается исходя из количества бит на пиксел текстуры. Размеры растра текстуры обязательно должны быть равны степени двойки (плюс несколько пикселов на бордюр). Это требо­вание создает некоторые неудобства для программиста, особенно в слу­чае, когда текстура может быть прочитана из произвольного растрового файла. Впрочем, это не является неразрешимой проблемой — любой растр текстуры можно либо обрезать, либо растянуть (сжать) до требуемых раз­меров.

2. Заполнить массив текстуры. Здесь следует учитывать то, в каком формате представлен растр текстуры. Если пикселы текстуры представляются в формате RGB (24 бита на пиксел), то байты в массиве должны распола­гаться в виде троек (R, G, В). Заметим, что в массивах DIB Windows API цветовые компоненты располагаются в обратном порядке, то есть (В, G, R).

3. После того как массив открыт, нужно передать OpenGL адрес массива и другие его параметры. Делается это вызовом функции giTeximage2D для двумерной текстуры и giTeximageiD для одномерной

4. Затем можно задать параметры фильтрации текстуры (вызовом функции glTexParameter) для качественного отображения объектов различных раз­меров.

Характеристики

Тип файла
Документ
Размер
570,5 Kb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6367
Авторов
на СтудИзбе
310
Средний доход
с одного платного файла
Обучение Подробнее