Паттерн лабиринта на Blender Geometry Nodes

При помощи Blender Geometry Nodes можно создавать бесшовные паттерны, располагая и комбинируя  отдельные элементы нужным образом. Такой принцип называется “Плитки Труше“.  Для примера создадим бесшовный процедурный паттерн классического лабиринта со скругленными углами.

Добавим в сцену куб (shift + a – Mesh – Cube), назначим ему модификатор Geometry Nodes и создадим начальное дерево нод, нажав на кнопку “New”.

Исходная геометрия куба нам не нужна, поэтому можно сразу отсоединить нод Group Input.

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

Добавим нод Bezier Segment (shift + a – Curve – Primitives – Bezier Segment) в главную ветку нодового дерева.  Переключим его в режим Offset. Зададим разрешение равное 12.

Для начальной точки в поле Start установим координаты X = 1, Y = 0, Z = 0. Для ее управляющей точки  в поле Start Handle установим координаты X = -0.55, Y = 0, Z = 0.

Для конечной точки в поле End установим координаты X = 0, Y = 1, Z = 0. Для ее управляющей точки  в поле End Handle установим координаты X = 0 Y = -0.55, Z = 0.

Для создания симметричной части паттерна продублируем нод Bezier Segment – выделим его и нажмем shift + d.

Так как нам нужна симметричность, просто поменяем знаки у выставленных значений для начальной, конечной и управляющих точек:

Start: X = -1, Y = 0, Z = 0

Start Handle: X = 0.55, Y = 0, Z = 0

End: X = 0, Y = -1, Z = 0

End Handle: X = 0 Y = 0.55, Z = 0

Добавим нод Join Geometry (shift + a – Geometry – Join Geometry) в главную ветку нодового дерева и подключим к его входу оба нода Bezier Segment, чтобы объединить две части паттерна в одно целое.

Для того чтобы придать кривым объем, воспользуемся нодом Curve to Mesh. Добавим его в основную ветку нодового дерева (shift + a – Curve – Operations – Curve to Mesh).

Добавим нод Curve Circle (shift + a – Curve – Primitives – Curve Circle). Эта окружность будет служить профилем для кривых нашего паттерна. Соединим ее выход Curve со входом Profile Curve нода Curve to Mesh.

Теперь у нас есть объемный элемент паттерна.

Размножим его по горизонтали в вертикали, расположив элемент по точкам сетки.

В основную ветку дерева добавим нод Instance on Points (shift + a – Instances – Instance on Points). Выход нода Curve to Mesh переключим на вход Instance.

Добавим нод Grid (shift + a – Mesh – Primitives – Grid). Его выход Mesh соединим со входом Points нода Instance on Points.

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

Для соответствия масштаба установим в ноде Grid размер сторон сетки Size X и Size Y равный 10, а количество точек Vertices X и Vertices Y равное 6 (10 / 2 + 1).

Таким образом мы получили равномерное распределение паттерна по площади.

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

Добавим нод Combine XYZ (shift + a – Utilities – Vector – Combine XYZ), для того чтобы иметь возможность управлять поворотом только для одной оси Z. Подключим его выход ко входу Rotation нода Instance on Points, который отвечает за поворот каждого инстанса.

Случайное значение – сколько раз нам нужно повернуть паттерн, мы можем получить при помощи нода Random Value. Добавим его (shift + a – Utilities – Random Value), переключим в режим Integer и соединим его выход Value со входом Z нода Combine XYZ.

Теперь каждый элемент паттерна повернут вокруг оси Z на целое число. Чтобы ограничить поворот только на 90 градусов, нам нужно умножить это число на 90 градусов. Так как Blender считает повороты в радианах, переведем 90 градусов в радианы и получим PI/2 или 1.5708.

Добавим между нодами Random Value и Combine XYZ нод Math (shift + a – Utilities – Math – Math). Переключим его в режим умножения Multiply и в доставшееся свободным нижнее поле введем pi/2.

Теперь каждое случайное значение от 1 до 100, получаемое с нода Random Value, умножается на 90 градусов и каждый элемент паттерна поворачивается на результат умножения, то есть – от одного до ста раз по 90 градусов.

В результате мы получили рисунок лабиринта.

Подобрать подходящую комбинацию можно изменяя значение в поле Seed нода Random Value.

Для того чтобы соединить элементы паттерна и скрыть швы, добавим в конец нодового дерева два нода. Realize Instance (shift + a – Instances – Realise Instance) превратит инстансы элементов паттерна в управляемую геометрию. А Merge by Distance (shift + a – Geometry – Operations – Merge By Distance) соединит совпадающие точки отдельных элементов, чтобы устранить швы.

Паттерн лабиринта готов.

5 1 голос
Article Rating
Подписаться
Уведомить о
guest

0 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии