EN
Andrey Sokolov
Andrey Sokolov
725 subscribers
goals
17 of 500 paid subscribers
Когда я наберу 500 платных подписчиков, смогу больше времени уделять записи видео и разработке аддонов для Blender.
360.79 of $ 1 135 money raised
Донаты || Donates
37.59 of $ 568 money raised
Cделать аддон True Time Remapping бесплатным для всех желающих навсегда. Make True Time Remapping add-on free for everyone forever.
113.49 of $ 114 money raised
На дисковый накопитель 4Tb для хранения бэкапов курса «Blender Избушка».

Волосы на геонодах ► 08. Финализация

Конечно, на каком этапе приступать к финализации системы решать только вам. И разумеется, если после финализации вы захотите убрать или добавить в систему какие-то ещё функции, нужно отбросить все сомнения и просто это сделать. Напомню, что эта серия уроков - просто примеры готовых решений конкретных задач, и я надеюсь, их окажется достаточно, чтобы уловить общую логику и придумывать собственные решения, под те задачи которые будут вставать уже перед вами.
Буду очень благодарен всем, кто решит поддержать проект материально. В данный момент это можно сделать только здесь, на Boosty, сделав разовый платёж или оформив спонсорскую подписку приемлемого для вас уровня (от 200 р. в месяц).
Под финализацией системы я понимаю организацию её таким образом, чтобы её можно было легко использовать на любом другом объекте и управлять ею напрямую в настройках модификатора, не заходя в сам редактор геометрических нодов. 
В данный момент у нас есть нод-группы, которые регулируют длину волосугол наклонаизгиб волоснастройки дочерних волостолщину волос и неровности ↓
УДОБНЫЙ СПОСОБ ЗАМЕНЫ ОБЪЕКТА-ЭМИТТЕРА
В некоторых из этих групп используется нод Object Info для получения данных о нормалях либо иных атрибутах объекта эмиттера. Сейчас все ноды Object Info скрыты внутри групп, и чтобы заменить в системе объект-эмиттер, если мы захотим использовать систему волос на другом объекте, нам придётся продублировать всю систему, продублировать блоки данных во всех нод-группах, найти внутри них ноды Object Info и заменить в них объект-эмиттер на нужный. Опытный пользователь даже от этого описания схватится за голову. Вместо этого, мы можем вывести объект-эмиттер в качестве входящего параметра и назначать его прямо в настройках модификатора для каждого нужного нам объекта. При этом всё нодовое дерево и все нод-группы внутри него останутся теми же самыми, их не надо будет дублировать и как-либо модифицировать.
Для начала во всех созданных нами нод-группах надо проделать следующее:
1. Найти в них нод Object Info, если он там используется ↓
2. Подключить его вход с объектом-эмиттером к свободному выходу в Group Input ↓ 
После того, как это будет сделано для всех групп, в которых используется Object Info, нужно подключить ново-созданные входы групп с объектом-эмиттером к свободному выходу в ноде Group Input в основном дереве нодов. Если вы обратили внимание, основное дерево нодов в Геометрических Нодах также сделано в виде нод-группы - у него есть Group Input и Group Output. Назначаемые в них входы и выходы отображаются в модификаторе, и их можно использовать для управления параметрами нодового дерева снаружи - из настроек модификатора ↓
В N-панели во вкладке Group можно переименовать вход Object в Emitter, чтобы не возникало сомнений, какой объект ожидается на входе ↓
УПРАВЛЕНИЕ ПАРАМЕТРАМИ С ПОМОЩЬЮ ЦВЕТА
Вполне вероятно, что на разных участках объекта-эмиттера нам потребуется по-разному регулировать какой-нибудь (любой) из параметров, например, длину волос. Для этого я предлагаю использовать цветовые атрибуты объекта-эмиттера. В оригинале они называются Color Attributes, а в более ранних версиях Blender назывались Vertex Colors. Они добавляются в Блендер в панели внизу справа, во вкладке Object Data Properties (иконка - зелёный перевёрнутый треугольник), в подвкладке Color Attributes, с помощью плюсика, а отрисовываются на поверхности меша в 3Д вьюпорте в режиме Vertex Paint. Процесс напоминает отрисовку текстур вручную, только вместо текстур, спроецированных на поверхность объекта, используются вертексы объекта, а цвета между соседними вертексами интерполируются линейно, постепенно перетекая друг в друга. Поскольку цвет - это 3 числовых значения в диапазоне от 0 до 1 для красного, зелёного и синего каналов, мы можем использовать его для определения числового значения длины волос вокруг каждого вертекса. Но обо всём по порядку.
Для начала добавим в основном дереве нодов в N-панели новый вход. Тип данных выставим на Color, название изменим на Length, потому что  предполагаем использовать его для регулировки длины волос. Значение Default установим на красный цвет. Поскольку мы будем использовать числовые значения RGB, имеет смысл при установке цвета переключить во всплывающем при нажатии на цвет цветовом круге режим на RGB и установить точные значения 1 - для красного канала (R) и 0 - для зелёного и синего каналов (G, B) ↓
Идея использования цвета, а не, например, чёрно-белой маски, в том, что так мы можем задавать значения, существенно выходящие за пределы диапазона от 0 до 1. Я предлагаю следующую систему. Числовое значение цвета устанавливается из числового значения красного канала, к которому прибавляется числовое значение зелёного канала, умноженное на 10 и числовое значение синего канала, умноженное на 100.
Таким образом получается, что пока для вертексов поверхности в качестве Color Attribute выставлен чистый красный цвет, длина волос не меняется. Подмешивая для каких-то участков зелёный канал, мы дополнительно увеличим на них длину волос вплоть до десяти раз, а добавляя синий канал - вплоть до ста. Максимальное значение, которое мы сможем таким образом получить при сумме всех каналов равно 1 + 10 + 100 = 111. И это ровно в сто одиннадцать раз расширяет диапазон, по сравнению с  использованием чёрно-белых масок.
Систему конвертации цвета в число мы можем собрать прямо в основном дереве, используя Separate XYZ для получения числовых значений каждого канала и ноды Math в разных режимах для совершения необходимых математических операций. Напомню что Add означает сложение, Multiply - умножение ↓
Если сейчас подключить получившуюся систему, принимающую на вход чистый красный цвет (после создания в основном нодовом дереве входа Length мы можем задавать цвет прямо в настройках модификатора), к параметру Scale в нод-группе GN Hair Length, то мы увидим, что длина волос не поменялась, потому что система конвертации на выходе дала 1 для всех точек поверхности ↓
Поскольку, вероятно, аналогичную систему мы захотим использовать и для других параметров, компактизируем ноды... ↓
И объединим их в группу с помощью Ctrl+G, выйдем наружу с помощью Tab, активируем значок щитка и назовём группу GN Hair RGB to Value
Чтобы использовать цветовые атрибуты объекта-эмиттера в нодовой системе волос, нам понадобится предварительно их в неё провести. Переключимся в Object Mode на объект-эмиттер ↓
И, нажав наверху редактора Geometry Node Editor кнопку New создадим новый блок данных Geometry Nodes, на этот раз для эмиттера. Модификатор на объект добавится автоматически ↓
Чтобы зафиксировать Color Attribute в качестве атрибута объекта, нам понадобится включить в цепь нод Store Named Attribute (задать именованный атрибут),  и поскольку в качестве атрибута мы будем проводить цвет, тип данных нужно переключить на Color ↓
В качестве домена оставим Point, поскольку предполагается, что цветовые атрибуты будут добавляться к вертексам объекта. И в графе Name впечатаем hair_length или любое другое имя атрибута, которое позже будем использовать уже в нодовой системе волос ↓
Теперь у всех вертексов объекта-эмиттера, помимо их позиций, индексов, нормалей и других атрибутов появился новый атрибут hair_length. Конкретные его значения для каждого вертекса нам и предстоит определить. Для этого подключим вход Value к свободному выходу из Group Input
↑ В модификаторе можно увидеть новый вход Value с типом данных "цвет". В таком виде цвет, который мы укажем в модификаторе, будет присвоен в качестве значения атрибута hair_length всем вертексам объекта.
Чтобы начать использовать не один цвет, а Color Attributes объекта, их нужно сначала добавить, хотя бы один. Напомню, это делается в панели внизу справа, во вкладке Object Data Properties, в подвкладке Color Attributes с помощью плюсика, после нажатия на который всплывает меню с настройками, в котором мы можем задать название атрибута, домен, тип данных и дефолтный цвет ↓
Назовём этот Color Attribute, например Hair Length, чтобы не путать с именованным атрибутом, для которого он позже будет присвоен в нодах ↓
Предлагаю здесь сделать ошибку и пока забыть подключить его в модификаторе для передачи в именованный атрибут. Ошибки помогают лучше запомнить, почему могут не работать те или иные вещи.
Пока переключимся обратно на волосы и добавим в основном дереве нодов нод Object Info, объект для которого сразу возьмём из входа Emitter ↓ 
С его помощью мы можем получить нужный нам именованный атрибут. Для этого нам понадобится нод Transfer Attribute, позволяющий переносить атрибуты с одного объекта на другой ↓
В качестве атрибута мы будем использовать именованный атрибут. Подключим ко входу Attribute нод Named Attribute, убедимся, что тип данных выставлен на Color (цвет) ↓ 
В графе Name мы должны использовать то же имя атрибута, которое ранее задали в нодовом дереве объекта-эмиттера, когда создавали именованный атрибут. В моём случае это hair_length
Теперь, если мы подключим передаваемый атрибут в качестве значения в нод-группу GN Hair RGB to Value, то все волосы станут нулевой длины, потому что по умолчанию цвет задан чёрным, что означает, что для всех трёх каналов RGB их значения равны 0. "Кудряшки" образуются за счёт нод-группы изгиба волос и нод-группы регулировки неровностей волос ↓
Чтобы регулировать длину волос, в Object Mode выберем объект-эмиттер и переключимся в режим Vertex Paint ↓ 
В верхней панели инструментов переключим цвет на красный. Если у вас нет верхней панели инструментов, она включается в 3Д вьюпорте в верхнем меню View
Начнём рисовать на поверхности объекта... ↓
...чтобы убедиться, что ничего не меняется, из-за совершённой ранее ошибки. Если мы откроем вкладку с модификаторами, то увидим, что в настоящий момент в качестве цвета, который мы используем для определения длины волос, назначен обычный цвет. А нам нужно, чтобы вместо него использовался Color Attribute. Чтобы это сделать, нужно нажать на иконку с широким крестиком слева от цвета ↓
Тогда вместо цвета появится строка, в которой вы можете выбрать нужный параметр. Нас интересует параметр Point - Hair Length. Это тот самый Color Attribute Hair Length, который мы создали раньше и на котором сейчас пытались рисовать ↓
Теперь, как только мы его выберем, Color Attribute, который мы будем отрисовывать в Vertex Paint, начнёт определять длину волос, по той схеме, которую мы определили раньше: добавляя красный цвет, мы будем менять длину волос от 0 до 1... ↓
...Подмешивая к красному зелёный цвет (в сумме даёт жёлтый), мы будем увеличивать длину волос уже за пределами единицы ↓
Вероятно, не для всех объектов и не для всех параметров нам нужно будет использовать Color Attributes. Чтобы сохранить эту возможность, но при этом иметь возможность контролировать параметр также и одним цветом из настроек модификатора, можно использовать нод Mix для смешивания значения, которое приходит из Color Attributes эмиттера в качестве именованного параметра, и цветового значения, которое задаётся непосредственно в настройках модификатора Geometry Nodes на самих волосах ↓
Просто подключим фактор Mix в качестве нового входа, переименуем вход, например, в Length from Emitter (длина из эмиттера), поменяем в Mix местами входящие цвета, чтобы на нуле использовался оригинальный цвет, а на единице - Color Attribute из эмиттера и подключим результат к GN Hair RGB to Value
Теперь мы можем управлять нужным параметром прямо из модификатора и рисуя в Vertex Paint цвета для вертексов объекта-эмиттера ↓
Я показал, как регулировать длину волос в качестве примера, но таким же образом можно регулировать и абсолютно любой другой параметр, например изгиб волос, количество детей и их расстояние от родительского волоса, уровень или размер неровностей - всё, что вы сочтёте нужным.
Это последний урок из этой серии. Надеюсь, вам было интересно, и эта информация окажется для вас полезной. Повторюсь, это не некий полный охват всех возможностей, а скорее стартовая точка, от которой можно отталкиваться в дальнейшем при создании собственных систем. Буду рад вашим комментариям, оценкам, помощи в распространении уроков, спонсорству и донатам.
Спасибо, что уделили ваше время, увидимся в новых сериях, подписывайтесь и следите за новостями!
avatar
Даже этого стартового достаточно чтобы сломать голову. Как разобраться в этих десятках нодов и потом применять к месту нужный?
avatar
Денис Соколинский, ---только идущий осилит дорогу-----, сам в такой проблеме, может эта наша нерешительность решать сложности просто отмазка?

Subscription levels

1-й уровень

$ 2,27 per month
1-й уровень

2-й уровень

$ 5,7 per month
2-й уровень

3-й уровень

$ 11,4 per month
3-й уровень

4-й уровень

$ 22,7 per month
4-й уровень

5-й уровень

$ 57 per month
5-й уровень

Максимальная поддержка

$ 114 per month
Максимальная поддержка
Go up