Стеклянные предметы в графическом редакторе

   Рисование прозрачных капель ( http://www.proza.ru/2019/12/01/619 ) так вдохновило меня, что я решил попробовать изображать прозрачные предметы.
   С этим не так просто, как с каплями. Прозрачная бутылка отличается от прозрачной капли прежде всего своей величиной. Поэтому саму бутылку нельзя помещать на поле, которое она отражает. Изображение бутылки и фона позади её должны существовать отдельно.
   Кроме того, бутылка явно не сферический предмет. Поэтому алгоритм преломления света в ней несколько другой. А какой? Каким способом можно изобразить пустую часть бутылки и воду внутри неё, которые обладают в общем-то разными преломляющими способностями.
   Каким способом можно задать модель такую, чтобы компьютер понял, откуда именно приходят лучи, выходящие затем через наружную точку на поверхности бутылки, и создающие, по сути своей, цвет этой точки?

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

   К точке, окрашенной в синий цвет, лучи приходят снизу, а к жёлтой точке - сверху.
   И не думайте, что в моей программе в смеси синего и жёлтого получается зелёный. Это верно для прозрачных красок, для акварели. А в гуаши ( в математически правильно построенной гуаши) в такой смеси должен получаться нейтральный серый цвет. Он и получается в программе, даже независимо от того, какая опция, акварель или гуашь в ней установлена.
   Гуашь отличается только большей кроющей силой, а через акварель сильнее проступает фон.
   Надо правильно выбирать цвета - хотите из жёлтого получить зелёный,  не смешивайте его с синим, смешивайте с голубым. А потом темните, то есть увеличивайте цветовой контраст.
   Это я к тому, что нарисовать модель бутылки цветом не так уж и просто.
   Например, на иллюстрации, красный цвет на цветной модели бутылки, это вовсе не этикетка. Красный цвет, это указание компьютеру, что цвет для этого места нужно брать с фона, находящегося от бутылки справа. То есть с затенённой щёчки мальчика. И, взгляните на бутылку в её прозрачном варианте – компьютер именно так и делает.
   Зелёный цвет означает, что надо обратиться к фону выше и левее – там находится освещённая часть лица. Яркий зелёный – ещё выше и ещё левее. Поэтому и появляются тёмные зоны в прозрачной бутылке.
   И, согласитесь, бутылка выглядит естественно и живописно.
   
   Дополнительный к зелёному, яркий сиреневый цвет уведёт нас вниз и направо, но этот цвет я не использовал.
   Сказанное справедливо, если на переключателе Акварель-Гуашь стоит буква «А». Но направления преломления можно поменять на противоположные, если перевести переключатель в положение «G».
   Кроме того, сила преломления зависит от цифры на кнопке «Градация». Варианты есть и здесь. Можно, например, получить изображение прозрачной бутылки при малом значении Градации и закрепить графику на фоне. Затем сделать Градацию максимальной и вновь получить изображение бутылки. Но это изображение не закреплять, а счистить его середину синим ластиком – в месте счистки появится первое, мягкое изображение, в то время как края бутылки останутся прочерченными чётко.

   О ПРАКТИЧЕСКОЙ РЕАЛИЗАЦИИ ПОДРОБНО

   Считываем картинку фона и соображаем, в каком месте будет находиться наш прозрачный предмет.
   Блокируем рисование и кликаем по диагональным углам этого места. Устанавливаем активный белый цвет и, кликнув по кнопке «Fill», заполняем выбранный прямоугольник белым цветом. Затем кликаем по кнопке «д», активизируя буфер.
   Берём кисть с мягкими краями и на белом прямоугольнике изображаем цветную модель будущего прозрачного предмета. Запоминаем модель в буфере, кликнув на зелёном лайке под кнопкой ^^^^.
   Вновь считываем картинку фона и, поставив в нужное положение переключатель Акварель-Гуашь, и выставив нужную цифру на кнопке «Градация», нажимаем на клавиатуре компьютера клавишу «k/л» (на нижнем регистре).

   Не только прозрачные бутылки можно рисовать таким способом. Можно делать известное по Фотошопу красивое размытие изображения.
   Для него нужно приготовить цветовую модель в виде маски со случайно расположенными цветовыми зёрнами. Подходящую маску можно сделать и из самой картинки фона. Для этого выставим на кнопке «Градация» цифру 1, кликнем картинку фона по диагональным углам и нажмём кнопку «Опростить».
   Суть преобразования с цифрой 1 состоит в перемене местами старшего и младшего байта, которые определяют значения составляющий цвета. В результате такой замены в цветах наступает хаос.
   Далее поступаем с маской точно так же, как поступали с цветной моделью бутылки.

   Если результат преобразования изображения цветовой маской кажется чересчур резким, то цветовые переходы в маске легко ослабить, подцветив её нейтральным серым цветом (кнопка «Ц» в левой части окна).
   Гранулы маски можно укрупнить, увеличивая её, или применяя операцию расфокусировки. Расфокусировка состоит в однократном усреднении цвета соседних пикселей. Если маска, или любое другое изображение, находится в буфере |д|, то кнопкой «Градация» задаётся число однократных операций расфокусировки, после чего нужно нажать клавишу «K\Л» на верхнем регистре и подождать несколько секунд, пока эта процедура не завершится.
   Процедуру расфокусировки можно зациклить, если в текстовом поле над кнопкой «Paste» указать число этих циклов. Если расфокусировка проводится при заблокированном рисовании, то она не затрагивает пиксели смежные с прозрачным фоном буфера |д|, сохраняя тем самым чёткие края модели.
   Чтобы ускорить процесс и получить более мягкий цветовой градиент внутри модели, её можно перед расфокусировкой уменьшать. Таким способом была сделана цветовая модель стакана - http://yadi.sk/i/iuEkSYjKPX8c6g 


   АЛГОРИТМ ПРЕОБРАЗОВАНИЯ

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

Вот, собственно, и весь алгоритм этого преобразования:

Public Sub RDR(M As Integer) 'преобразование области в буфере
Dim Co As Long, Cb As Long, Cc As Long, I As Integer, J As Integer
Dim Io As Integer, Im As Integer, Jo As Integer, Jm As Integer
Dim A As Single, X As Integer, Y As Integer
  If Lo(0, 640) = 0 Then
    Form1.Line (0, 0)-(1890, 200), , B: Form1.CurrentY = 0: Form1.CurrentX = 0
    Form1.Print " область |д| не выделена";
  Exit Sub: End If
  A = CVm: Cb = Lo(5, 640): If Cb = 0 Then Exit Sub
  Io = Lo(1, 640): Jo = Lo(2, 640):  Im = Lo(3, 640): Jm = Lo(4, 640)
  If AG = 0 Then A = -A
  For I = Io To Im: For J = Jo To Jm
     Co = Lo(I, J): If Co = Cb Then GoTo 10
     Call cRGB(Co): X = (RR - GG) * A + I: Y = (BB - GG) * A + J
     Cc = Form1.Picture1.Point(X, Y): If Cc < 0 Then Cc = Cb
     If Cc = Cb Then Cc = Cc - 1
     Lo(I, J) = Cc
10  Next J, I:
  Form1.Line (0, 0)-(1890, 200), , B: Form1.CurrentY=0: Form1.CurrentX=0
  Form1.Print " область преобразована";
End Sub
_______

Lo(I, J) это числовой массив, в котором находятся цвета всех пикселей рисунка, Call cRGB(Co) – обращение к процедуре выделения из цвета трёх его составляющих – RR, GG и BB.
  Далее, по разности этих цветовых составляющих, вычисляются координаты XY тех точек рисунка, с которых берётся цвет. Координаты при этом ещё попутно увеличиваются в несколько раз в зависимости от того, какая цифра стоит на кнопке «Градация».
  Cb это цвет пикселей прозрачного фона, которые пропускаются с тем, чтобы не затягивать время преобразования.

  В настоящее время подпрограмма немного усложнена – она стала более удобной, и она включает в себя ещё и опцию расфокусировки, но суть преобразования не изменилась.
_________
2.11.2019


Рецензии
По-моему, гораздо проще взять и нарисовать от руки - хотя бы и в "Пайнте".

Ник Пичугин   03.12.2019 12:02     Заявить о нарушении
А Вы попробуйте. Надо ведь не просто прозрачный предмет нарисовать, но и передать особенности преломления в нём. Кроме того, это нацелено и на мультипликацию, в которой прозрачные предметы могут двигаться по неподвижному фону, например.
Или так - http://yadi.sk/i/vwJG0j0McolcNg ))

Дмитрий Маштаков   03.12.2019 16:19   Заявить о нарушении
Мультипликация – эт да, аргумент. А «особенности преломления» от руки получаются лучше. Раньше мультики были произведением искусства… Неужели мы теперь обречены на ширпотреб?
С уважением, Ник.

Ник Пичугин   03.12.2019 18:13   Заявить о нарушении
Согласен, посмотрите на этот стаканчик с водой - http://www.stihi.ru/2017/07/15/8333
но я несколько часов на этот натюрморт затратил. А на цветовую модель бутылки только пару минут.

Дмитрий Маштаков   03.12.2019 19:34   Заявить о нарушении