Всем привет, в этой статье я покажу и объясню как сделать вращение по кругу объектов в blender, используя geometry nodes. Однажды в чате по блендеру увидел сообщение с просьбой человека помочь ему с анимацией кристаллов, мне эта тема с кристалами показалась интересной и я решил написать небольшую статью.
Результат будет примерно такой:
Вначале создадим ноды геометрии.
![](https://habrastorage.org/getpro/habr/upload_files/32f/e97/912/32fe97912c4dfa1a87598266b01aeab8.png)
Делать мы будем движение объектов по окружности, поэтому удаляем Geometry input и создаем Curve circle , именно мы ее будем крутить.
![](https://habrastorage.org/getpro/habr/upload_files/8ce/e27/df6/8cee27df6e4586a4010bed723e3d87a9.png)
Далее нам необходимо разместить объекты вдоль этой кривой, это делает нода Instance on points, сразу же после добавления ставим галочку на Pick Instance , размещать я буду коллекцию , поэтому добавляю Collection Info , ставлю Relative и ставлю обе галочки, Separate Children и Reset Children , подробнее об это можно почитать тут https://docs.blender.org/manual/ru/dev/modeling/geometry_nodes/input/scene/collection_info.html , далее соединяю ее со входом Instance в уже добавленной ноде Instance on Points, далее ставлю ноду Scale Instances (далее будет понятно , почему я не скейлю в instance on points), далее ставлю ноду Group Input, она нужна , чтобы выводить парамеры в удобном виде, как будто ноды это просто модификатор, вывести как параметр я хочу коллекцию и размер элементов.
![](https://habrastorage.org/getpro/habr/upload_files/194/269/bb3/194269bb3c8c1472d52f7261b0fc34bf.png)
Чтобы скейл был не вектором а одним значением , необходимо поменять значение vector на float.
![](https://habrastorage.org/getpro/habr/upload_files/a50/320/20e/a5032020ef89436b7740470025342d90.png)
Так же я хочу чтобы объектов было меньше , для этого я меняю resolution у кривой.
![](https://habrastorage.org/getpro/habr/upload_files/d02/48b/63d/d0248b63d09431a074cd00214ef6af09.png)
Все элементы идут последовательно , надо добавить ноду random value и переключить значение на Integer и подключить к Instance on Points на вход Instance Index, далее попробуйте по изменять параметры.
![](https://habrastorage.org/getpro/habr/upload_files/c94/513/057/c94513057b1f01802433299fd57c5819.png)
Далее уберем немного объектов , сделать это можно с помощью ноды random value, после добавления ноды необходимо поменять значение на Boolean и подключить ее к Instance on Points к входу Selection , далее попробуйте по изменять параметры .
![](https://habrastorage.org/getpro/habr/upload_files/373/e7b/307/373e7b3075da541e39754b5e293b7b28.png)
Далее сделаем рандомный размер у объектов , как вы уже ,наверное, догадались , делается это нодой Random value , изменяем минимальное и максимальное значение и подключаем Instance on Points к входу Scale.
![](https://habrastorage.org/getpro/habr/upload_files/76f/354/456/76f354456a813781a05a201f065a8d88.png)
Так же я хочу рандомный поворот объекта, делаю аналогично , добавляю Random value , изменяю минимальное и максимальное значение и подключаю к Instance on Points к входу Rotation.
![](https://habrastorage.org/getpro/habr/upload_files/7c6/dc9/d13/7c6dc9d132445c5adb51505f8844fa4b.png)
Также минимальное и максимальное значение можно вывести в параметры, также как я и раньше это делал.
![](https://habrastorage.org/getpro/habr/upload_files/770/c88/40b/770c8840be1e2931af27b89096d0e479.png)
Теперь надо сделать поворот объектов, делается это нодой Transform, можете уже покрутить объекты , если будете изменять Rotation, но нам надо сделать это автоматически
![](https://habrastorage.org/getpro/habr/upload_files/329/cf8/e95/329cf8e9569f32f393448313b97d9f09.png)
Далее необходимо добавить такую связку нод (у параметра Vector_speed переключить значение на Float), сейчас объясню как это работает
![](https://habrastorage.org/getpro/habr/upload_files/77b/c1a/b17/77bc1ab17638981f1369129bccff9de8.png)
Scene Time берет секунды и перемножает их (нода Vector math -> multiply) с вектором , из-за чего rotation каждую секунду увеличивается, чтобы это как то контролировать (да да , можно в vector_rotate ставить не 1, а любое другое число, но я так не хочу), делаем еще одну ноду Vector math и перемножаем получившийся вектор на какое то число, в результате получаем вращающиеся объекты, задача уже выполнена, но я хочу еще добавить чтобы объекты не совсем линейно двигались.
Делать я это буду с помощью ноды Noise Texture, добавляем ее и меняем 3d, на 4d, во вход присоединяем Seconds из ноды Scene Time, а так же делаем из Scale параметр и немного уменьшаем его , а то объекты будут просто трястись
![](https://habrastorage.org/getpro/habr/upload_files/824/b43/271/824b43271fe11babef041145e3fd2849.png)
Далее просто подсоединяем к Color ramp , с помощью нее можно дополнительно настроить движение объектов, потом получившиеся умножаем (Vector math) на позицию объекта, если это не сделать , то объекты просто съедут
![](https://habrastorage.org/getpro/habr/upload_files/e9d/eda/def/e9dedadef84287105321f76120d90446.png)
Далее создаем Set position и к offset подключаем Vector Math
![](https://habrastorage.org/getpro/habr/upload_files/03f/473/bf0/03f473bf0eaea57ad2cb236c32084a55.png)
В конце я хочу сделать radius у curve circle параметром
![](https://habrastorage.org/getpro/habr/upload_files/f87/73a/b7c/f8773ab7c4e682b9a49744cc5ac2f0e2.png)
Готово , теперь у нас вращающиеся объекты, с не линейной траекторией движения, которые можно настраивать. Если что то не поняли , то можно blend файл с нодами скачать по ссылке.