Привет, земляне. На днях дошли до меня сведения, что команда разработчиков Blender добавила в свежую версию 4.3 новую механику в геоноды (Geometry Nodes), которая, наконец-то позволяет манипулировать параметрами не только на панели модификаторов или во всплывающем блоке (в случае с инструментами), но и через спец виджеты во вьюпорте, в дальнейшем буду называть их гизмо (gizmo).
Всего завезли 3 ноды для этих целей:

  • Linear Gizmo - виджет для ввода числового значения, который выводит значение дистанции, пройденное виджетом

  • Dial Gizmo - также служит для ввода числового значения, но тут берется в расчет угол поворота виджета, результат возвращается в радианах, то есть полный оборот будет равен 2Пи

  • Transform Gizmo - самый мощный из все троих, может выводить положение, вращение и масштабирование по каждой из трех осей и все это выводит в матрицу трансформации.

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

Linear Gizmo

Начнем по порядку, и с рассмотрением всего на практическом примере. Откройте Blender, добавьте какой-нибудь объект с мешем и создайте новый сетам в Geometry Nodes, далее добавьте в рабочую область ноду Linear Gizmo, появится желтая стрелка в Original Point, виджет будет отображаться покуда выделена соответствующая нода, попробуйте снять с ноды выделение и виджет пропадет, чтобы виджет всегда отображался нажмите на кнопку в виде дуги и стрелки, тогда виджет будет виден, пока выбран данный объект.

Итак, что мы видим, у ноды есть "вход" Value, я не зря взял это слово в кавычки, так как это скорее выход-вход, далее будет понятно почему, этот сокет и будет поставлять нам данные о пользовательских действиях, сейчас добавьте ноду Value и подключите ее к выходу, появится двойная линия, это означает, что двухсторонняя связь между гизмо и нодой Value установлена. Попробуйте подергать стрелочку, и вы заметите, что значение в ноде Value будет изменено, но после того как виджет будет отпущен, он вернется в изначальное положение, в положение, которое установлено на входах Position и Direction, эти 2 вектора определяют положение и направление виджета соответственно, они рассчитываются в локальных координатах объекта. Чтобы виджет менял свое положение и направление, необходимо их вычислить на основе выходного значения. Подергайте виджет несколько раз и понаблюдайте за значением в ноде Value и вы заметите, что происходит аккумуляция значения, попробуйте поменять само значение, и на виджете это никак не скажется.

Рассмотрим пример, где с помощью двух линейных гизмо будем контролировать размеры плоскости. Соберем такой простенький сетап.

Здесь мы создаем меш плоскости с помощью ноды Grid и размеры по осям X и Y подключаем к выходам группы нод. Затем задаем логику взаимодействия входных значений группы нод и гизмо.

Вот тут начинается самое интересное, пока у нас выход Value гизмо подключен напрямую, то тут ничего интересного нет, но когда мы применяем к значению какие-либо операции, то тут уже не все очевидно. Чтобы в этом убедиться сделайте следующее: установите на панели модификаторов SizeXSizeX и SizeY установить Subtype как Distance) как 2 m, затем перетащите красную стрелку на 1 метр вправо, и вы увидите, что SizeX теперь равен 4 метра. Это означает, что при движении данных по красному маршруту производится обратная операция - умножение на 2, когда данные идут в прямом направлении (по синему маршруту), то уже производится деление значения на 2. Таким образом мы делим размер плоскости по оси X на 2 и уже передаем эти данные гизмо на вход Position, тем самым мы задали обратную связь между значением и положением гизмо. Необходимо отметить, что не все ноды могут участвовать в двунаправленной связи, но математические операции в их числе, если же нода такую связь не поддерживает, то линия связи станет одинарной.
У нод гизмо есть парочка параметров, которые определяют внешний вид. Варианты цветов

и варианты отображения (актуально только для Linear Gizmo)

Dial Gizmo

