Текст вдоль кривой в Blender Geometry Nodes

Изгиб текста вдоль кривой является одним из эффектных приемов создания различных необычных и интересных надписей. В Blender это можно сделать при помощи Geometry Nodes.

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

Для начала добавим нод, который создаст нам геометрию в сцене из текстовой строки – String to Curves (shift + a – Text – String to Curves). В поле “String” введем любой текст.

Для того чтобы текст распределялся по точкам исходной кривой, воспользуемся нодом Instance on Points (shift + a – Instances – Instance on Points).

Главную ветку дерева с исходной геометрией кривой соединим c его входом Points, чтобы брать точки кривой.

Выход “Curve Instances” нода String to Curves соединим с его входом “Instances” – таким образом в каждую точку кривой мы помещаем инстанс сгенерированной строки.

Сейчас в каждой точке размещается вся строка целиком. Отметим чекбокс “Pick Instances” в ноде Instance on Points. Теперь в каждой точке кривой будет размещаться один элемент из набора инстансов, подаваемого на нод, то есть одна буква.

Для наглядности объединим геометрию текста и кривой при помощи нода Join Geometry (shift + a – Geometry – Join Geometry).

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

Вынесем ввод текстовой строки в отдельный нод String (shift + a – Input – String). Скопируем в него исходный текст и подсоединим обратно к ноду String to Curves.

При помощи нода String Length (shift + a – Text – String Length) мы можем получить количество букв в нашей строке текста.

Теперь при помощи нода Resample Curve (shift + a –  Curve – Resample Curve) подразобьем кривую на количество точек равное количеству букв в строке, чтобы уместить на кривую всю нашу строку целиком.

Теперь мы видим всю строчку целиком, однако буквы явно не совпадают с положением точек на кривой.

Так происходит из-за особенностей работы опции “Pick Instance” нода Instance on Points. Для каждой следующей точки он выбирает из набора букв следующую букву, но не учитывает ее смещение в строке. Поэтому только самая первая буква, у которой нет смещения относительно начала строки стоит на своем месте на кривой.

В этом можно убедиться сделав кривую более наклонной, а после чего несколько раз включить и выключить чекбокс “Pick Instance”.

При выключенном чекбоксе мы видим строку целиком, а при включенном – только одну букву, но на том самом месте, где она располагается в целой строке.

Для того чтобы убрать все смещения, добавим нод Set Position (shift + a – Geometry – Set Position) сразу после нода String to Curves. Добавим нод Vector (shift + a – Input – Vector) и соединим его выход со входом “Position” нода Set Position. Так как все три поля нода Vector равны 0, мы таким образом устанавливаем расположение каждой буквы в нулевой точке.

Уменьшим масштаб букв в поле “Size” нода String to Curves до 0.15.

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

Добавим нод Align Euler to Vector (shift + a – Utilities – Align Euler to Vector) который выполнит нужное нам преобразование. Добавим его и соединим его выход “Rotation” со входом “Rotation” нода Instance on Points.

Вектор касательной к кривой мы можем получить с нода Curve Tangent (shift + a – Curve – Curve Tangent). Добавим его и соединим его выход “Tangent” со входом “Vector” нода Align Euler to Vector.

Однако вместо нода Curve Tangent лучше воспользуемся нодом Sample Curve, у него тоже есть выход “Tangent”, и он пригодится нам в дальнейшем, когда мы будем сдвигать текст вдоль кривой.

Добавим нода Sample Curve (shift + a – Curve – Sample Curve) и соединим его вход “Curves” с выходом “Geometry” нода Group Input, чтобы получать касательную к исходной геометрии кривой. Выход “Tangent” точно так же соединим со входом “Vector” нода Align Euler to Vector.

Сейчас все буквы наклонены под одним и тем же углом к кривой, взятом от первой буквы. Чтобы правильно считать угол касательной в каждой точке кривой, нужно подать положение  этих точек на вход “Factor”.

Добавим нод Index (shift + a – Input – Index). С него мы можем получить порядковый номер для каждой точки кривой.

Поделив количество букв в строке на порядковый номер каждой буквы мы получим положение для каждой буквы на кривой.

Добавим нод Math (shift + a – Utilities – Math) и переключим его в режим “Divide”. Верхний вход соединим с выходом “Index” нода Index, а нижний – с выходом “Length” нода Curve Length. Выход нода Math соединим со входом “Factor” нода Sample Curve.

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

Для того чтобы иметь возможность сдвигать буквы вдоль кривой, нам нужно двигать не сами буквы, а точки на кривой, в которых они размещаются. Добавим нод Set Position (shift + a – Geometry – Set Position) и поставим его в ветку между нодами Resample Curve и Instance on Points, чтобы он влиял на точки кривой.

Выход “Position” нода Sample Curve соединим со входом “Position” нового нода Set Position.

Теперь положение каждой точки на кривой определяется нодом Sample Curve и управляется через его вход “Factor”.

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

Добавим нод Math (shift + a – Utilities – Math) в режиме “Add” и вставим его сразу за нодом деления Divide.

Скроллируя значение в оставшемся свободном входе “Value” мы будем смещать буквы вдоль кривой.

Чтобы буквы не сбивались в кучу в конце кривой, добавим еще один нод Math (shift + a – Utilities – Math) сразу после нода сложения Add. Переключим его в режим “Modulo”. В оставшемся свободном входе укажем значение 1 (т.к. диапазон изменения поля “Factor” нода Sample Curve изменяется от 0 до 1).

Таким образом мы зациклили строку текста так, что следом за последней буквой сразу идет первая. Чтобы между последней буквой и первой оставался промежуток, в конец строки в ноде String добавим пару пробелов.

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

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

2 Комментарий
Новые
Старые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
нонейм
нонейм
11 месяцев назад

Пипец, я это повторил, но не понимаю как и зачем и как этим пользоваться. Более того мне вообще нужно было расположить буквы по circle и поставить их вертикально т.е.90градусов ротейт по x

Последний раз редактировалось 11 месяцев назад нонейм ем