Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Компьютерная графика и геометрическое моделирование в информационных системах. Учебное пособие для бакалавров направлений подготовки 230100 «Информати.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
Вышеприведённый алгоритм аффинного точечного текстуриро­вания справедлив только для аксонометрических проекций трёхмер­ных объектов. Для перспективного текстурирования необходимы до­полнительные математические операции, связанные с центральным проецированием [5].
Одна из проблем текстурирования полигонов заключается в том, что после геометрических преобразований (поворотов, изменений размеров и т.п.) растровых образцов происходит ухудшение качества «картинки» конечного резу
льтата текстурированной области. Воз­можно появление ступенчатости (aliasing) на границах текстур после поворотов объекта, укрупнения пикселей, после увеличения геомет­рической модели, а уменьшение размеров растра обычно приводит к потере многих пикселов образца текстуры, что проявляется в виде муара. Для улучшения эстетического восприятия текстурованных изображений применяют всевозможные методы фильтрации (интерпо­ляции) растров текстур.
Рассмотрим наиболее эффективную фильтрацию текстур – били-
нейную фильтрацию. В данном методе видовое (цвет, яр
кость) значе­ние точки текстурируемого полигона выбирается не из ближайшего текселя текстуры, а за три прохода линейной интерполяции из блока четырёх соседних текселей (рис. 6.2). Благодаря чему, повышается аккуратность при выборе цвета (яркости) пикселя и достигается луч­шая прорисовка отдельных мелких деталей изображения.
Предположим, в процессе аффинного текстурирования полигона
были определены ко
ординаты текселя T, как xt и yt (рис. 6.2). Из ри-
Рис. 6.2. Билинейная фильтрация текстуры
21
сунка видно, что текстурные точки C00, C10, C
−
+
и C11 являются сосед-
01
ними точками в текстуре по отношению к вычисленной точке T. Сле­дует заметить, что такой точки в пространстве целочисленных коорди­нат текселей не существует, так как её положение задаётся веществен­ными значениями. Реальные координаты «соседних» точек в текстуре определяются как: C
= [xt] + 1, [yt] + 1. В формулах [xt] и [yt] соответствуют значениям
C
11
= [xt], [yt]; C10 = [xt] + 1, [yt]; C01 = [xt], [yt] + 1 и
00
целых чисел вещественных значений без их дробных частей. Напри­мер, для вычисления координат точки C дробную часть у x
Значение точки A можно определить как:
A
то
x
t
и yt.
t
A x
t
−
CC
10
k
=
−
CC
1000
хх
−+
1][
хх
−+
=> ,)(
A
tt
k
=
A
][1][
tt
)1])([( CххCCC
+−+−= .
tt
A x
t
=>
101000
необходимо отбросить
00
k
+−= (6.1)
CCC
= 1][ , (6.2)
C
101000
A
xxk
ttA
В выражении 6.1 коэффициент линейной интерполяции указывает
на изменение интенсивности точки A по отношению к текселю C
10
Это изменение пропорционально отношению расстояния от точки А до текселя C
к единичному расстоянию между соседними текселями.
10
Аналогично вычисляют точки В и Т (вывод выполнить самостоя-
тельно).
Вычисленные таким образом видовые атрибуты точки будут яв-
ляться целью билинейной фильтрации текстурирования.
Под видовыми атрибутами текселей C
следует понимать значе-
ij
ние интенсивности по основным цветам цветовой модели R, G и B.
Иногда для улучшения качества текстурирования используют сразу несколько образцов текстур для различных масштабов (mipmaps). И в зависимости от рабочего масштаба показа графического объекта для тектуры выбирается наиболее близкий по качеству (мас­штабу) растровый образец.
Одной из проблем связанных с хранением текстур является тре­бование к объёму памяти текстурных хранилищ в компьютере. Для сокращения подобной памяти можно использовать методику блочного текстурирования. В данном случае заявленная текстура не предп
олага­ет заполнить весь полигон целиком, а лишь отдельную часть, которая циклически повторяется в многоугольнике.
22
.
7. АЛГОРИТМ «ПЛАВАЮЩЕГО ГОРИЗОНТА» ДЛЯ ВИЗУАЛИЗАЦИИ ФУНКЦИОНАЛЬНО-
ЗАДАННЫХ ПОВЕРХНОСТЕЙ
Компьютерная графика позволяет простым способом увидеть на экране монитора поверхность функции, заданной в виде F(x, y, z) = 0 с эффектом удаления невидимых участков. Для этого был разработан специальный алгоритм «плавающего горизонта» [2], где трёхмерная задача трансформируется в двумерную за счёт фиксации одной коор­динаты (обычно Z). Графически такую подмену можно представить, как пересечение исх например, оси Z. Секущих плоскостей выбирается несколько в зависи­мости от разрешающей способности растра вывода. Совокупность кривых, лежащих в этих плоскостях, формируют зрительный образ поверхности (рис. 7.1).
Как правило, функцию F(x, y, z) = 0 приводят к виду y = f(x, z), где z – константа.
Если построить проекцию по (рис. 7.2), то можно наблюдать поверхность функции, но без удаления невидимых участков.
о
дной поверхности параллельной плоскостью,
лученных кривых на плоско
сть z = 0
Рис. 7.1. Кривые в секущих плоскостях
Рис. 7.2. Проекция кривых на плоскость Z = 0
23
Процесс построения поверхности заданной функции начинается с ближайшего пересечения с плоскостью Z по отношению к точке на­блюдения. Строится «след» пересечения плоскостью Z поверхности, для этого каждому значению координат х в пространстве изображения определяется соответствующее значение y.
Непосредственное удаление невидимых участков кривых заклю­чается в следующем: если для текущей «секущей» плоскости для неко­то
рог
о заданного значения x соответствующее значение у на кривой больше значения y для всех предыдущих кривых при этом значении x, то текущая точка кривой видна; в противном случае она невидима.
На практике для хранения кривых максимальных значений y (те­кущих значений «горизонта») используется одномерный массив, длина которого равна горизонтальному размеру растра визуализации. В этот массив всегда записываются наибо
л
ьшие (!) значения y для фиксиро­ванного x. Поэтому по мере занесения новых y и рисования каждой очередной кривой этот горизонт как бы «всплывает». Таким образом, каждый раз этот алгоритм работает с одной кривой.
Вышепредставленный алгоритм работает логично до тех пор, по-
ка вычисленный y на очере
дной кривой будет
меньше значения y для
самой первой кривой из построенных для фиксированного x.
Такие участки кривых, естественно, должны быть видны и пред­ставляют собой нижнюю сторону исходной поверхности. Но первона­чальная форма алгоритма такой участок скроет от наблюдения, так как значение y на кривой будет меньше максимального значения для те- кущего x. Ни
жнюю ст
орону поверхности можно увидеть, если допол­нить этот алгоритм «нижним горизонтом», включив в него массив ми­нимальных значений y для фиксированных x. Эти значения «опуска- ются» вниз во время работы полного алгоритма. Массив «нижнего горизонта» имеет аналогичный тип описания в программе, как и мас­сив «верхнего горизонта».
Рис. 7.3. Пример работы алгоритма «плавающего горизонта»
24
Таким образом, алгоритм словесно можно записать, как: если на текущей плоскости (Z = сonst) при некотором значении x соответст- вующее значение y на кривой больше максимального значения y или меньше минимума значения y для всех предыдущих кривых при том же x, то текущая точка кривой видна. В противном случае нет.
Пример поверхности функции
y = (1/5) sin(x) cos(z) – (3/2) cos(7a/4) × e–a,
где a = (x – π)2 + (z – π)2, изображённой в интервале (0, 2π) по x и z, представлена на рис. 7.3.
8. АЛГОРИТМ УДАЛЕНИЯ НЕВИДИМЫХ ГРАНЕЙ,
В процессе визуализации полигональных 3D-объектов компью- терного моделирования приходится решать множество задач компью­терной графики, одной из которых является удаление невидимых гра­ней трёхмерного объекта относительно камеры наблюдения.
Существует большое количество алгоритмов удаления невиди­мых граней в трёхмерной графике [1 – 4]. Но наибольшее внимание заслуживают алгоритмы, работающие в реальном времени и с боль­шим количест использующий BSP-дерево (Binary Space Partition – двоичное разбие­ние пространства) [6]. Для данного алгоритма под BSP-деревом пони­мается пространственное взаимоотношение полигонов моделей трёх­мерных объектов.
Рассмотрим подробнее алгоритм удаления невидимых граней с использованием BSP-дерева. Пусть некоторая плоскость, содержащая один из полигонов трёхмерного объекта, делит множество полигонов сцены на два подмн из подмножеств. Подмножество полигонов, не содержащее наблюда­теля, очевидно, не может экранировать полигоны из подмножества с наблюдателем. Каждое полученное подмножество опять разобьём на части плоскостью полигона, находящегося в этом подмножестве. По­добный процесс разбиения продолжается до тех пор, пока в подмно­жестве не останется оди подмножества выполняется рекурсивно с одновременным формирова­нием BSP-дерева. В качестве узлов данного дерева будут полигоны, плоскости которых делят полигоны 3D-сцены на подмножества поли­гонов, а ветви – соответствующие подмножества. Листьями BSP­дерева будут полигоны, для которых не осталось множеств полигонов для дальнейшего разбиения.
В качестве ра которая делит пространство без рассечения других полигонов. В слу-
ИСПОЛЬЗУЮЩИЙ BSP-ДЕРЕВО
лигонов. К такому алгоритму относится алгоритм,
вом по
жества. Наблюдатель может находиться в одном
о
лигон. На практике деление сцены на
н по
ссекающей пл
оскости обычно выбирают плоскость,
25
чае, если рассечение полигона неизбежно, вместо одного рассеченного полигона в трёхмерную модель заносят два его фрагмента.
Расположения полигонов по отношению к плоскости деления можно определить, воспользовавшись тестовой функцией – TF(x, y, z), которая имеет вид TF = Ax + By + Cz + D, где A, B, C, D – коэффициен­ты уравнения плоскости деления; x, y, z – ко точки в
пространстве трёхмерного объекта.
ординаты анализируемой
Для каждой вершины анализируемого полигона вычисляем TF. Если величина тестовой функции в анализируемой точке больше (рав­на) 0, это указывает на то, что точка расположена справа относительно плоскости деления. В противном случае – точка расположена слева. Если для всех трёх точек полигона имеется один знак тестов
ой фун
к­ции, то это означает, что полигон целиком находится по одну из сто­рон секущей плоскости. При разных знаках тестовой функции полигон рассекается плоскостью деления подмножеств полигонов.
Растровый показ полигонов трёхмерной сцены с использованием BSP-дерева заключается в рекурсивном обходе дерева от «передних ветвей» к «задним» согласно следующей схеме:
1.
Начиная с корневого узла дерева, определяем положение на-
блюдателя относительно плоскости полигона данного узла.
2.
Дальше всего от камеры находятся полигоны, расположенные
с дальней стороны рассекающей плоскости (узлового полигон), поэто­му начинаем вывод подмножества подобных полигонов, т.е. противо­положную ветвь дерева.
3.
После чего выводим узловой полигон.
4.
В последнюю очередь выводим в растр ветвь подмножества
полигонов, в которой находится камера наблюдения.
5.
Рекурсивно повторяем шаги 1 – 4 для каждого узла BSP-дерева
3D-объекта до тех пор, пока не осуществим вывод всех полигонов сцены.
Построение BSP-дерева может начинаться с любого полигона, выбранного в качестве корневого узла. Но исследование построения дерева показало, что вид дерева меняется в зависимости от того, какой полигон будет выбран в качестве корневого. Вид де
ва влияет на эф-
ре фективность процесса обработки его «ветвей» и «листьев» при по­строении изображения.
Многочисленные исследования построения BSP-деревьев 3D-объ­екта показали, что стремление получить сбалансированное дерево, как правило, приводит к разрастанию модели данных сцены за счёт деле­ния полигонов на составные части секущими плоскостями узловых полигонов дерева.
Для р
ешения задачи оп
ределения полигонов в качестве разде­ляющих пространство трёхмерной модели предлагается простая мето­дика. Рассмотрим её основные шаги.
26
Допустим, что каждый полигон трёхмерного объекта может быть разделяющим полигоном. Тогда для каждого такого полигона строится структура данных состояния поделённых полигонов трёхмерной моде­ли со следующими полями:
−
количество полигонов, находящихся левее данного [«–»];
−
количество полигонов, находящихся правее данного [«+»];
−
количество пересечений полигонов сцены с плоскостью дан-
ного полигона [«Кол. пересечений»];
−
значение разности по модулю первого и второго параметра
[abs(«–» – «+»)].
Подобную структуру данных заносят строкой в таблицу, строки которой соответствуют полигону деления множества полигонов трёх­мерной модели.
Последний параметр строки таблицы [abs(«–» – «+»)] указывает на сбалансированность дерева.
Характеристика расположения полигонов, как «левее» и «пра­вее», чисто условная, так как истинную роль здесь играет знак проб­но
функции TF(x, y, z) плоскости разделения, куда подставляем зна-
й
чения координат вершин анализируемых полигонов.
Подобные таблицы строятся для каждого подмножества полиго­нов, из которого выбираем полигон с минимальным значением поля [abs(«–» – «+»)] и [«Кол. пересечений»]. Выбранные полигоны будут узловыми полигонами строящегося BSP-дерева. Процесс деления по­лигонов на подмножества завершается, когда в таблице состояний ос­танутся всего два по
лиго
на.
Рассмотрим пример трёхмерного объекта для построения BSP­дерева и состоящего из четырёх полигонов: 1, 2, 3 и 4 (рис. 8.1).
Рис. 8.1. Пример пространственной сцены
27
№ полигона «–» «+» Кол. пересечений abs(«–» – «+»)
Таблица 8.1
1 0 3 0 3
2 2 3 2 1
3 2 1 0 1
4 3 0 0 3
Для формирования «корня» BSP-дерева заполним таблицу со­стояний полигонов в сцене (табл. 8.1).
В данной таблице наиболее близко для корневого сегмента BSP­дерева подходят полигоны 2 и 3. Для симметричности дерева подходит полигоном 2, как корневой, но в этом случае придётся разбивать два полигона (1 и 3) на части. Следовательно, выбираем полигон 3, так как он не предполагает рассечение самих по
Если выявя
тся в таблице полигоны с одинаковыми значениями
лигонов.
четвёртого столбца – [abs(«–» – «+»)], то выбираем из них полигон, для которого значение поля [«Кол. пересечений»] минимальное.
Такие таблицы формируются для каждого левого и правого под­множества полигонов относительно выбранного узлового полигона. По аналогичной схеме определяются узловые полигоны. В данном случае в левом подмножестве останется по
лиго
н 1 и 2, а в правом 4.
Для полигонов 1 и 2 вновь строим таблицу состояний (табл. 8.2).
Анализируя значение поля [«Кол. пересечений»], выбираем полигон 1.
На этом процесс разбиения подмножеств полигонов трёхмерного объекта завершается. Одновременно с построением таблиц строятся
BSP-деревья. Для приведённого примера возможны три структуры BSP-дерева (рис. 8.2). Из трёх представленных вариант 3 наиболее
пр
иемлемый
.
Особенность BSP-дерева в алгоритме удаления невидимых граней трёхмерного объекта заключается в том, что все построения бинарного дерева осуществляются предварительно на этапе, не связанном с выводом в растр объекта. А в процессе визуализации трёхмер­ной графической модели BSP-дерево используется как указатель
№ полигона «–» «+» Кол. пересечений Abs(«–» – «+»)
1 0 1 0 1
2 1 0 1 1
Таблица 8.2
28
Рис. 8.2. Возможные варианты BSP-дерева
на последовательность вывода полигонов. Работа с подобным указате­лем – процесс быстрый и не требует сложных математических расчё­тов. Любое изменение положения камеры наблюдения в пространстве трёхмерной сцены, где расположен объект вывода, не влияет на орга­низацию BSP-дерева трёхмерной модели и не отражается на произво­дительности системы в целом. В рамках анимации трё
х
мерных объек­тов не требуется для каждого нового кадра заниматься сортировкой полигонов, так как в BSP-дереве всё это уже выполнено.
9. АЛГОРИТМ ОПРЕДЕЛЕНИЯ ВИДИМЫХ
ПОВЕРХНОСТЕЙ ПУТЁМ ТРАССИРОВКИ ЛУЧЕЙ
Основная идея, лежащая в основе алгоритма прямой трассировки лучей, заключается в том, что наблюдатель (камера) видит 3D-объект посредством испускаемого света неким источником, который падает на этот объект и затем каким-то образом доходит до наблюдателя. Луч может достичь наблюдателя, отразившись от поверхности, преломив­шись или пройдя через неё. Лишь малая часть подобных лучей, выпу­щенных источнико
м света, дойдут до наблюдателя. Подобный ал ритм отслеживания лучей вычислительно неэффективен даже при со­временных параметрах вычислительной техники. Аппель [2] первым предложил отслеживать (трассировать) лучи в обратном направлении, т.е. от наблюдателя к объекту, как показано на рис. 9.1. Исследователи Кэй и Уиттед [2] реализовали алгоритмы обратной трассировки лучей
го-
29
Рис. 9.1. Простая трассировка луча
и сформировали общую модель освещения. Эти алгоритмы учитывают эффекты отражения одного объекта от поверхности другого, прелом­ления, прозрачности и затенения.
Рисунок 9.1 служит иллюстрацией алгоритма трассировки лучей. В этом алгоритме предполагается, что сцена уже преобразована в про­странство изображения. Перспективное преобразование не использу­ется. Считается, что точка зрения или наблюдатель находится в беско­нечности на положительной полуоси z. Поэтому все световые лучи параллельны оси z. Каждый луч, исходящий от наблюдателя, проходит через центр пиксела на растре до сцены. Траектория каждого луча от­слеживается, чтобы определить, какие именно объекты сцены, если таковые существуют, пересекаются с данным лучом. Необходимо про­верить пересечение каждого объекта сцены с каждым лучом. Если луч пересекает объект, то определяются все во
зможные точ
ки пересечения луча и объекта. Можно получить большое количество пересечений, если рассматривать много объектов. Эти пересечения упорядочивают­ся по глубине. Пересечение с максимальным значением z представляет видимую поверхность для данного пиксела. Атрибуты этого объекта используются для определения характеристик пиксела.
Если точка зрения находится не в бесконечности, алгоритм трас­сировки лучей лишь незначительно усложняется. Здесь предполагает­ся, что наблюдатель по-прежнему находится на положительной полу­оси z. Картинная плоскость, т.е. растр, перпендикулярна оси z, как по­казано на рис. 9.2. Задача состоит в том, чтобы построить одноточеч­ную центральную проекцию на картинную плоскость.
30
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]