Про это тип гизмо сказать особо нечего, по сути он такой же как и предыдущий, только принимает угол поворота и выводит его в радианах. Также имеет параметр Position; который определяет положение виджета; Up - определяет направление оси вращения; Screen Space - метод отображения виджета, определяет производить расчет размера относительно окна или относительно масштаба объекта; Radius - соответственно радиус кольца.
Для демонстрации надо придумать какой-нибудь бесполезный пример, пусть это будет модификатор, который экструдирует исходную геометрию, а величину экструдирования будем контролировать крутилкой, хотя для этой цели бы подошел предыдущий вариант. Не буду здесь приводит сетам, для тех, кому нужно в конце статьи я оставлю ссылку на исходный файл, там можно будет найти и другие примеры.

Transform Gizmo

Вот эта штука уже поинтереснее, она позволяет нам получить сразу положение, вращение и масштаб, упакованные в одну матрицу. Также тут имеются входные данные для задания положения виджета в пространстве: Position - положение виджета в локальных координатах объекта, Rotation - вращения виджета, работает, только в случае, если Transform Orientations установлен как Local.
Помучаем на это раз еще одну плоскость и соберем для этого следующий сетап

Тут примерно все аналогично прошлому примеру, только на этот раз разбиваем матрицу на отдельные компоненты, в данном случае нас снова снова интересует информация о перемещении.
На панели свойств нод (Sidebar -> Node -> Properties) можно выбрать элементы виджета, которые будут отображены, я оставил только компоненты X и Y для Translation. После того как соберете сетам или откроете готовый пример, то попробуйте повернуть объект вокруг оси Z, заметите такую картину: ориентация виджета не изменилась, это происходит потому, что она зависит от выбранного режима Transform Orientations, если установлен Global, то гизмо всегда ориентируется по глобальным координатам, чтобы он ориентировался по локальным координатам объекта, то соответственно нужно установить режим Local.

Заметил один неприятный момент: нельзя перемещать виджет в определенной плоскости, только по каждой оси отдельно, в то время как у других инструментов такого ограничения нет, что на мой взгляд довольно странно.
Поговорим напоследок о других неочевидный моментах. Убедитесь, что Transform Orientations, установлен как Local, у ноды Combine Transform установите Rotation Z =-180°, затем потяните за красную стрелку в прямом направлении, то заметите, что плоскость будет сжиматься, а направление гизмо при этом не изменилось, но в случае со вращением достаточно установить обратную связь, чтобы виджет изменял свое вращение соответствующим образом. С масштабирование такая же история, если установить к примеру Scale X = -1, то будет аналогичная реакция.

Вместо заключения

В последней версии Blender 4.3 (на момент написания данного материала) разработчики из Blender Foundation добавили средства, которые позволяют нам манипулировать данными в сетапе геонодов прямо через вьюпорт, такая фича напрашивалась сама собой. Напомню, что геоноды появились в феврале 2021 года с версией 2.92. К сожалению не обошлось без косяков: не понятно зачем было добавлять у нод выход, который совершенно не нужен, только лишний раз вводит в заблуждение. Для воплощения данной фичи была реализована двунаправленная передача данных, для реализации которой вероятнее всего пришлось переработать уже существующие ноды, их точный перечень не приводится, но сейчас можно сказать точно: её поддерживают математические операции, операции по объединению и разделению векторов и матриц на компоненты, а большего, наверное, и не надо, в любом случае, следите за линиями связи, если они перестали быть двойными, то что-то пошло не по плану. Также у гизмо отсутствует возможность выполнять трансформацию сразу в определенной плоскости, будем надеяться, что в будущем это пофиксят, можете толкнуть разработчиков лишний раз через их веб-ресурсы. Конечно, еще было бы здорово, чтобы все существующие модификаторы имели свои аналоги в виде нод, но пока имеем то, что имеем.
На этом сегодня все, до связи.

Ссылки

Комментарии (1)


  1. AlexXYZ
    02.12.2024 08:08

    Наконец-то они этот API вытащили в UI. Так-то этот API давно существует и даже есть аддон ещё для Blender 2.83 https://blendermarket.com/products/lily-gizmos (только он с геонодами никак не связан). Жаль, что они не дотягивают до Constrains. Так-то на Constrains можно целые графические интерфейсы писать (в основном для аниматроники, но у Constrains есть недостаток - их не скопировать вместе с объектом).