Дмитрий Павлов "Цифровое моделирование на C#"

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

date_range Год издания :

foundation Издательство :Издательские решения

person Автор :

workspaces ISBN :9785006286184

child_care Возрастное ограничение : 12

update Дата обновления : 09.05.2024

рис. 2.10

Расчет диффузной составляющей происходит согласно формуле ниже:

D = d ? X ? (1 + cos (?)) / 2

D – диффузная составляющая.

d – значимость источника света. Этот параметр можно интерпретировать как яркость этого источника относительно других. Сумма значений d для всех источников должна быть равна 1.

X – исходный цвет поверхности треугольника.

? – угол между вектором нормали к поверхности и вектором, исходящим из вершины треугольника и направленным на источник света.

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

Зеркальная составляющая

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

рис. 2.11

(1) – вектор, исходящий из вершины треугольника и направленный на источник света.

(2) – вектор нормали к плоскости треугольника.

(3) – отраженный от поверхности луч света.

(4) – вектор, исходящий из вершины треугольника и направленный на наблюдателя.

? – угол между вектором нормали и вектором, направленным на источник света.

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

Зеркальную составляющую освещения можно вычислить по следующей формуле:

S – зеркальная составляющая.

a – параметр, характеризующий яркость светового блика.

b – параметр, характеризующий размер светового блика на поверхности. Чем больше b, тем меньше блик.

x = 1-cos (?)

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

Если мы построим график функции, с помощью которой вычисляется зеркальная составляющая, то мы получим примерно такой график (рис. 2.12) (в зависимости от параметров a и b вид графика может немного меняться).

рис. 2.12

Эта функция достигает своего максимума при x=0, то есть когда отраженный луч и вектор, направленный на наблюдателя, сонаправлены. Значение самих параметров a и b полностью зависит от свойств материала поверхности. Например, для металла значение a будет больше, чем для дерева.

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

Формула Фонга

Общее значение освещенности является суммой трех составляющих освещения:

Освещенность = Фоновая + ? Диффузная + ? Зеркальная

Суммирование идет по всем источникам света, присутствующим на сцене.

Способы освещения

Мы выяснили, как вычислять цвет в произвольной точке треугольника. Но нам необходимо закрасить весь треугольник. Чтобы это сделать, существует несколько вариантов. Первый вариант самый простой (и, соответственно, самый быстрый) – нужно вычислить цвет в произвольной точке (например, в вершине) и закрасить этим цветом весь треугольник. Второй чуть сложнее – это вычислить цвет в трех вершинах треугольника, усреднить эти значения и закрасить этим усредненным значением весь треугольник. И, наконец, третий способ – вычислить цвет в трех вершинах, а для закраски внутренних точек треугольника использовать линейную интерполяцию между вершинами треугольника (метод Гуро). Этот метод позволяет устранить дискретность изменения интенсивности, также он является наиболее ресурсоемким из трех перечисленных, но именно он дает самую качественную картину из описанных выше методов.

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

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

В качестве практической вставки посмотрим, как закрасить треугольник в соответствии с методом Гуро. В графической библиотеке GDI+ присутствует необходимый функционал, чтобы линейно интерполировать цвета между тремя вершинами. (см. листинг ниже)

Моделирование тумана

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

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

Рассмотрим формулу, с помощью которой можно вычислять цвет 3D-модели в условиях тумана:

X

– цвет 3D-модели с учетом тумана.

F – цвет тумана (в природе, как правило, это белый цвет, но можно использовать и другие цвета).

R – расстояние от наблюдателя до объекта.

X – исходный цвет объекта, вычисленный например, по методу Фонга.

d – параметр тумана (плотность).

Как работает эта формула? Если R=0, то есть объект находится перед наблюдателем, тогда X

равно исходному цвету объекта. Если же устремить R в бесконечность, X

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

может быть заменено на любую другую монотонно-возрастающую функцию, зависящую от R. При этом туман будет как-то по-другому «растворять» объект.

Отображение 3D-модели

Поскольку мы определили трехмерную модель как совокупность полигонов (треугольников), то отображение модели сводится к отображению этой совокупности. Как отобразить эту совокупность чтобы модель выглядела корректно? Существует несколько подходов к решению этой задачи. Мы изложим один из наиболее простых методов. Итак, чтобы наша 3D-модель выглядела правдоподобно, нам нужно проделать следующее: необходимо отсортировать наши треугольники по оси Z в порядке удаленности от наблюдателя. В качестве Z-координаты можно взять минимум по Z для всех трех вершин. То есть отображаться треугольники должны по мере приближения к наблюдателю – от самых дальних к ближним. Этот подход называется алгоритмом художника. Он очень прост, нагляден и легко реализуем. Но он также имеет ряд недостатков. Например, алгоритм не позволяет получить корректную картину в случае взаимно перекрывающихся треугольников. В этом случае следует разбивать конфликтный треугольник на несколько меньших. Второй проблемой является то, что система прорисовывает области, которые впоследствии будут перекрыты, на что тратятся лишние вычислительные ресурсы.

Особый случай представляет из себя ситуация, когда на сцене присутствует только одна 3D-модель и она является выпуклым многогранником (например, кубом), в этом случае сортировка не требуется. Достаточно просто отобразить видимые треугольники. Однако мы пока не выясняли, как определить, видим треугольник наблюдателю или нет. Давайте сформулируем простой критерий видимости треугольника для наблюдателя: треугольник виден наблюдателю в том и только в том случае, если угол между его нормалью и вектором на наблюдателя лежит в пределах от 0 до 90 градусов (является острым). Это условие может быть сформулировано по другому – треугольник виден наблюдателю в случае, если скалярное произведение вектора нормали и вектора, направленного на наблюдателя, больше нуля. Если для определенности предположить, что вектор на наблюдателя имеет следующие координаты (0, 0, -1), то условие видимости треугольника принимает очень простой вид: треугольник виден наблюдателю тогда и только тогда, когда Z-координата его вектора нормали меньше нуля.

Похожие книги


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