М. Ву, Т. Девис, Дж. Нейдер, Д. Шрайнер - OpenGL. Руководство по программированию (Библиотека программиста) (2006) (1124363), страница 96
Текст из файла (страница 96)
Для 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яЬг). Если значение горЯайиз равно О, генерируется конус. Если координаты текстуры генерируются средствами квадратичного объекта, г-координата изменяется линейно от 0.0 при г - 0 до 1.0 при г = Ье(яЬг. Координата з текстуры генерируется так же, как для сферы. ПРИМЕЧАНИЕ Цилиндр не «закрывается» нн сверху, нн снизу, то есть диски в основаннн н в верхней точке не рисуются. чек) я1о01 зК(01Л)опас1ПсОЪ1 'с)о1у', 01х)онЫе 1ппегЯайиз, СЫопЫе оисетЯадла 01апс зЬсеж 015пт ппдз); Рисует диск в плоскости г = 0 с радиусом оигегЯайиз и концентрическим круговым отверстием радиусом (ппегЯайих Если 1ппегЯайиз равен О, отверстие не создается.
Диск разбивается вокруг оси г на количество «ломтиков» йоши (подобно ломтикам пиццы), а вдоль оси г — на концентрические кольца (ппяг). С учетом стандартной ориентации сторона +г диска считается наружной, то есть любые генерируемые нормали указывают в направлении +г. Иначе нормали направлены в направлении -г. Если координаты текстуры генерируются средствами квадратичного объекта, они изменяются линейно таким образом, что В - оитегЯайид значения координатз и гпри (К, О, 0) равны (1, 0.5), при (О, К, 0) — (0.5, 1), при ( — К,О, 0)— (О, 0.5) и при (О, -Е, 0) — (0.5, 0). Поверхности второго порядка: сферы, цилиндры и диски 435 чоЫ 81цраг11а10! ьК(С1Л3с[паг[г]сОЬ] "гуо]]], С(.допЫе [плешах[[из, С(х]опЫе оигегяааг[ць, С].[пг ь!]сеь, С(зп( плдь, С[к[оп Ые ьгакАп8(е, С)х[опЫе ьзвеерАпя]е)] Рисует неполный диск в плоскости з = О.
К неполному диску применимы те же термины, что и для полного диска: оисегйаг([из, тпегйаг((иь, ь[(сеь и ппяь. Разница только в том, что неполный диск рисуется от начального угла ьгаггАпд]е до ь(агГАпя]е + ьгееерАп8]е (ь(аг(Апре и ывеерАпфе измеряются в градусах, где 0' это осъ +у, 90' соответствует оси +х, 180' — ось -у и 270' — ось -х). Ориентация и координаты текстуры для неполного диска определяются аналогично полному диску.
ПРИМЕЧАНИЕ Дпя всех квадратичных обьектов лучше использовать *Наб!иь, Ье!ОП( и подобные параметры дпя масштабирования, чем команду д]бса)е*(], чтобы сгенерированные единичные нормали не приходилось нормализовать снова. Задавайте значения аргументов ппйь и ьтасхь отличными от 1 с целью лучшей гранупярности при расчете освещения, особенно если материал обладает высоким альбедо. Листинг 1[А показывает рисование каждого из квадратичных примитивов, а так- же влияние различных стилей. Листинг 1$.4. Квадратичные объекты: (]пзбг[с.с Ф11пбет САЕСВАСК а)е11пе САССВАСК Еепб]т 6[юпс ьсагсс(ьт; чо(б САССВАСК еггогса11Ьаск(6(епив еггогСобе) ( СОПЬ1 6СОЬУ1Е 'ЕЬСГ(ПВ; еьтг]пх = 91цЕггогьтг1пх(еггогсобе); 1Рг1п11(ьсбегг, "Ошибка хь)п", еь1г!пх); ех11(8): ) чозб 1п!1(чозб) ( 6(ечцабг1сОЬ3 'Ооо]; 6111оат ват авЫепт[] = ( 0.5, 0.5, 0,5, 1.9 ); 6((1оас ва1 ьреси1аг[] = ( 1.9, 1.9, 1.0, 1.9 ]; 6(11оат ват ьизп(пеьь[] = ( 58.0 6С11оат 11ВЬ1 роь]1(оп[) = ( 1.9, 1.8, 1.8, 0.9 ); 6СР]оаС вобе1 авЫепт[] = ( 0.5, 8,5, 8.5, 1.0 ); В161еагсо1ог(9.8, 8.0, 9.0, 9.0): 61иатег1а11ч(6( ЕЙОМТ, 6С АМВ1ЕМТ, ваг авЬзеп(); 91иа1ег!а1(ч(6С РНОМТ, 61 5РЕСОСАК, ва1 ьреси1аг); 91натег!а1(ч(6с гноит, 6( 5н1М1ме55, ват ьп1п! пеьь): 91(1ВЫтч(6С 116НТВ, 6С Р05]Т10М, 1!ВП1 РОЬз11оп); В]с)хи!небе]гч(6( 116нт нооес АНВ]ейт, вобе1 авыепт); продолжение Р Листинг 11.4 !продолжение) 91Е»аЫе(6С !16НТ1й6); 91Е»аЫе(6( !16НТВ); 91ЕпаЫе(6! ОЕРТН ТЕ5Т); / к Создает 4 списка отображения по числу квадратичных объектов.
Демонстрируются различные стили рисования и описания нормалей к поверхности '/ зтаг!С!зС = 916епН з!з(4); Оо»1 = 91ийендоабгтс(); 91идиабгтсса!1Ьасх(цо»1, 610 ЕРМОМ, еггогСаПЬаск); 91иОиабг!сОган5(у1е(цо»), 6!О Р?СС); /' плавное затенение */ В?иОиабгтсйогва1з(цоЬ), 6(0 5йООТН); 91йен!тзт(зтагс(тзт, 61 СОНР?СЕ); 91и5р»еге(поо), 0.75, 15, 19); 91Епб!тзт(): 91иОиабгтсрган5171е(цо»), 6(0 Р?СС); /' плоское затенение '/ В?иднабгтсйогва?з(йо»1, 610 РСАТ); 9!йенс!зт(з!агсстз!ъ?, 6( СОМР?се); 81ису1тпбег(цо»1, 0.5.
0.3, 1.0, 15, 5); 91Е»ос!5!(); 91оОиабгтсОган5су1е(роь?. 610 с?ме); /' каркас */ 91иОыабгтсМогва1з(поЬ?, 6(0 йОМЕ); 91йен(тз!(зтаг!Стзсе2, 6! СОНР?СЕ); 91оОтзх(йо»1. 0.25, 1.0, 20, 4); 91Е»б(ты(); 91иОиабг!срган5171е(цоь). 6СО 51(НООЕТТЕ); 91ибоабг!сйогва1з(цо»1, 6(0 МОНЕ); 9!Меч(тзт(з!агт!!з1+3, 6( СОНР?!Е); 91иРагтта10тзх(поЬ), 9,8, 1,0, 20, 4, 0.0. 225.8); 91Епб!.!зС(); уо!б о!яр!ау(хо!о) ( 91С1еаг(61 СОСОК ВОРРЕР 81Т ) 6С ОЕРТН ВОРРЕМ 81Т); В!Роз»натгтх(); 91Е»аЫе(6! С?6НТ?М6); В!5»абейобе?(6( 5НООти); 91тгапз1атег(-1 8, -1.9, 8.9); 91са11!!зс(зсаг!стас); 915»абеиобе1(6С РСАТ); В?Тгапз1атег(9.0, 2.0, 0.0); 91Риз»натгтх(); 91йоса!ет(390.0, 1.0, 0.9, 0.9); 91са11С! зт (з!аг1(! зт+1); 91Рорнатгтх(); 436 Глава 11 ° Мозаичное представление и поверхности второго порядка Поверхности второго порядка: сферы, цилиндры и диски 437 910! ааЬ?е(6С С?6НТ?Н6); 91Со1ог3((9.9, 1,0.
1.9): 91тгапа1а(ег(2.9, -2.0, 9.0); 9?са? «(аС(а(агСС(а!+2); 9?со?огзг(1.9, ?.О, О,в); 9?тгапа?эта!(0.0, 2.9, 0.0); 91Са11?(аС(а(агСС(а!+3); 91Рориа(г(х(); 91Р105Ь(); ) чо(б ге!ларе(!пС и, чпС П) ( 91ч'!пирог((9, О, (6С5(се!) и, (669!се!) П); 91Ма(г(хнобе(6С РЯО!ЕСТ?ОМ); 91Соаб?бепС!Су(); (г (и <= и) 910гтпо(-2.5, 2.5, -2,5*(6С(1оаС)п/(6?(1оаС)и. 2. 5' (6С(1оэС) П/ (6С(1оаС)и, - 19. О, 10. 0); е1ье 910гСПЬ(-2.5*(6С(1оаС)и/(6?(1оаС)П, 2,5'(6с(1оас)и/(6с(1оас)п, -2.5, 2.5, -19.0, 10.9)! 91Ма(г!кнабе(6С МООЕСЧ?ЕИ); 9?Соаб?бепС!Су()! чочб кеуьоагб(оп!!Епеб спаг кеу, чпс х, (пс у) ( 5и(ССЬ (Кеу) ( саае 22: ех!С(0); Ьгеах; (пС еа(п(чпС агвс, слаг" агвч) ( 91ЬС?п!С(йагвс, агвч); 91ЬС?п!СО!ар1ауМобе(ОСОТ 5?ИССЕ [ 6СОТ 969 [ 6СОТ ОЕРТН); 91ЬС?пчСИ(пбои5!се(599, 500); 91оС ?и! СИ! пбоиРоа! С! оп( 100 .
100): 9?оссгеасей(обои(агах[9)); !п(с(); 91ЬСОчар1ауропс(б!ьр1ау)! 91ЬСяеапарегопс(геьларе); 91ЬСКеуооагбгопс(хеуооагб). 91исМа(псоор(); гесогп О; Вычислители и й0кВ5 439 На самом низком уровне аппаратные средства рисуют точки, отрезки линий и многоугольники — обычно треугольники н четырехугольники. Гладкие кривые и поверхности рисуются аппроксимированными большим числом маленьких отрезков или многоугольников. Тем не менее многие полезные кривые и поверхности могут быть описаны математически небольшим числом параметров, таких как контрольные точки.
Сохранение 16 контрольных точек для поверхности требует значительно меньше памяти, чем сохранение 1000 треугольников вместе с информацией о векторах нормали для каждой вершины. Кроме того, 1000 треугольников лишь аппроксимируют истинную поверхность, а контролъные точки точно описывают. Вычислители обеспечивают способ указания точек кривой или поверхности (или ге части) с помощью только контрольных точек. Кривая или поверхность может быть воспроизведена с любой точностью. Дополнительно автоматически вычисляются векторы нормалей к поверхностям.
Вы можете использовать данные, сгенерированные вычислителем, различными способами: нарисовать точки в месте нахождения поверхности, построить проволочный каркас поверхности или отобразить ее полную версию — с освещением, затенением и текстурами. Вычислители позволяют описать любые полиномиальные или рациональные йайопа1) полиномиальные сплайпы или поверхности любого порядка.
Это практически все сплайны и сплайновые поверхности, применяемые сегодня, в том числе В-сплайны, Ы(1ВВ5- (Хоп-()пЫогш Кайопа! В-Зр11пе — неоднородный рациональный В-сплайн) поверхности, кривые и поверхности Безье и сплайны Эрявта (Негппге). Поскольку вычислители предоставляют только низкоуровневое описание точек кривой или поверхности, они обычно используются ввышестояшими» библиотеками инструментов, обеспечивающими интерфейс программирования более высокого уровня.