Заполним кривую необходимым количеством объектов так, чтобы они занимали всю длину кривой без промежутков, при необходимости корректируя свой размер.
Откроем новый проект. Добавим кривую (shift + a – Curve – Bezier). Назначим ей модификатор Geometry Nodes и инициализируем начальное дерево нод.
Заполним кривую, например, сферами.
Добавим в главную ветку нодового дерева нод Instance On Points (shift + a – Instance – Instance On Points) – этот нод отвечает за размещение меша в каждой точке кривой.
Добавим нод UV Sphere (shift + a – Mesh Primitives – UV Sphere) и соединим его выход Mesh со входом Instance нода Instance On Points. Таким образом в каждую точку кривой мы поместили меш UV Sphere.
Сейчас кривая состоит всего из двух точек. Увеличим количество точек на кривой при помощи нода Resample Curve (shift + a – Curve – Resample Curve), добавив его в самое начало главной ветки нодового дерева.
Теперь в нашей кривой 10 точек и в каждой из них располагается сфера.
Сделаем так, чтобы масштаб сферы самостоятельно подстраивался под количество точек так, чтобы сферы не пересекались.
Для того чтобы получить коэффициент масштабирования для сфер, нужно длину кривой разделить на количество ее точек. Так мы получим расстояние между двумя точками на кривой.
Выведем указание количества точек на кривой в отдельный нод. Добавим нод Integer (shift + a – Input – Integer), установим для него значение равное 10 и соединим его выход Integer со входом Count нода Resample Curve.
Длин кривой мы можем получить при помощи нода Curve Length (shift + a – Curve – Curve Length). Добавим его в нодовое дерево. Соединим его вход Curve с выходом Geometry нода Geometry Output. С его выхода Length мы теперь можем брать значение длины нашей кривой.
Добавим нод Math (shift + a – Utilities – Math) и переключим его в режим деления Divide. Соединим его верхний вход Value с выходом Length нода Curve Length а нижний – с выходом Integer нода Integer. Таким образом мы делим кривую на количество точек.
Выход Value нода Math соединим со входом Scale нода Instance On Points задавая таким образом зависимость размера сфер на кривой от количества точек на этой кривой.
Как мы видим, сферы уменьшились, но явно недостаточно.
Так как размер сферы задается радиусом, а при заполнении кривой используется полная сфера, то есть ее диаметр, коэффициент масштабирования, который мы получили нужно уменьшить еще в два раза.
Добавим еще один нод Math (shift + a – Utilities – Math) в режиме Divide. Вставим его между уже имеющимся нодом Divide и нодом Instance On Points. Значение нижнего входа Value, оставшегося свободным, поставим равным 2.
Теперь сферы масштабируются правильно заполняя всю кривую. Изменяя значение в ноде Integer можно легко управлять количеством сфер.
Однако при небольшом количестве сфер становятся заметны промежутки. Артефакт появляется из-за того, что мы заполняли кривую ориентируясь на количество точек на ней, а в действительности нужно заполнять промежутки между точками, так как для двух крайних точек, размещенные на них сферы будут наполовину вылезать за кривую.
Количество промежутков между точками всегда на единицу меньше количества точек. Поэтому для достижения финальной точности нам нужно просто отнять 1 от количества точек при расчете коэффициента масштаба для сфер.
Добавим еще один нод Math (shift + a – Utilities – Math) и переключим его в режим вычитания Subtract. Разместим его между нодом Integer и первым нодом Divide.
Значение оставшегося свободным нижнего входа Value установим равным 1.
Теперь сферы масштабируются точно по длине кривой.
Надо отметить, что для замкнутых кривых последнего действия не требуется. Так происходит потому, что в замкнутой кривой последняя точка всегда совпадает с первой.
Для замкнутых кривых нод вычитания единицы можно “замьютить” – исключить из расчета, выделив его и нажав клавишу “m”.