М. Ву, Т. Девис, Дж. Нейдер, Д. Шрайнер - OpenGL. Руководство по программированию (Библиотека программиста) (2006) (1124363), страница 93
Текст из файла (страница 93)
Чтобы выполняться под ЧУ)пбоч/з, программы, объявляющие функции обратного вызова, наподобие (евз.с, требуют указания обозначения САССВАСК прн объявлении функций. Если указать пустое определение С/1ССВАСК (как ниже), зто позволит коду одинаково хорошо запускаться как в М(егози(( уу(пбочкв, так н в ОН(Х: №!Риде( СА««ВАСК №Пет!пе САССВАСК №епд!т чо(и СА(КВАС« са11Ьас«гипс(!оп(...) ( В листинге 11.1 для параметра обратной связи 6«О ТЕ55 уЕПТЕХ просто зарегистрирована команда к1уегтехЗОч(), и передаются только координаты каждой иршины. Если вы хотите задать болыпе информации для вершин, например цвет, пормаль к поверхности или координаты текстуры, вам требуется более сложная процедура обратной связи.
Листинг 11.2 включает в себя начало другого объекта Разбиения, полное описание находится в примере тезз.с. Здесь зарегистрироилная функция чегтехСа11Ьас«() ожидает поступления аргумента, являюще- ксЯ Указателем на шесть значений с плавающей запатой двойной точности: хъ У- и г-координаты и значения красного, зеленого и синего компонент цвета вершины.
Л Регистрация функций обратной связи "/ и(Е САССВАСК чегтехса11Ьас«(6«чо!Ь *чегтех) продолжение р йистииг 11.2. Функции Р Другая часть блока 11иТеззСа11ЬасК(тоЬ), 1(иге»са(1Ьас«(соь), 11итеззса11Ьас«(гоо), )ШТеззСа\1Ьас«(СоЬ), 11иТе55Са11Ьас«(соЬ), Мозаичное представление многоугольников 421 обратной связи для вершин и объединения (согпЬ(пе); гевз.с инициализации !п! 1() */ 6СО ТЕ55 ЧЕКТЕХ, чегсехСа11Ьас«); 6СО ТЕ55 ВЕ61К, Ьеп(пса11Ьас«): 6СО ТЕ55 ЕНО, епдса11Ьас«); 6СО ТЕ55 Еййо«, еггогСа11Ьас«); 6СВ ТЕ55 СОНВ1ИЕ, сошЬ(песа11Ьас«); 422 Глава 11 ° Мозаичное представление и поверхности второго порядка Листинг 11.2 (продолжение) ( сопвС 6)боаЫе 'ро]псег; ро1п(ег = (6(боаЫе *) чегсех; В[Со[огЗбч(ра]псег+3); Х['чегСехЗбч(чеггех); ) чо1б САССВАСК сапы пеСа[\Ьаск(6(боаЫе соогбв[3], 6СбоаЫе "чегСех баСа(4], 6(1[оаС не!вас[4], 6(боаЫе '*баСаоиС ) ( 6ьбааЫе 'чегсех; !пс чегСех = (6(боаЫе *) па[[ос(6 * в!аеас(6(боаЫе)); чегтех[О) = сбегав[0]; чегсех[1) = саогба[1]; чегсех[2) = соогба[2]; тог (1 = 3; ! < 6; 1++) чегсех(1] = ив[ВЫ (8] ' чег(ех ба(а[0][1! + ие]вас[1] * чегсех баса[1][!] + ие! аЫ (2] * чегсех баСа[2] [1] + ие!ВЫ [3] ' чеггех бага[3][!]: 'баеаоаС = чегеех; ) Листинг 11.2 также демонстрирует использование функции обратной связи 6И ТЕ55 СОМВ[МЕ.
К этой функции происходит обращение всякий раз, когда алгоритм тесселяции, анализируя входные контуры, обнаруживает пересечение я принимает решение о создании вершины. Она же вызывается, когда тесселятор решает объединить две вершины с практически одинаковыми координатами. В листинге 11. 2 новая вершина является линейной комбинацией четырех существующих — оегсех Нага[0..3]. Коэффициенты комбинирования находятся в массиве весов сбе[й)сг~0..3$ сумма этих весов равна 1.0. В массив соагс[в помещаются координаты новой вершины.
Зарегистрированные процедуры обратной связи должны выделить память для другой вершины, выполнить взвешенную интерполяцию данных на основе данных пеггех !соса и ше!я)сг и вернуть указатель на новую вершину в переменной сса(а(лас Функция соа~нпеСа[[ЬасК() из листинга 112 интерполирует ВСВ значения цвета. В начало массива из шести элементов помещаются хп у- и г-координаты, а взвешенные средние КСВ-компонентов заносятся в последние три элемента.
Данные, определяемые пользователем Зарегистрированы могут быть функции обратной связи шести различных типов. Поскольку для каждой функции имеется две версии, всего получается 12 вызовов. Для первой версии данные определяются пользователем. Эти данные передаются приложением в функцию В1итевзВеВ]про[уйоп() и далее проходят, ос. таваясь неизменными, каждую процедуру обратной связи "ВАТА. С 610 ТЕ55 Р)озанчное представление многоугольников 423 3161М ВАТА заданные пользователем данные могут быть применены для отдельных многоугольников. Если указаны обе версии процедуры обратной связи, используется вызов изег с?ага, а другой игнорируется. Таким образом, хотя существует 12 вариантов, одновременно активны могут быть не более шести из них. Тпк, в листинге 11.2 используется плавное затенение, и процедура чегсехСа11озсх() зшгает НОВ-цвет для каждой вершины.
Если вам нужно реализовать освещение и плавные переходы при выводе теней, для функции обратной связи следует указывать нормаль к поверхности для каждой вершиггы. Вместе с тем при необходиностн в освещении и «плоском» (однотонном) затенении достаточно указать только одну нормаль на многоугольник, но не для всех вершин. В атом случае вам следует выбрать функцию 610 ТЕ55 ВЕ61М ОАТА и передавать координаты вершины и нормаль к поверхности по указателю иьег с(а(а. Свойства мозаичного разбиения Перед тем как выполнить тесселяцию и воспроизведение, вы можете использопать к1игеззРгорегсу() для установки свойств, имеющих отношение к алгоритку тесселяции. Самое важное и сложное из зтнх свойств — правило «намотки» (гчгпс?гпй гп?е), определяющее, что следует считать находящимся «внутри» многоугольника, а что — «снаружи». чу к1оте з з Р горе гсу(О??)геззе?асог *Мзгоф, С? еппш рпгре»ПА О?х?оное оа?ие); Устанавливает значение (оа?ие) свойства (ргорегпу) для объекта разбиения (ГезгоЬ~).
Свойство указывается константами 610 ТЕ55 ВООМОАРу ОМ(у, 6СО ТЕ55 ТОСЕКАМСЕ или 6(0 ТЕ55 И1М01М6 РОСЕ. Если указано свойство 610 ТЕ55 ВООМОАРУ ОКСУ, его значением может быть 61 ТРОЕ или 61 РА15Е. В первом случае многоугольники не разбиваются на многоугольники с заполнением; рисуются лишь контуры, разграничивающие внутреннюю и внешнюю части многоугольника. Значение по умолчанию— 61 ГА(5Е. (См. к1отеззногша1() для получения более подробной информации.) Если указано свойство 6СО ТЕ55 ТОСЕКАМСЕ, его значением является расстояние между двумя вершинами, удовлетворяющими требованию близости расположения.
Такие вершины могут быть объединены функцией обратной связи 610 ТЕ55 СОМВ1МЕ. Чтобы выяснить максимальное расстояние между вершинами, нужно умножить значение допуска на наибольшую разницу координат для поступивших на обработку вершин.
Возможность объединения вершин поддержана не во всех реализациях, позтому значение допуска следует расценивать как рекомендованное. Допуск по умолчанию равен нулю. Свойство 610 ТЕ55 И1М01М6 КОСЕ определяет, какая часть многоугольника является «внутренней», а какая — «наружной» и, соответственно, не подлежащей заполнению, Аргумент оа?ие здесь может быть одним из следующих значений: 6СО ТЕ55 И1М01М6 000 (по умолчанию), 6СО ТЕ55 И1М01М6 МОМЕЕКО, 600 ТЕ55 И1М01М6 РО51Т?УЕ, 6СО ТЕ55 И1М01М6 МЕОАТХУЕ или 610 ТЕ55 И1МОХМ6 АВ5 6ЕО ТИО.
424 Глава 11 ° Мозаичное представление и поверхности второго порядка Число «витков» и правило «намотки» Для одиночного контура число «витков» (т»1пс11пд пц1пЬег) точки — это знаковое число оборотов вокруг нее при однократном обходе контура (обходу против часовой стрелки соответствуют положительные значения, по часовой стрелке — отрицательные).
В случае нескольких контуров отдельные числа витков складываются. Эта процедура связывает целое знаковое число с каждой точкой плоскости. Заметьте, что число витков одно и то же для всех точек отдельно взятой области. На рис. 11.2 показаны три набора контуров и их числа витков для точек внутри этих контуров. В левом наборе контуры обхолятся против часовой стрелки, соответственно, каждая вложенная область добавляет елиницу к числу витков. На среднем рисунке два внутренних контура обходятся по часовой стрелке, и их число витков декрементируется и становится отрицательным.
Рис. 11.2. Примеры контуров дпя демонстрации понятия числа витков Правило намотки классифицирует область как внутреннюю, если число витков соответствует категории: четное, не нуль, положительное, отрицательное или «абсолютное значение, большее или равное 2». Обычно четные и ненулевые числа свидетельствуют о «внутреннем» характере области. Остальные варианты имеют ограниченное применение для СЯО- (сопзггпс11»е зо11о яеотеггу — конструктивная блочная геометрия) операций над многоугольниками. Программа-пример севзн1пп. с из состава установочного пакета Орепб1. демонстрирует использование правила намотки. На рис.
11.3 отображены четыре набора контуров. Темные участки на рисунке представляют внутренние области. Обратите внимание на то, как влияет на интерпретацию контура направление его обхода. Правила намотки в конструктивной блочной геометрии Больше других бывают востребованы параметры 6И ТЕ55 И1й01й6 000 и 6ЕО ТЕ55 И1й01й6 йОй1ЕйО. Они находят применение в наиболее типичных случаях затенения. Правила намотки также применяются в конструктивной блочной геометрии (СБО), где онн облегчают поиск объединений, разностей или пересечений (булевы операции) нескольких контуров. Мозаичное представление многоугольников 425 Рис. 11.3. Как правила намотки определяют внутренние области Для начала сделаем допущение, что для каждого контура число витков равно О для любой внутренней области и равно 1 для всех внешних областей.
(Контур пе должен быть самопересекаюшимся.) Согласно этой схеме контуры «против часовой стрелки» соответствуют внешним границам многоугольника, а контуры «по часовой стрелке» вЂ” дырам. Контуры могут быть вложенными, причем вложенный контур должен быть ориентирован противоположно наружному. 42В Глава 11 ° Мозаичное представление и поверхности второго порядка Если оригинальные многоугольники не удовлетворяют этим допущениям, они могут быть предварительно преобразованы к этой форме посредством тесселяции со включенным свойством бьц ТЕ55 ВООМОАМУ ОМЕР.