Генеративный подход к моделированию акварельной краски

Перевод статьи A GENERATIVE APPROACH TO SIMULATING WATERCOLOR PAINTS, автор - Tyler Hobbs

У меня появилось много просьб объяснить технику моего «акварельного» генеративного произведения. Мой подход похож на некоторые из тех методов, которые я описал в своем посте о создании мягких текстур, поэтому сначала прочитайте этот материал, если вы еще этого не сделали. Алгоритм не особенно экзотичен. Напротив, он концептуально прост, однако при этом точно настроен.

ВДОХНОВЕНИЕ

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

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

ДЕФОРМАЦИЯ ПОЛИГОНА

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

Ядром акварельной техники является алгоритм рекурсивной многоугольной деформации. Это довольно просто, и это происходит примерно так:

  1. Для каждой линии A -> C в многоугольник, найти среднюю точку, B . Из распределения Гаусса с центром в B выберите новую точку B ' .
  2. Обновите многоугольник, заменив линию A -> C двумя строками: A -> B ' и B' -> C
  3. Если мы не достигли максимальной глубины рекурсии, повторите шаг 1, разделив дочерние линии.

В зависимости от изменения в вашем гауссовском распределении и глубине рекурсии это приведет к созданию многоугольника с зубчатыми деталями.

ИСПОЛЬЗОВАНИЕ МЕТОДИКИ ДЕФОРМАЦИИ ПОЛИГОНА

В этом примере я собираюсь применить метод деформации многоугольника к простому правильному многоугольнику:

Основная форма акварелей создается через один раунд деформации многоугольника. Входной многоугольник берется и проходит через функцию деформации несколько раз (где-то около 7). Полученный многоугольник становится «базовым многоугольником» для всех слоев, которые мы создадим. Это выглядит примерно так:

Для каждого слоя начинайте с «базового многоугольника» и запускайте его через функцию деформации еще несколько раз (возможно, 4 или 5). Это создаст многоугольник, похожий на базовый многоугольник, но отличается во всех тонких деталях. Нарисуйте многоугольник с низкой непрозрачностью (где-то около 4%). Повторите это для 30 - 100 слоев. Результат будет выглядеть так:

УТВЕРЖДЕНИЕ: НИЗКИЕ И ВЫСОКИЕ ИЗМЕНЕНИЯ

Шаги до сих пор будут иметь форму, которая имеет несколько мягкие края вокруг. Чтобы дать одинарным краям границы в некоторых областях и мягких краях в других, мы можем назначить разные уровни «дисперсии» для каждого сегмента линии. Сегменты с высокой дисперсией претерпят большие изменения в каждом раунде мутаций, а сегменты с низкой дисперсией претерпят небольшие изменения. Когда сегмент разделен на два дочерних сегмента, эти дети могут наследовать дисперсию родителя. Конечно, дисперсия должна немного уменьшиться, и также неплохо было бы немного рандомизировать, какую дисперсию назначают каждому ребенку. С этим изменением на месте, капли выглядят более интересными:

УТОЧНЕНИЕ: МАСКИРОВКА ТЕКСТУРЫ

Естественная акварель не совсем гладкая и имеет некоторые различия в непрозрачности. Чтобы немного уловить это, вы можете использовать другую текстуру для каждой из 30 - 100 слоев. Маска сделает некоторые части слоя полностью прозрачными, создавая изменения в финальной непрозрачности. В этом примере я случайно размещаю около 1000 маленьких кругов на изображении для текстурной маски.

; draw the watercolor blob shape
(with-graphics the-blob-mask
  (background 0 0 0)
  (stroke 0 0 layer-alpha)
  (fill 0 0 layer-alpha)
  (begin-shape)
  (doseq [[x y] final-poly]
    (vertex x y))
  (end-shape))

; draw the circles onto the texture mask
(with-graphics the-texture-mask
  (background 0 0 0)
  (no-stroke)

  (fill 0 0 layer-alpha)
  (doseq [j (range 900)]
    (let [x (random 0 (w))
          y (random 0 (h))
          len (abs-gauss (w 0.03) (w 0.02))
          [hue sat bright] (color-fn)]
      (fill hue sat bright)
      (ellipse x y len len)))

  ; Blend the watercolor blob shape layer into the current
  ; layer, only taking the darkest pixel from each. This
  ; effectively means we're taking the "intersection" of
  ; the two masks.
  (blend the-blob-mask 0 0 (w) (h) 0 0 (w) (h) :darkest))

(with-graphics the-overlay
  ; make the whole background red
  (background 5 80 80)

  ; apply the combination blob/texture mask
  (mask-image the-texture-mask))

; apply the masked layer
(image the-overlay 0 0)

Результат выглядит следующим образом:

БЛОК ВОДОТОКОВОЙ С МАСКАМИ ТЕКСТУРЫ

УТОЧНЕНИЕ: ЦВЕТНОЕ БЛЕНДИНГ

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

ПРИМЕРЫ РАБОТЫ

Вот несколько работ, которые я создал с помощью этих методов.

ISOHEDRAL XIЛИНЕЙНАЯ

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