Гравитационная сфера на геонодах

Доброго времени суток. Ссылаясь на уже существующие 2 статьи про сферу Сигмы решил запилить оную(сферу, не статью) на геонодах в blender, ради интереса, так сказать.

Финальная версия с анимацией, выбор пал на самый лайтовый вариант.

Додекаэдр

Представим, что у нас нет возможности добавить правильный додекаэдр в сцену (я не смог) поэтому проще сделать его самому, для этого добавим объект cicrcle в центр мировых координат с 5 вертексами в составе.

Далее я подсмотрел на википедии, что угол между смежными гранями у додекаэдра равен 116,565 градусов, значит мне нужно будет повернуть копию пятиугольника именно на это число. Затем создавая дубликаты создаем конечную форму, прямо как нарисовать сову.

Пока что ничего сложного (да и потом тоже ничего)

Далее можно воспользоваться способом из статьи товарища i came here to chew bubblegum. Получаем единичный сегмент, который необходимо выровнять.

После чего можно эту штуку проверить на «ровность».

Дублируем произвольный сегмент и повернув его на 120 градусов видим, что они не совпадают, радиальная симметрия нарушена, будем править. 
Дублируем произвольный сегмент и повернув его на 120 градусов видим, что они не совпадают, радиальная симметрия нарушена, будем править. 

Оставляем эталонную часть из нижнего сегмента, добавляем mirror и создаем 3 копии по оси Z.

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

Сборка

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

Основа для спавна.
Основа для спавна.

Далее вешаем на него модификатор GeomatryNodes и создаем новую группу нод, в редакторе размещаем такие блоки:

Инстансы размещены, нода normal позволяет взять нормали вертексов и подать их на вход Rotation ноды Instance on points, через посредника в виде вспомогательной ноды Align Euler to Vector что-бы сориентировать вращение в направлении оси Z.
Инстансы размещены, нода normal позволяет взять нормали вертексов и подать их на вход Rotation ноды Instance on points, через посредника в виде вспомогательной ноды Align Euler to Vector что-бы сориентировать вращение в направлении оси Z.

Далее видим, что инстансы смотрят в нужном направлении, но угол их вращения рандомный:

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

Вот такая связочка вышла в итоге.
Вот такая связочка вышла в итоге.

Рассмотрим структуру объекта, видим, что он радиально симметричен, следовательно проще всего будет создать один сегмент и с помощью кругового массива сделать еще 4 его копии вдоль нужной оси.

С учетом того, что каждый из подсвеченных сегментов симметричен еще и вверх-вниз, то есть в плоскости xy, нам нужно будет сделать "руками" только верхнюю часть сегмента.

Размещаем инстансы на объекте как и раньше, нам понадобятся произвольные 2, я обвел самые подходящие, один из них ориентирован так как нам надо, а второй нуждается всего лишь в повороте на 180 по оси Z.

Гравитационная сфера на геонодах

Методом подбора выяснил, что нужные нам инстансы имеют ID — 12 и 13, значит нужно подать эти значения на вход selection ноды Instances on Points.

Гравитационная сфера на геонодах

Казалось бы — логичная структура, берем все индексы(ID) в объекте, они там могут быть какие угодно, не обязательно 0,1,2,3... и тд, поэтому лучше подать их на вход ноды Compare в режиме сравнения Equal достоверно найти в этой последовательности нужный нам номер, после чего объединить результаты сравнения нодой boolean math в режиме «And» и получить нужную нам структуру где выбраные нами номера индексов будут иметь значение 1, а все, что не попало в диапазон — 0.

Как-то так.
Как-то так.

Но, это не работает, почему я так и не выяснил, так-же я не выяснил почему случайно обнаруженный мною способ это починить работает — нужно пропустить это через двойное отрицание (если подскажите буду рад, только без оскорблений плиз, знаю, что тупой) .

Вот они, спасительные ноды с отрицанием.
Вот они, спасительные ноды с отрицанием.

Далее вращаем нижний инстанс на 180 градусов, но на вход Selection подаем уже новый номер, теперь этот инстанс не 13, а 1.

Можно и на 60 на самом-то деле, у нас же блок радиально симметричен.

Ну вот, основа готова, далее продуцируем копии, поможет нам в этом нода Duplicate Elements, собственно создает нужное количество копий и каждую снабжает уникальным индексом, это нам очень поможет.

Так как сокет Roataion принимает значения в градусах, а нода Value и поля ввода ноды Combine XYZ что такое градусы не знают, только радианы, нужно цифру из Value конвертнуть в градусы.
Так как сокет Roataion принимает значения в градусах, а нода Value и поля ввода ноды Combine XYZ что такое градусы не знают, только радианы, нужно цифру из Value конвертнуть в градусы.

Для начала создадим 4 копии и повернем каждую на 72 градуса по Z. Тут нам помогут уникальные номера дубликатов, они являют собой последовательный массив из цифр каждая из которых соответствует номеру копии. Берем номер копии и умножаем его на 72, таким образом копия 1 повернется на 72, копия 2 на 144 и т. д.

Верхняя половина готова, теперь продублировав уже ее создадим нижнюю часть, тут все просто, дубликат повернем на 180 градусов по оси X.

Далее немного подогнал им размер с помощью Scale Instances, привязал к ним материал и «освободил», нода Realize Instances конвертирует инстансы в геометрию с которой далее можно работать как с цельным объектом.

Ну и стек модификаторов, что бы сделать это все красивым

Красота!
Красота!

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

Гравитационная сфера на геонодах

Ядро сферы анимируется по такому-же принципу.

Материалы

Материалы не очень сложные, материал ядра старался сделать похожим на игровой.

Гравитационная сфера на геонодах
Материал ядра сферы.
Материал ядра сферы.

В основе обычный Mix RGB в котором смешиваю синий и черный, смешиваю по маске из LayerWeight откорректированным с помощью ColorRamp.

Гравитационная сфера на геонодах

Рябь на поверхности сделана путем добавления шума к текстурным координатам Layer Weight’а

Гравитационная сфера на геонодах

И таким образом получаем

Гравитационная сфера на геонодах

Шейдер выбрал Emission что бы исключить на сферу вляние других объектов, теней и прочего, добавил небольшой блик на поверхность с помошью ноды Glossy.

Вывод

Способ конечно максимально колхозный, буду рад если кто-то сделает тем способом которым у меня не получилось, а именно размещение инстансов на всех точках объекта и далее с помощью математического колдунства приведение их ориентации к нормальному виду.

И на последок статичный рендер

Статика
Статика

Все спасибо.

9797
20 комментариев

Оч хорошо получилось

8

Дед, папей таблетки

Ништяк, за то что расписал респект.
Геоноды пока что "боль для мой дырка задница", но все равно интересно

4

Что то из arcane

1

бля я думал тут будет фулл на геонодах, а тут половина работы вручную..

1

а тут половина работы вручную..Как и всегда в 3д моделировании и анимации :).

Ну не отрицаю, что это возможно, но пилить конкретно сегмент на нодах это из разряда эксперементов на какой нибудь nodevember, круто но толку в этом не много, так как в этом случае сделать сегмент руками куда проще и быстрее, тем более под конкретную задачу, заинстансить же его процедурно можно уже ради того что бы было проще его анимировать) для статики в целом ноды были бы не нужны)