В этой статье подробно описывается метод, основанный на моделировании физических процессов течения воды и рассеивания пигмента. Акварель - это уникальное средство. Она позволяет создавать необыкновенные текстуры и образы, отражающие движение воды по бумаге. Живые цвета и спонтанные формы придают акварельным краскам особый шарм. Их можно наносить очень тонкими слоями, получая самые неуловимые оттенки, что придает различным объектам прозрачность и способность "светиться". Моделирование акварели средствами компьютерной графики - одна из интереснейших подзадач NPR.
Во время рисования акварелью возникают интересные эффекты, сочетание которых не присуще никаким другим живописным средствам. Если смоделировать физические процессы, приводящие к таким эффектам, можно создавать изображения, очень похожие на картины, нарисованные настоящими акварельными красками.
Акварелью можно работать по-разному. Существуют 2 основные техники рисования: по мокрой бумаге (wet-in-wet), когда художник сначала смачивает бумагу водой и лишь потом наносит краску, что позволяет краске свободно растекаться, и по сухой бумаге (wet-in-dry). С помощью этих техник можно получить ряд стандартных эффектов акварели, применяемых художниками:

(более подробно об этом в статье Нефотореалистичная визуализация: методы имитации акварельных красок)
Рассмотрим математическую модель акварельного рисунка, описанную в [1]. Она представляет собой набор слоев, каждый из которых создается отдельно запуском процесса имитации течения жидкости (fluid simulation), который рассчитывает распределение пигмента в результате его растекания по бумаге. Этот процесс принимает в качестве входных данных параметры, которые отвечают за физические свойства пигментов, бумаги и др. А также имитация использует в своей работе маску, которая определяет, где бумага мокрая, а где нет (Wet-area mask). Эта маска определяет границы области свободного растекания воды. Когда все подсчитано, слои комбинируются для получения окончательного результата.
Каждый слой имитируется с использованием 3х-уровневой модели. Снизу вверх она включает 3 уровня:

На уровне течения воды вода течет по поверхности бумаги, ограниченная размерами маски мокрой области. В процессе течения вода поднимает с поверхности бумаги пигмент, течет вместе с ним, перенося на другое место. В процессе имитации используются следующие величины:
Каждый пигмент перемещается между уровнем течения воды и уровнем перемещения пигмента посредством осаждения и всплытия. Будем обозначать gk - пигмент на уровне течения воды и dk - осажденный пигмент. На осаждение и всплытие влияют свойства конкретного пигмента, такие как: густота (density) - ρ, красящая способность (staining power) - ω и уровень зернистости (granularity) - γ.
Функция капиллярного слоя состоит в том, чтобы позволять распространяться маске мокрой области благодаря капиллярного течению воды через поры бумаги. Существенные величины на этом слое - это:
Все вышеназванные величины дискретизируются на двумерной сетке, представляющей поверхность бумаги.
Для реальной акварели структура бумаги влияет на течение жидкости и грануляцию. Механизм этих эффектов может быть очень сложен, может зависеть от связей между конкретными волокнами, от точного соотношения пиков и впадин на бумаге. В данном методе используется значительно более простая модель - текстура бумаги моделируется полем высот h и полем способности впитывания воды c. Поле высот h генерируется с использованием псевдослучайных процессов - шум Перлина (Perlin noise). Разница высот используется для изменения скоростей течения жидкости в динамической имитации. Способность впитывания воды с рассчитывается с помощью поля высот по формуле:
c = h * (cmax - cmin) + cmin.
Основной цикл принимает на вход: начальную маску мокрой области M, начальные скорости воды u и v, начальное давление воды p, начальные концентрации пигментов gk, начальная насыщенность бумаги водой s. В основном цикле несколько раз повторяется по очереди движение воды с пигментом, перенос пигмента на уровень передвижения пигмента и обратно, и имитация капиллярного уровня.
proc MainLoop(M, u, v, p, g ,:, gn, d1 ,:, dn, s):Движение воды на уровне течения воды
for each time step do:
MoveWater (M, u, v, p)
MovePigment (M, u, v, g1 ,:, gn)
TransferPigment (g1 , :, gn, d1,:,d n )
SimulateCapillaryFlow (M, s)
end for
end proc
Движение жидкости в каждой точке потока полностью описывается системой нелинейных уравнений Навье-Стокса. В двумерном случае для несжимаемых жидкостей, эти уравнения могут быть записаны следующим образом:

Рассмотрим условия, которым должно удовлетворять поведение воды для достижения реалистичного эффекта:
Первые два условия удовлетворяются непосредственно уравнениями Навье-Стокса с определенными граничными условиями.
Эти уравнения реализованы в функции UpdateVelocities (). Условия 3 и 4 выполняются посредством добавления в функцию выражений с использованием вязкостного сопротивления и уклона бумаги, как видно из псевдокода функции. Условия 5 и 6 удовлетворяются с помощью введения дополнительных функций RelaxDivergence () и FlowOutward(). Итак:
proc MoveWater(M, u, v, p):Изменение скоростей воды
UpdateVelocities (M, u, v, p)
RelaxDivergence (M, u, v, p)
FlowOutward (M, p)
end proc
Для каждой клетки сетки хранятся значения скоростей и другие значения (давление воды, концентрация пигментов и т.д.). Итак, в функции UpdateVelocities () происходит модификация значений скоростей.
Для изменения скоростей уравнения дискретизируются по времени, и используются следующие обозначения для значений между двумя пикселами:

Для дискретизации используется метод Эйлера решения дифференциального уравнения.
![]()
Рассмотрим этот процесс подробнее.
Приведем первое уравнение Навье-Стокса (изменение горизонтальной скорости) к такому виду:

Обозначим:

![]()
Аналогично, обозначим:

![]()
Аналогично для второго уравнения Навье-Стокса.
Итак, функция изменения скоростей:

Процедура EnforceBoundaryConditions() просто приравнивает к нулю все скорости в клетках, где маска мокрой области = 0.
РелаксацияДля уменьшения разницы между значениями скорости воды в соседних клетках используется функция RelaxDivergence() для каждого временного шага до тех пор, пока разница скоростей не будет меньше определенного порога путем перераспределения жидкости в соседних клетках.

При рисовании на сухой бумаге пигмент обычно течет из центра к краям мазка. Этот процесс происходит с любой испаряющейся смесью, в которой край капли остается на месте из-за поверхностного натяжения. Из-за этих геометрических ограничений вода испаряется по краям и замещается водой из центра в результате течения воды наружу. Эта вода несет с собой пигмент, что ведет к появлению избытка пигмента на краях в процессе испарения воды. В данном методе это моделируется с помощью уменьшения давления воды по краям маски.
Функция FlowOutward() убирает на каждом временном шаге некоторое количество воды из каждой клетки на расстоянии не больше некоторой величины от края. Расстояние до края аппроксимируется с помощью гауссовского размытия (K x K) маски мокрой области, далее в соответствии со значением размытой маски М каждая клетка уменьшается на значение:
p ← p - η (1 - M-)M
Движение пигментаВ этой части имитации пигмент перераспределяется в воде в соответствии с вычисленными скоростями.

На этом этапе часть пигмента оседает на бумаге, а часть всплывает обратно.

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

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




Комментарии
Отправить комментарий