Стеклянные предметы в графическом редакторе
С этим не так просто, как с каплями. Прозрачная бутылка отличается от прозрачной капли прежде всего своей величиной. Поэтому саму бутылку нельзя помещать на поле, которое она отражает. Изображение бутылки и фона позади её должны существовать отдельно.
Кроме того, бутылка явно не сферический предмет. Поэтому алгоритм преломления света в ней несколько другой. А какой? Каким способом можно изобразить пустую часть бутылки и воду внутри неё, которые обладают в общем-то разными преломляющими способностями.
Каким способом можно задать модель такую, чтобы компьютер понял, откуда именно приходят лучи, выходящие затем через наружную точку на поверхности бутылки, и создающие, по сути своей, цвет этой точки?
А что, если информацию об этом довести до компьютера через цвет? Бутылку можно просто нарисовать, придав её поверхности разные цвета - если цвет скорее красный, нежели чем голубой, значит луч к этой точке пришёл с правой части рисунка, если превалирует голубой, то луч пришёл слева.
Красный и голубой - дополнительные друг к другу цвета, если их смешать, то получится нейтральный серый цвет. Если цвет такой, значит и преломления фактически в этой части не будет.
К точке, окрашенной в синий цвет, лучи приходят снизу, а к жёлтой точке - сверху.
И не думайте, что в моей программе в смеси синего и жёлтого получается зелёный. Это верно для прозрачных красок, для акварели. А в гуаши ( в математически правильно построенной гуаши) в такой смеси должен получаться нейтральный серый цвет. Он и получается в программе, даже независимо от того, какая опция, акварель или гуашь в ней установлена.
Гуашь отличается только большей кроющей силой, а через акварель сильнее проступает фон.
Надо правильно выбирать цвета - хотите из жёлтого получить зелёный, не смешивайте его с синим, смешивайте с голубым. А потом темните, то есть увеличивайте цветовой контраст.
Это я к тому, что нарисовать модель бутылки цветом не так уж и просто.
Например, на иллюстрации, красный цвет на цветной модели бутылки, это вовсе не этикетка. Красный цвет, это указание компьютеру, что цвет для этого места нужно брать с фона, находящегося от бутылки справа. То есть с затенённой щёчки мальчика. И, взгляните на бутылку в её прозрачном варианте – компьютер именно так и делает.
Зелёный цвет означает, что надо обратиться к фону выше и левее – там находится освещённая часть лица. Яркий зелёный – ещё выше и ещё левее. Поэтому и появляются тёмные зоны в прозрачной бутылке.
И, согласитесь, бутылка выглядит естественно и живописно.
Дополнительный к зелёному, яркий сиреневый цвет уведёт нас вниз и направо, но этот цвет я не использовал.
Сказанное справедливо, если на переключателе Акварель-Гуашь стоит буква «А». Но направления преломления можно поменять на противоположные, если перевести переключатель в положение «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
Свидетельство о публикации №219120201990
Ник Пичугин 03.12.2019 12:02 Заявить о нарушении
Или так - http://yadi.sk/i/vwJG0j0McolcNg ))
Дмитрий Маштаков 03.12.2019 16:19 Заявить о нарушении
С уважением, Ник.
Ник Пичугин 03.12.2019 18:13 Заявить о нарушении
но я несколько часов на этот натюрморт затратил. А на цветовую модель бутылки только пару минут.
Дмитрий Маштаков 03.12.2019 19:34 Заявить о нарушении