4. Методы построения реалистичных трехмерных изображений

4.7. Методы построения теней

 

 

Тени имеют большое значение при построении реалистичных изображений. В своей повседневной жизни мы привыкли видеть тени, естественно, что мы ожидаем увидеть их и на изображениях, синтезированных компьютером. Как правило, изображение с построенными тенями выглядит гораздо эффектнее и реалистичнее. Кроме того, очень часто тени помогают передать пространственные соотношения между объектами в сцене, в частности их взаимное расположение относительно источника света. При моделировании объектов тени тоже имеют немаловажное значение.  

 

В реальной жизни области света и тени на закругленных поверхностях располагаются в последовательности, представленной на рисунке 4.24. Как видно из рисунка, можно выделить 6 основных градаций света и тени: блик - то место на освещенной части предмета, где свет отражается непосредственно от источника (на глянцевых поверхностях мы видим непосредственно отражение источника света); свет - освещенная часть предмета; полутень - переход между светом и собственной тенью, или между тенью и рефлексом; тень - самое темное место в собственной тени, на которое не попадает ни прямой, ни отраженный свет; рефлекс - то место в собственной тени на предмете, на которое попадает отраженный свет от другого освещенного предмета или освещенной части того же предмета; падающая тень - самая темная градация среди теней при условии одинаковой окраски предметов (по мере удаления от предмета ее границы размываются, а сила тона слабеет).  

Следует заметить, что собственная тень - это тень на тех поверхностях предмета, которые отвернуты от источника света, а падающая тень - это тень на тех поверхностях предмета, которые обращены к источнику света, но загорожены от него другим предметом.  

Таким образом в реальности тень состоит из двух частей: полутени и полной тени. Но обычно при синтезе изображений на компьютере рассматриваются точечные источники света, которые создают только полную тень. Это объясняется тем, что в таком случае значительно уменьшаются вычислительные затраты на построение теней.  

На сложность вычислений существенно влияет положение источника света. Самый удобный случай, если источник света находится в бесконечности, тогда тени определяются при помощи ортогонального проецирования. Тяжелее, если источник находится вне поля зрения на конечном расстоянии. Тогда задача определения объектов, находящихся, в тени, является эквивалентом определения видимой поверхности относительно источника света. Вычисления становятся гораздо сложнее, когда источник находится в поле зрения. В этом случае пространство необходимо делить на сектора и для каждого сектора рассчитывать тени отдельно.  

Выделяют три класса алгоритмов построения теней:  

1.  Вычисление затенения в процессе преобразования в растровый вид;  

2.  Разделение поверхностей объекта на теневые и нетеневые площади, предшествующее преобразованию в растровый вид;  

3.  Включение значения теней в данные, описывающие объект.  

В первой группе используются алгоритмы, основанные на принципе отбрасывания лучей, и сопрягаемые с алгоритмами трассирования лучей.  

Вторая группа алгоритмов использует известные алгоритмы определения видимых поверхностей. При этом используются двухпроходные реализации алгоритмов построчного сканирования или z-буфера. Один проход здесь выполняется относительно наблюдателя, другой – относительно источника света.  

Основные  принципы  построения  теней  

Рассмотрим основные принципы построения теней. Тени разделяются на собственные и падающие. Линии, ограничивающие тень, называются границей или контуром тени. Собственной тенью называется неосвещенная, обращенная от источника света часть поверхности предмета. Грани, затененные собственной тенью, являются нелицевыми, если точку наблюдения совместить с источником света.  

Падающая тень область на обращенной к источнику света части поверхности предмета, закрытая от лучей света другим предметом или частью данного предмета. Чтобы найти такие тени, нужно построить проекции всех нелицевых граней (относительно источника света) на сцену. Центр проекции находится в источнике света. Точки пересечения проецируемой грани со всеми другими плоскостями образуют многоугольники, которые помечаются как теневые многоугольники и заносятся в структуру данных. Как можно заметить, падающие тени создаются только гранями, которые находятся в собственной тени.  

На рисунке 4.25 показан пример падающих и собственных теней.  

После добавления теней к структуре данных, как обычно, строится вид сцены из заданной точки наблюдения. Отметим, что для создания разных видов не нужно вычислять тени заново, так как они зависят только от положения источника и не зависят от положения наблюдателя.  

При визуализации сцены возникает проблема, связанная с расчетом интенсивности участков, находящихся в тени. Эту проблему можно решать по-разному, в зависимости от того, какие имеются вычислительные возможности и какой визуальный эффект необходимо получить. Естественно, что степень реализма построенных изображений напрямую зависит от выбранного метода расчета.   

 

