М. Ву, Т. Девис, Дж. Нейдер, Д. Шрайнер - OpenGL. Руководство по программированию (Библиотека программиста) (2006) (1124363), страница 97
Текст из файла (страница 97)
Средства Х() КВЗ библиотеки С1Л) — как раз такой интерфейс. Процедуры Х()КВ5 инкапсулируют в себе большой объем сложного хода. Конечное отображение обычно выполняется вычислителями, но в некоторых ситуациях, например при вырезании (Гг1шпппя) кривых, Х()КВЯ-процедуры используются для воспроизведения плоских многоугольников. Зта глава содержит следующие основные разделы: ° Необходимые знания. Здесь говорится, какие знания вы уже должны иметь для чтения этой главы. Здесь также приводятся несколько ссылок на дополнительные источники информации. ° Вычислители. Рассказывает, как работают вычислители и как ими управлять с помощью команд ОрепС1.. ° Интерфейс Х1)КВЯ библиотеки СШ. Описывает процедуры СШ для создания Х()КВЯ-кривых и поверхностей, их воспроизведения и возврата информации для вершин, полученных при мозаичном разбиении.
440 Глава 12 ° Вычислители и йый95 Необходимые знания Вычислители рассчитывают сплайны и поверхности, основанные на кривых Бе- зье (или на полиномах Бернштейна). В этой главе приводятся определяющие уравнения, но обсуждение не отклоняет- ся от основной линии и даже не включает в себя перечисление всех интересных свойств этих объектов. Если вы хотите использовать вычислители для рисования кривых и поверхностей с помощью других базисов, вы должны уметь выполнять их преобразование к базису Безье. Кроме этого, когда вы воспроизводите поверх- ность Безье или ее часть с помощью этих вычислителей, вам нужно определиться с детализацией разбиения. Ваше решение должно быть направлено в сторону компромисса между качеством разбиения изображений и быстродействием.
Вы- работка соответствующей стратегии разбиения может оказаться весьма непро- стым делом, даже чересчур сложным для обсуждения в рамках книги. Соответственно, подробное обсуждение !«1ЖВБ также выходит за «область вн. димости» этой книги. Выдержки из документации к интерфейсу СШ ЫПКВ5 н примеры программ, представленные здесь, ориентированы на читателей, уже зна- комых с предметом. То есть вы уже должны иметь представление о контрольных точках Х(!КВБ, последовательностях узлов (Ьпотз) и вырезании (спшш!пя) кривых.
Если вы еще не имеете таких знаний, обратитесь за помощью к следуюгцим руко- водствам; ° Фарии Джеральд (Рапп бега!д Е.), Сцгоез алг! Вит~асез /от Сотригет-АЫе3 Сеотеггтс 1)езКп, РоцггЬ Ег!!г!оп, Бап П!сяо, СА: Асадегп!с Ргезз, 1996; ° Фарии Джеральд (Рапп, бега!а Е.), Аг(ГВВ Сикоев алг! Зитуасегкутогл Рте)есгив Сеотепу го Ртасйса! (гзе. тдгеИез!еу, МА: Л. К. Ретегз 1.гг!., 1995; ° Фарии Джеральд (Рапп, бега!6 Е., ег[!тог), 1»'(уйВВ [от Ситце апг1 5ит~асе йеяял, Яос!ету 1ог 1пг!цзгг!а! апг[ Арр!!ед МаГЬешат1сз, РЬ!!ас[е!рЬ!а, РА, !991; ° Хосчек Джозеф (НозсЬеЬ, [озе() и Дитер Лессер (1)!егег Еаззег), Риис(атепгай оу Сотлрцгет АЫег1 СеотлегПс Т!еядп. У»гейез[еу, МА: Л.
К. Регегз Егг!., 1993; ° Пигл Лес (Р!ей!, 1.ез) и Уэйн Тиллер (»Чаупе Т!!!ег), ТАе А11ГйВ5 Воо)с Лев Уогй, ХУ: Брг!пдег-Уег1ая, 1995, ПРИМЕЧАНИЕ Некоторые термины, употребляемые в этой главе, могут выступать в несколько ином значении относительно другой литературы по сплейнвм, кривым н поверхностям, поскольку полное со. гласне среди практиков в этой области не достигнуто. Вообще говоря, терминология здесь оп твлкнвается от возможностей Орепбц Например, вычнслнтелн Ореппь всегда опираются нз кривые Безье; в целом же вычислитель вправе использовать произвольный базис, Вычислители Кривая Безье — это векторнозначная (уес1ог-ча!пег[) функпия одной переменной: С(и) =- [Х(и) У(и) Х(и)), Вычислители 441 где и изменяется в некоторых прелелах (скажем, в интервале (О, 1]).
Лоскут (рагсЬ) поверхности Безье — это векторнозначная функция двух переменных: В(и,о) - [Х(и,о) ьг(и,о) Е(иго)]. где и и о варьируются в некоторых пределах. Область не обязательно должна выть трехмерной, как показано здесь. Вы вправе применить двухмерный вывод и[я кривых на плоскости или координаты текстуры, или же четырехмерный вывод для передачи ВОВА-информации. Даже одномерный вывод может иметь смысл для градаций серого. )ьпя каждого значения и (или и и о, в случае поверхности) формула лля С() (или 5()) вычисляет положение точки кривой (или поверхности).
В этом случае вычяслители сначала определяют функцию С () или 5 (), включают ее, и затем уже обращаются к команде к1Еча1Соога1О или а1Еча1Соогд2О вместо Крег(ех'и. 3десь вершины кривой или поверхности могут использоваться, как и любые друще вершины, например, для формирования точек или линий. Кроме того, другие команды автоматически генерируют серию вершин, образуюгцих однороднуго пе[)иодическую сетку по и (или по и н о). Одномерные и двухмерные вычислители действуют аналогично. А поскольку одномерный случай проще для понимания, уждение мы начнем именно с него.
дномерные вычислители агом подразделе прелставлен пример использования одномерного вычислите- для рисования кривой. Приьгер включает в себя команды и уравнения, управющие вычислителем. ример: простая кривая Безье рограмма, приведенная в листинге 12.1, рисует кубическую кривую Безье по чеем контрольным точкам, как показано на рис. 12.1. Рис. 11.1.
Кривая Безье миг 12.1. Кривая Безье для четырех контрольных точек: Ьехсигче.с Воат сгг1ро!пга [4] [3) = ( ( -4,0, -4.0, 0.0), ( -2.0, 4.0, 0.0), [1.О, -4.Е, О.Е). (4.Е, 4,О, Е.О)); 14 1п11(чо1д) 11(1еагоо1ог(в.о, 0.0, О.Е, О.Е): продопженое,п 442 Глава 12 ° Вычислители и П[[]МВБ Листинг 12.1 (продолжение) 815Пабеиобе1(6С ЕСАТ); 81иар11(6С НАР1 ЧЕМТЕХ 3, 0.0, 1.0. 3, 4, астг)ро1пСь[0][0]); 81Епап)е(61 МАР1 ЧЕМТЕХ 3); ) чо]б 6(ьр1ау(чо)б) ( 1пс 1; 81С(еаг(61 СОСОН ВОЕЕЕН В[Т); 81Со1огЗГ(1.9, 1.0, 1.0); 818е81п(6с с]МЕ 5ТМ1Р); Гог (1 = 0; 1 <= 30; 1++) 91Еча1Соогб11((6С11оаС) 1/30.0); 81Епб(); /' Код, отображающий контропчные точки '/ 81Ро1пС5(ге(5.9); 81Со1ог31(1.9, 1.9, 0.0); 818еа]п(61 Р01МТ5); Гог (1 = 0; 1 < 4; 1++) В[Чегеех31ч(астг1ро1пеа[1][0]): 81Епб(); 81Е1иьП(); чо(б геаларе(1пС и, 1пС П) ( 81Ч(еирагС(8, 9. (6(ь1се)) и, (6181се1) П); В\На(г(хиобе(6С РНО)ЕСТ10М); 81(оабЕбепС(Су(): 11 (и <= П) 810гСПо(-5.8, 5.9, -5.9*(6СГ]оас)п/(611[оат)и, 5.9'(6СЕ)оаС)П/(6(Г)оаС)и, -5.0, 5.0); е1ае 910<СПо(-5.9*(611)оаг)и/(611[оаС)П, 5.8"(6111оаС)и/(6111оаС)П, -5.0.
5.0, -5.9, 5,0): 81иаСг(хиобе(6С НООЕСЧ1ЕИ); а[Соаб]бепС(гу(); (пс юа1п((пС агВс, слаг** агйч) ( 81ЧС1п11(аагвс. агйч): 81иС[п1СО(ар1ауиобе(6СОТ 51МОСЕ [ ОСОТ М68); 81оС1п1СИ(пбои5(ае(509, 500); 81ЧС1п1СИ(пбоиРо<111оп(100, 190); 91цССгеатеИ1пбои(агвч[9]); (п(С(); 81иС01ар1ауропс(б(ьр(ау); 81отйеалареропс(геаларе); 81отиа1пСооР(); гетогп 0; Вычислители 443 Кубическая кривая Безье описывается четырьмя контрольными точками, в на- шем примере — массивом ссг1ро(пса [) [). Этот массив подается на вход про- цедуре В1нар11(). Другие ее аргументы следующие: 6! МАР1 НЕДТЕХ 3 Устанавливает, что используются трехмерные контрольные точки и что должны быть образованы трехмерные вершины 0.0 Нижнее значение параметра и Верхнее значение параметра и Количество значений с плавающей точкой в данных между последовательными контрольными точками 1.0 4 Порядок сплайна, то есть порядок кривой плюс 1: в нашем случае степень кривой равна 3 (кубическая) Ыг(ро(ли(ОЦО) Указатель на данные первой контрольной точки Заметьте, что второй и третий аргументы управляют параметризацией кривой— диапазон переменной и (от 0,0 до 1,0) соответствует всей кривой от ее начала до конца.
Вызов В1Епаб(е() разрешает применение одномерного вычислителя для трехмерных вершин. Кривая рисуется процедурой си зр1ау() — ее частью между командами В1ВеВ1п() х В1Еп6(). Поскольку вычислитель включен, команда В1Еча1соог61т() просто влечет вызов В1Не г тех () с координатами вершин кривой, соответствующих вход- кому параметру и. Определение одномерного вычислителя и вычисления для него Многочлен Бернштейна степени и (или порядка и ч- 1) выглядит следующим образом В,"(и) = — и' (1 — и)" Если Р,. — это набор контрольных точек (одномерных, двух-, трех- и даже четы- рехмерных), уравнение С(и) = ~~ В,"(и)Р,. представляет кривую Безье, где и изменяется от 0.0 до 1.0. Чтобы представить эту ке кривую, но с диапазоном для и от и, до и,, вычислим с(" "' ).
чо!6 В1наР1[[с[)((т[.епцш (агап ТУРЕ и1, ТУРЕ и2, 6).шт хтгЫе, (х).[пг оптег, сопл( ТУРЕ "рот1з); Определяет одномерный вычислитель. Аргумент гагйег задает, как представ- ляются контрольные точки, как показано в табл. 12.1, и тем самым указывает, сколько значений соответствует массиву роиих Эти точки могут быть пред- Команда В1нар1() определяет одномерный вычислитель, используемый для этих вычислений.