Для того чтобы сделать пружину при помощи Geometry Nodes в Blender нужно всего лишь применить немного векторной математики. Взяв за основу прямую линию можно переместить ее точки в соответствии с формулой окружности так, что в итоге они образуют пружину.
Откроем пустую сцену в Blender, добавим в ее куб (shift+a – Mesh – Cube), повесим на него модификатор Geometry Nodes и нажатием на кнопку New создадим пустое дерево нод геометрии.
Удалим нод Group Input так как мы не будем использовать исходную геометрию куба, а построим пружину с нуля.
Добавим нод Curve Line (shift + a – Curve Primitives – Curve Line). Этот нод создает прямую линию, состоящую из двух точек. Местоположение первой из них установим в начале координат – все координаты точки Start установим в 0.0. Вторую точку расположим на расстоянии 10 метров по оси X – координату X у точки End зададим равной 10.0, а остальные – 0.0.
Соединим нод с нодом Group Output.
Подразобъем кривую, добавив ей промежуточных точек. Для этого добавим в дерево нод Resample Curve (shift + a – Curve – Resample Curve) и поставим количество добавляемых точек равное 100.
Теперь немного математики.
Для того чтобы получить из линии пружину, нам нужно сдвинуть каждую ее точку так, чтобы она лежала на цилиндре, ось которого совпадает с нашей линией.
Так как цилиндр – это окружность, растянутая вдоль нашей прямой, мы можем использовать формулу окружности для подсчета, на сколько нам нужно сдвинуть точки.
Координаты X и Y точек на окружности определяются в зависимости от угла наклона вектора “a”, который в нашем случае трансляции окружности вдоль прямой напрямую зависит от текущего положения точки на нашей прямой.
Вернемся к нашим нодам.
Для того чтобы сдвигать точки прямой нужным образом, добавим в дерево нод Set Position (shift+a – Geometry – Set Position).
Смещение точек нам нужно подать не его вход Offset. Этот вход имеет векторный тип.
Реализуем формулу для окружности с помощью нод.
Добавим нод Combine XYZ (shift + a – Vector – Combine XYZ).
Так как наша прямая лежит вдоль оси X, если посмотреть на нее с торца (так, чтобы цилиндр выглядел как окружность), ось Z буде соответствовать оси Y из формулы, а ось Y – оси Х из формулы.
Поэтому формулу нужно собирать, подавая значения sin() и cos() на входы Y и Z нода Combine XYZ.
Добавим нод Math (shift + a – Utilities – Math), переключим его в режим “sin” и соединим его выход Value со входом Z нода Combine XYZ.
Добавим еще одни такой же нод Math, переключим его в режим “cosine” и соединим со входом Y нода Combine XYZ.
Теперь нужно связать формулу с координатами точек на прямой.
Добавим нод Position (shift + a – Input – Position). Этот нод возвращает вектор положения каждой точки нашей прямой.
Так как угол поворота “a” у нас зависит только от удаленности точки от начала прямой, то от положения точек на прямой нам нужна только их X координата.
Добавим нод Separate XYZ (shift + a – Vector – Separate XYZ) и соединим его вход Vector с выходом Position нода Position. Выход X нода Separete XYZ соединим со входами Value обоих нодов Math.
Таким образом мы получили смещение каждой точки прямой к окружности. Соединим выход Vector нода Combine XYZ с входом Offset нода Set Position, чтобы задать точкам прямой рассчитанное смещение.
Прямая превратилась в спиральную пружину.
Для придания ей толщины добавим нод Curve To Mesh (shift + a – Curve – Curve To Mesh) в основную ветку нодового дерева, после нода Set Position.
Также добавим нод Curve Circle (shift + a – Curve Primitives – Curve Circle). Этот нод будет задавать профиль, который обходя по нашей пружине, придаст ей толщину. Соединим его выход Curve со входом Profile Curve нода Curve To Mesh.
Значение поля Radius установим равное 0.25. Изменяя значение этого поля можно динамически менять толщину пружины.
Для того чтобы управлять количеством витков пружины по ее длине, нам нужно всего лишь добавить коэффициент при просчете угла “a” в формуле смещения точек по окружности.
Добавим нод Math (shift + a – Utilities – Math), переключим его в режим умножения Multiply и вставим в ветку расчета формулы перед нодами “sin” и “cosine”. Значение Value у нода установим равное 2. Изменяя его мы можем динамически менять количество витков у нашей пружины на единицу длины.
Чем больше витков на единицу длины мы ставим, тем более “ломаная” пружина у нас получается. Это происходит из-за того, что для достижения гладкости ей не хватает точек.
Для достижения гладкости мы можем просто увеличить количество точек, на которые подразбиваем исходную прямую, увеличивая значение поля Count нода Resample Curve.
Или же, пока наша прямая имеет тип Curve, задать автоопределение касательной к ее точкам.
Для этого добавим в основную ветку дерева нод Set Spline Type (shift + a – Curve – Set Spline Type) и вставим его перед нодом Curve To Mesh. Переключим его в режим Bezier. Добавим нод Set Handle Type (shift + a – Curve – Set Handle Type), переключим его в режим Auto и вставим в основную ветку дерева после нода Set Spline Type.
Теперь мы можем задать большую плотность нашей пружине не увеличивая существенно количество точек в ее геометрии.
Для того чтобы динамически менять диаметр пружины нужно всего лишь добавить коэффициенты в нашу формулу расчета смещения точек по окружности по оси X и Y.
Добавим нод Math (shift + a – Utilities – Math), переключим его в режим умножения Multiply и вставим в ветку расчета смещения точек межу нодами Sin и Combine XYZ. Точно такой же нод добавим в ветку между нодами Cosine и Combine XYZ.
В обоих нодах установим значение Value равное 2. Меняя его можно динамически менять диаметр пружины.
Полное дерево нод:
круто! А как радиус самой пружины убавить?
Спасибо! В ноде Curve Circle поле радиус.
Данный урок представляет собой уже больше академический интерес т.к. в более поздних версиях Blender примитив “пружина” уже есть “из коробки”, проще использовать его.