В простейшем случае можно считать, что тени абсолютно черные. Однако, если взять источник света и два каких-нибудь предмета, то можно увидеть, что тень может быть не только такой. Интенсивность, т. е. чернота тени, зависит от интенсивности источника и от расстояния между затененной гранью и гранью, отбрасывающей тень. Это вызвано ограниченным размером источника и тем, что на затененную поверхность падает рассеянный свет.  

Для того, чтобы смоделировать такой эффект, можно установить пропорциональную зависимость интенсивности тени и источника. Если накладывается несколько теней, то их интенсивности складываются. Более сложных расчетов требует правило, позволяющее сделать интенсивность тени пропорциональной как интенсивности источника, так и расстоянию между поверхностью, на которую падает тень, и поверхностью, отбрасывающей тень.  

Построение  теней  в  алгоритме  трассировки  лучей.  

Изначально алгоритм трассировки лучей был задуман как средство удаления невидимых поверхностей, но затем он был усовершенствован: были добавлены возможности построения теней и учтены эффекты отражения и пропускания света. Таким образом, метод трассирования лучей позволяет получать изображения наивысшей реальности, моделируя прозрачность, отражения, преломления, другие оптические эффекты.

Кратко рассмотрим основные принципы работы алгоритма трассировки лучей.  

Наиболее часто используется обратная трассировка лучей – от наблюдателя к сцене, которая позволяет существенно уменьшить вычислительные затраты по сравнению с прямой трассировкой.  

Лучи трассировки проводятся из точки наблюдения через каждый пиксел экрана и проецируются на модель. Пересечение лучей трассирования и объектов определяет видимые поверхности. Кроме того, из точки пересечения испускаются дополнительные лучи. Если поверхность отражающая, то генерируется отраженный луч. Если поверхность пропускает свет, то генерируется пропущенный луч с учетом того, что при переходе из одной среды в другую луч меняет направление (преломляется). Пути этих лучей отслеживаются и при пересечении их с объектами сцены испускаются новые лучи.

Тени в алгоритме трассировки лучей учитываются следующим образом. Из каждой точки пересечения луча трассировки с поверхностью строятся дополнительные лучи по направлению к каждому источнику света. Если такой луч пересекает на своем пути какую-нибудь поверхность, то на точку, из которой был выпущен луч, падает тень от этой поверхности. Таким образом, все эти лучи вместе с данными о физических характеристиках объектов модели (цвет, прозрачность, зеркальность и т.д.) позволяют определить цвет и его интенсивность для каждой точки изображения.  

Построение  теней  с  использованием  алгоритма  z-буфера.  

Алгоритм удаления невидимых поверхностей с использованием z-буфера легко может быть модифицирован для того, чтобы учитывать эффект отбрасывания теней.  

Рассмотрим вкратце основные принципы работы алгоритма удаления невидимых поверхностей с использованием z-буфера. Идея данного метода очень проста.  

Данный алгоритм использует дополнительный двумерный массив памяти (z-буфер) для хранения z-координаты (глубины) каждого пиксела экрана. В процессе сканирования поверхность модели преобразуется в значения пикселов в кадровом буфере. Параллельно с этим вычисляется расстояние от каждой точки поверхности до некоторой фиксированной плоскости. Это расстояние сравнивается со значением, которое хранится для данного пиксела в z-буфере и если новый пиксел перекрывает текущий, то в кадровый буфер записывается цвет рассматриваемой поверхности, а в z-буфер записывается новое значение глубины. После просмотра всех поверхностей кадровый буфер будет содержать изображение с удаленными невидимыми поверхностями.  

При построении теней с использованием алгоритма z-буфера выполняется два прохода: один – относительно источника света, другой – относительно наблюдателя. Для этого выделяется отдельный "теневой" z-буфер. Первый проход необходим для того, чтобы определить, какие точки видимы из источника света. При втором проходе сцена визуализируется из положения наблюдателя с учетом того, что точки, которые оказались невидимы из источника света, находятся в тени.  

Таким образом, алгоритм работает в два этапа. При первом проходе сцена рассчитывается из точки наблюдения, совпадающей с положением источника света. Значения глубины пикселей для данного вида заносятся в "теневой" z-буфер. При этом значения интенсивности не учитываются.  

