OpenGL. Руководство по программированию (Библиотека программиста) (2006). Ву М., Девис Т., Нейдер Дж., Шрайнер Д (1124475), страница 95
Текст из файла (страница 95)
Первый контур подразумевает тип 6(0 ЕХТЕМ1ОМ. Ориентация (по часовой стрелке нли против) выбирается произвольно в трех измерениях; однако для любой плоскости возможны две различные ориентации, поэтому типы 6С0 ССИ и 6С0 СИ должны использоваться непротиворечиво. Используйте 6С0 0МКМОИМ, если не знаете что делать. Строго рекомендуется преобразовывать код С1() 1.0/1.1 к новому интерфейсу тесселяции С1Л 1.2 в следующем порядке: Поверхности второго порядка: сферы, цилиндры и диски 431 1.
Измените тип ссылки на главную структуру данных с СЪЮсг(ап801агогОЪ) на ИЛ)сеззе!асог. В СЪ() 1.2, СШсг(ап801асогОЪ) и С1.Псеззе1асог являются одним и тем же типом. 2. Разделите вызов В1ивеВ1пРо1укоп () на две команды: В10Тез зВек1пРо1увоп () и н1итеззВек! пбопсоиг(). Все контуры, включая первый, должны быть явно начаты. 3.
Распределите обязанности В1ииехССоптоиг() между В1отензЕпабоптоиг() и н1итеззвек! пбопсоигО. Вы должны закончить предыдущий контур перед началом описания следующего. 4. Преобразуйте В1иЕпоРо1убопО в В1иТеззЕпсбопсоог() и к1итеьзЕпаРо1укоп (). Конечный контур должен быть замкнутым. 5. Переопределите применение параметров в В\оТеззба11оасх(). В С(.П 1.2 6с0 ВЕ61И, 6С0 НЕкТЕХ, 6С0 ЕЙО, 6С0 Еккок и 6(0 ЕО6Е РСЯ6 считаются синонимами 6(0 ТЕ55 ВЕ61И, 600 ТЕ55 НЕПТЕХ, 6С0 ТЕ55 ЕНО, 600 ТЕ55 ЕВРОП и 610 ТЕ55 ЕВОЕ РСА6.
Поверхности второго порядка: сферы, ЦИЛИНДРЫ И ДИСКИ Основная библиотека ОрепСЪ предоставляет поддержку для моделирования н отображения простых точек, линий и выпуклых закрашенных многоугольников. Ни ЗЕ)-объектьь ни наиболее часто используемые 2Г)-объекты, такие как окружности, непосредственно недоступны. На протяжении всей книги трехмерные объекты создавались с помощью библиотеки С1.()Т.
Библиотека СШ также предоставляет средства для моделирования н мозаичного разбиения, аппроксимации многоугольниками разнообразных 21)- н 31)-фигур (сфер, цилиндров, дисков и неполных дисков), которые могут быть ебсчитаны уравнениями второго порядка. К таким средствам относятся процедуры для рисования поверхностей второго порядка (квадратичных) с различными стилями и ориентацией. Квадратичные поверхности удовлетворяют следующему общему уравнению: ах' + а2Ус + азг' + а4хУ + а»Ух + ахи + а,х -> а»У + а»з + ам - О.
(См. Ргосег)ига! Е!етепсе )ог Сотригег Стаи!сх Дзвида Роджерса (Е)анЫ Нойегз), Нью-йорк, издательство МсСгач -Н111, 1985.) Создание и отображение поверхностей второго порядка напоминает тесселяцию. Порядок использования квадратичных объектов следующий: 1. Чтобы создать квадратичный объект, используйте команду я1океийиас г1с (). 2. Задайте атрибуты воспроизведения объекта (если вас не устраивают значения по умолчанию): о используйте В10Опао г1сог 1' ел с а с)оп () для управления направлением «намотки» и для разграничения внутренней и внешней областей; 432 Глава 11 ° Мозаичное представление н поверхности второго порядка о используйте Р1ийиаиг(срган5(у1е() для выбора между воспроизведением объекта в ниде точек, линий или закрашенных многоугольников; о для освесценных квадратичных объектов используйте я1иОиас) г1сйогва1з О для указания одной нормали на вершину или одной нормали на грань.
По умолчанию нормали не генерируются; о для текстурных квадратичных объектов используйте к1иОиас) г1стехси ге(), если хотите генерировать координаты текстуры. 3. Подготовьтесь к потенциальным проблемам — зарегистрируйте обработчик ошибок с помощью я1ийиаи г! сСа11Ьасй () . Тогда при возникновении ошибки в процессе воспроизведения будет вызвана указанная вами процедура. 4. Затем вызовите процедуру для воспроизведения, соответствующую типу квадратичного объекта: я1и5рпеге О, к1иСу11пиег(), к1иРт ах О или к1иРаг(1а1- О( зй(). Чтобы увеличить производительность для статичных данных, инкапсулируйте квалратичный объект в список отображения.
5. По окончании работы с квадратичным объектом уничтожьте его с помощью вызова я1иве1е сейиаи г(с () . Если вы намерены обрабатывать другие фигуры второго порядка, лучше повторно использовать уже имеющийся квадратичный объект. Управление квадратичными объектами Квадратичный объект определяется значениями аргументов, атрибутов функциями обратной связи. Все эти данные сохраняются в структуре типа С1Л)с)иас)г(сОЬ)1 Квадратичный объект может генерировать вершины, нормали, координаты текстуры и другие данные, которые все могут быть использованы сразу же или быть сохранены в списке отображения для последующего применения. Представленные ниже процедуры отвечают за создание, уничтожение квадратичного объекта и за сообщения об ошибках в процессе воспроизведения.
СШс)иас(г)сОЬ)* Р1ийенОиас) гас(чоЫ); Создает новый квадратичный объект и возвращает указатель на него. При неудаче возвращается нулевой указатель. чоЫ к1ире1е(еОиас(г1с(СП~с)иас(г(сОЪ) *с)оЬ)); Разрушает квадратичный объект (с)о(у) и освобождает занимаемую им память. чоЫ к)иОиас)г1сСа11Ьасй(С11)с)иас)г(сОЬ) 'с)оЬ), С1епшп тй(сл, чоЫ (*/и)О); Определяет функцисо обратной связи (1и), вызываемую при особых обстоятельствах.
Константа 61О Е РРОР— зто единственное возможное значение для аргумента со)с(с)с, позтому (п вызывается в момент возникновения ошибки. Если значение /п равно йв11, из обработки исключается существующая функция обратной связи. Для 61и ЕРРОР функция )и вызывается с одним аргументом — кодом ошибки. Для преобразования кода ошибки в АБСП-строку можно использовать команду к1иЕггог5(г1пао. Поверхности второго порядка: сферы, цилиндры и диски 433 Управление атрибутами квадратичных объектов Следующие процедуры имеют отношение к данным, генерируемым процедурами квадратичных объектов. Используйте их до того, как будете задавать примитивы.
Листинг 11.4, программа диас г ! с . с, демонстрирует изменения стиля рисования и вида генерируемых нормалей, а также создание квадратичных объектов, обработку ошибок и рисование примитивов. тоЫ 61цйцасг!согаи5(у1е(СШг)наг)г!сОЬ)»доЬу, С(епшп йагалсу1е); Управляет стилем (йаю5гу1е) воспроизведения квадратичного объекта (доЬ|). Допустимые значения стиля: 6(0 Р01МТ, 6Е0 (1МЕ, 610 51сНООЕТТЕ и 6(0 Е1(с.
Константы 6(0 Р01МТ и 6(0 (1МЕ указывают, что примитивы должны быть отображены как точка в каждой вершине или как линия, соединяющая пару вершин. Константа 6с0 51сНООЕТТЕ указывает, что примитивы отображаются как линии, вв исключением ребер, разделяющих соседние грани, которые не отображаются.
Данный вариант часто используется командами 61е0! зК() и 61иРа гт! а10! в К () . Константа 6Е0 Р11( указывает, что отображение выполняется закрашенными многоугольниками, которые рисуются против часовой стрелки с учетом своих нормалей. Это может быть эффективно для 61ойиабг!сОг1ептэсвоп(). той 61цОц ап г ! с Ог ! ептат! оп(СШ«)пас(г(со(0 "аоЬ) С)епшп опепгас(оп) Для квадратичного объекта (уоЬ)) аргументу опепгаг(оп может быть присвоено значение 6(0 00Т510Е (наружу — по умолчанию) илн 6(0 1М51РЕ (внутрь); эти константы управляют направлением нормали.
Для 61и5рпегео (сферы) и 61ису1!ооего (пилиндра) понятия «наружу» и «вовиутрь» очевидны. Для 61оО! вк() и 61иРагт! а10! в к() (диска) сторона с положительным значением г является наружной. тоЫ 61иОи ао г ! ей о гюа1з(СШццаг)г(сОЬ)»доЬ~) С1 епшп поппа(л); Для квадратичного объекта ()оЬ) аргумент «нормали» (пег»па)л) — 600 йОМЕ (по умолчанию), 610 Р(АТ или 6(0 5НООТН. Функция 61иОоао г ! сйогюа1з () используется для указания того, где генерируются векторы нормалей. Константа 6(0 МОНЕ означает, что нормали не генерируются, и нацелена на использование без освещения. Константа 6 с 0 Р ЕАТ соответствует одной нормали на поверхность — это часто предпочтительно для имитации освещения с «плоским» затенением.
При задании 6(0 5НООТН генерируется одна нормаль на каждую вершину квадратичного объекта; такой вариант подходит для освещения с плавным затенением. чоЫ 61цйоапг!стех(иге(С(.()г)наг)г!со)) 'доЬ), С) Ьоо!сап ГехтагеСооп6); Для квадратичного объекта доЬ1 аргумент ГехсигеСоопй задается равным 6с ЕА(5Е (по умолчанию) или 6( ТРОЕ. В последнем случае для квадратичного объекта генерируются координаты текстуры. Манера, в которой это делается, зависит от типа квадратичного объекта. 434 Глава 11 ° Мозаичное представление н поверхности второго порядка Квадратичные примитивы Следующие подпрограммы непосредственно генерируют вершины и другие данные, составляющие квадратичный объект. Во всех случаях аргумент с7оЬ)' ссыла.
ется на квадратичный объект, созданный вызовом к1оиенйово г1с () . чок) к1о5рлеге(СШс)пабг1сОЪ) *с)оЬу, 01с1опЫе гайик, 01.(пт йсет, СЫпт ьтасЬг); Рисует сферу с заданным радиусом (гайиг), с центром в начале координат (О, О, 0). Вокруг оси г сфера разбивается на элементы гйсез (подобные географической долготе), а вдоль оси г — откладывается количество згасЬз (аналог географической широты). Если координаты текстуры генерируются средствами квадратичного объекта, г-координата принадлежит диапазону от 0.0 при г - — гайиз до 1.0 при г = гойи, и г наращивается линейно вдоль продольных линий.
При этом значение я лежит в диапазоне от 0.0 для оси +у, до 0.25 — для оси +х, до 0.5 — для оси -у, до 0.75 †д оси -х и назад до 1.0 — для оси +у. чек) я1оСу11 пает(01Л)с)пж)псОЪ) 'аоЬ) СЫоцЫе ЬаиЯайиз, СЫопЫе горЯайиг, 01х)опЫе Ье(йЬг, Свйпс сйсед 0?гпг згасЬз); Рисует цилиндр, ориентированный вдоль оси г, с основанием г = 0 и верхней гранью в г = Ье1яЬг. Подобно сфере, цилиндр разбивается на гйсез вокруг оси г и вдоль этой оси откладывается количество згасЬз. Аргумент ЬазеЯайиг — это радиус цилиндра в основании (г - 0). Аргумент горЯайиз — радиус цилиндра в его верхней точке (г - Ье1яЬг).