Скомбинировав экструд текста с несложной математической операцией можно получить интересный эффект объемного текста волнами.
Добавим в сцену куб (shift + a – Mesh – Cube), назначим ему модификатор Geometry Nodes и инициализируем начальное дерево нод, нажав на кнопку “New”.
Исходная геометрия куба нам не нужна, мы будем использовать текст.
Добавим нод String to Curves (shift + a – Text – String to Curves) в главную ветку дерева нод. В поле “String” укажем какой-нибудь текст.
Заполним контуры при помощи нода Fill Curve (shift + a – Curve – Fill Curve) добавив его сразу после нода String to Curves.
Для придания тексту объема используем нод Extrude Mesh (shift + a – Mesh – Extrude Mesh), добавив его после нода Fill Curve. В поле “Offset Scale” укажем значение 2 для более долгого экструда.
Для удобства можно повернуть весь объект с текстом на 90 градусов вокруг оси X (r – x – 90).
Чтобы дальше работать с геометрией текста после нода Extrude Mesh добавим нод Realize Instances (shift + a – Instances – Realize Instances).
Теперь вместо инстансов букв у нас единый меш.
Сейчас вся геометрия сосредоточена на передней и задней плоскостях меша. Для того чтобы сделать волны нам нужны точки посередине. Подразобьем меш при помощи нода Subdivide Mesh (shift + a – Mesh – Subdivide Mesh), добавив его после нода Realize Instances.
Уровень подразделения выставим равный 5.
Теперь у меша достаточное количество точек по бокам для того, чтобы ими манипулировать.
Добавим нод Set Position (shift + a – Geometry – Set Position) после нода Subdivide Mesh. С его помощью мы будем управлять положением точек.
Для того чтобы образовать волну, каждую точку меша нужно сдвинуть вдоль локальной оси Y при помощи функции синуса sin(). Аргументом функции синуса будет служить положение точки вдоль экструда, то есть вдоль локальной оси Z.
Положение для каждой точки мы можем получить с помощью нода Position (shift + a – Input – Position).
Чтобы получить смещения точек отдельно вдоль осей Y и Z используем нод Separate XYZ (shift + a – Vector – Separate XYZ).
Функцию синуса мы можем получить при помощи нода Math (shift + a – Utilities – Math) в режиме “Sine”.
И собрать смещения по отдельным осям Y и Z обратно в единый вектор при помощи нода Combine XYZ (shift + a – Vector – Combine XYZ).
Добавим и последовательно соединим все перечисленные ноды. Результат вычислений линкуем с входом “Offset” нода Set Position.
Теперь если двигаться вдоль локальной оси Z меша, то есть вдоль направления экструда, положение каждой точки смещается вдоль локальной оси Y на значение синуса, образуя нужную нам волну.
Для управления амплитудой и частотой волны добавим перед и после нода Sine еще по одному ноду Math (shift + a – Utilities – Math) в режиме Multiply.
Левый нод отвечает за частоту волн, поставим в его свободном поле значение 4.0. Правый – за высоту волны, в его свободном поле укажем значение 0.1.
Таким образом мы получили требуемую форму волны.
Добавим немного динамики – свяжем положение волны с таймлайном.
Для того чтобы получить текущий кадр анимации с таймлайна добавим нод Scene Time (shift + a – Input – Scene Time).
Сразу после нода Separate XYZ добавим еще один нод Math (shift + a – Utilities – Math) в режиме сложения Add. Соединим выход “Frame” нода Scene Time с его свободным входом.
Таким образом к каждому смещению точек мы добавляем значение текущего кадра.
Если теперь запустить анимацию будет видно движение.
Однако движение получается очень дерганным. Для того чтобы оно стало плавнее, уменьшим добавляемое значение кадра в 10 раз.
Добавим нод Math (shift + a – Utilities – Math) в режиме умножения Multiply сразу после нода Scene Time. В оставшемся свободном поле введем значение 0.1.
Теперь анимация выглядит гораздо плавнее и приятнее.