Затем сцена строится из точки, в которой находится наблюдатель. При сканировании каждой поверхности значение ее глубины в каждом пикселе сравнивается со значением глубины в z-буфере. Если поверхность видима, то необходимо проверить, видима ли данная точка из положения источника света. Для этого координаты точки x, y, z из вида наблюдателя линейно преобразуются в координаты x', y', z' на виде из источника света. Проверка на видимость осуществляется путем сравнения значения, которое хранится в "теневом" z-буфере для координат x', y', и значения z'. Если точка невидима из положения источника света (значение в "теневом" z-буфере больше значения z'), то она находится в тени и изображается в соответствии с правилом расчета интенсивности с учетом затенения. Если же точка видима из положения источника света, то она изображается без изменений.  

Включение  теней  в  алгоритмы  построчного  сканирования.  

Прежде чем перейти к вопросу включения теней в алгоритмы построчного сканирования, кратко рассмотрим основные принципы работы этих алгоритмов.  

Алгоритмы построчного сканирования обрабатывают сцену в порядке прохождения сканирующей прямой и оперируют в пространстве изображения. Фактически трехмерная задача удаления невидимых линий сводится к двумерной путем использования сканирующей плоскости. Сканирующая плоскость определяется точкой наблюдения, расположенной в бесконечности на положительной полуоси z и сканирующей строкой. Пересечение сканирующей плоскости и трехмерной сцены определяет окно размером в одну сканирующую строку. Задача удаления невидимых поверхностей решается в пределах этого окна, образованного сканирующей плоскостью. Существуют версии алгоритмов, которые используют z-буфер и метод интервалов для удаления невидимых поверхностей.  

Добавление теней в алгоритмы построчного сканирования, как и в алгоритме z-буфера, осуществляется в два этапа.  

На первом этапе для каждого многоугольника сцены и каждого источника определяются самозатененные участки (находящиеся в собственной тени) и проекционные (падающие) тени.  

Второй этап заключается в обработке сцены относительно положения наблюдателя. Он состоит из двух процессов сканирования. Сначала первый процесс определяет, какие отрезки видимы на интервале, затем второй процесс с помощью сформированного ранее списка теневых многоугольников находит, падает ли тень на многоугольник, который создает видимый отрезок на данном интервале. Второе сканирование для интервала производится следующим образом:  

*  если нет ни одного теневого многоугольника, то видимый отрезок изображается;  

*  если для многоугольника, содержащего видимый отрезок, имеются теневые многоугольники, но они не пересекают и не покрывают данный интервал, то видимый отрезок изображается;  

*  если интервал полностью покрывается одним или несколькими теневыми многоугольниками, то интенсивность изображаемого видимого отрезка определяется с учетом интенсивностей этих многоугольников и самого отрезка; 

*  если один или несколько теневых многоугольников частично покрывают интервал, то он разбивается в местах пересечения с ребрами теневых многоугольников. Затем алгоритм применяется рекурсивно к каждому из подинтервалов до тех пор, пока интервал не будет изображен.  

Кроме рассмотренных выше алгоритмов существуют и другие алгоритмы построения теней, а также различные их модификации, но общие принципы для всех их остаются такими же.

Выбор способа построения теней в каждом конкретном случае может быть обусловлен различными причинами и в конечном счете зависит от целей, которые стоят перед создателем. Естественно, что если необходимо строить тени в реальном режиме времени, то это выдвигает к алгоритму ряд дополнительных требований по скорости работы, возможно в ущерб качеству синтезируемого изображения. Если же необходимо создавать высококачественные изображения, то придется учитывать дополнительные нюансы для большей реалистичности и вероятнее всего время вычислений существенно увеличится.  

В качестве примера рассмотрим построение теней в пакете 3D-Studio MAX 2.0 для трехмерного моделирования и рендеринга. В этом пакете реализована возможность строить тени, как с помощью метода трассировки лучей (ray-traced shadows), так и с использованием теневых карт (shadow-maps).  

Теневая карта (shadow-map) – это карта битов, которая генерируется визуализатором во время предварительного прохода перед визуализацией сцены. Теневая карта проецируется в заданном направлении из положения точечного источника света. Этот метод обеспечивает более мягкие границы тени и, как правило, требует меньших вычислительных затрат чем метод трассировки лучей, но является менее точным. Кроме того теневые карты не позволяют учитывать цвет, который придают тени прозрачные или полупрозрачные объекты.  

Метод трассировки лучей всегда создает тени с четкими границами, что может быть преимуществом или недостатком, в зависимости от эффекта, который планируется получить, и требует большего времени вычислений, в зависимости от количества граней, которые он затрагивает.  

Визуализатор создает тени путем отслеживания (трассировки) пути лучей, испускаемых источником света. Тени сгенерированные таким способом более точные. Например, только трассировкой лучей можно создать тени для каркасных (проволочных) объектов, и только этим методом создаются правильные тени от прозрачных или полупрозрачных объектов. На рисунке 4.26 показана одна и та же сцена, которая была для сравнения визуализирована в пакете 3D-Studio MAX 2.0 с использованием различных методов построения теней. Источник света находится за наблюдателем. Как видим все особенности, рассмотренные выше, ясно просматриваются на рисунке.4.26.  

Для того, чтобы добавить тени к своей сцене в 3D-Studio MAX, необходимо выбрать источник света и в панели команд изменить его параметры, находящиеся в вкладке Shadow Parameters (параметры тени). Внешний вид этой вкладки показан на рис.4.27. Рассмотрим подробнее значение ее параметров.  

 

Опция Cast Shadows (отбросить тени) определяет: отбрасывает ли тени текущий источник света. По умолчанию она выключена. Для того, чтобы при визуализации источник света создавал тени установливают эту опцию.  

Опция устанавливает, какие значения параметров создания тени используются для данного источника света: общие или индивидуальные. Если эта опция включена, то остальные параметры (кроме Cast Shadows) принимают значения, используемые остальными источниками света, у которых данная опция уже установлена. Изменение параметров тени у текущего источника света приводит к изменению их и у других источников с включенной опцией Use Global Settings. Если же эта опция не выбрана, то параметры тени текущего источника изменяются индивидуально.  

 

Опции Use Shadow Maps и Use Ray-Traced Shadows определяют, каким методом будут создаваться тени для данного источника света: при помощи теневых карт (Shadow Maps) или методом трассировки лучей (Ray-Traced Shadows). Отличия этих методов рассматривались нами ранее.  

Параметр Map Bias (смещение карты) приближает или отодвигает тень от объекта, отбрасывающего тень. По умолчанию этот параметр равен 1.0. Увеличение смещения двигает тень дальше от объекта, уменьшение параметра перемещает тень ближе к объекту. Значение смещения карты может быть любым положительным числом с плавающей точкой. Этот параметр используется только, если тени создаются с помощью теневых карт (Shadow Maps).  

Параметр Size задает размер карты тени (Shadow Map), которая рассчитывается для данного источника тени. Размер карты может находиться в пределах от 0 до 10000. Следует иметь в виду, что карта с большим размером требует для хранения больше памяти и может потребовать больше времени для создания. Так, например, карта тени размером в 4096 линий занимает 64 МБ памяти (4096´4096´4). Но, если при визуализации тени оказываются слишком грубыми, вам следует увеличить данный параметр.  

Параметр Smp Range (Sample Range – широта выборки) определяет то, в какой степени усредняется область внутри тени. Этот параметр влияет на мягкость (размытость) границ теней, созданных при помощи теневых карт(Shadow-mapped shadows). Маленькие значения уменьшают область, которая усредняется, и создают тени с более четкими границами. Следует заметить, что такие тени могут приводить к появлению эффекта ступенчатости (aliasing). Большие значения параметра увеличивают область усреднения и создают тени с более размытыми краями.  

По умолчанию значение широты выборки равно 4. Данный параметр может быть действительным числом в пределах от 0 до 20. Значения меньше 3 могут привести к созданию теней с грубыми краями. Хотя этот эффект может быть уменьшен путем увеличения размера карты теней.  

Следует также отметить, что время визуализации сцены с увеличением значения широты выборки растет экспоненциально.

Параметр Ray Trace Bias (смещение трассировки лучей) оказывает влияние на создание теней методом трассировки лучей. Изменение значения этого параметра приводит к тому, что тень отодвигается или приближается к объекту, отбрасывающему тень. По умолчанию этот параметр равен 1. Увеличение значения параметра двигает тень от объекта, уменьшение – к объекту. Значение может быть любым положительным действительным числом.  

Кроме рассмотренных выше параметров на отображение теней при визуализации сцены можно повлиять путем установки свойств конкретных объектов.  

Так, для того, чтобы определенные объекты не отбрасывали теней нужно очистить в их свойствах опцию Cast Shadows (отбрасывает тени). Для этого надо выбрать объект, при помощи правой кнопки мыши вызвать контекстное меню и выбрать пункт Properties (Свойства). Появится окно диалога, в котором присутствует опция Cast Shadows, изменив которую можно добиться требуемого результата. Кроме того, там же есть опция Receive Shadows (Получает Тени). Если она установлена, то тени, падающие на объект, не показываются при визуализации сцены.

Контрольные  вопросы.

1.  Как влияют тени на реалистичность изображений?  

2.  Перечислите основные элементы теней.  

3.  Дайте характеристику основным методам построения теней.  

4.  Какие команды для построения теней используются в пакете 3D-Studio MAX 2.0?

     Содержание