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

Доброго времени суток. Ссылаясь на уже существующие 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.

Вывод

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

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

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

Все спасибо.

3939 показов
1K1K открытий
22 репоста
20 комментариев

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

Ответить

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

Ответить

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

Ответить

Что то из arcane

Ответить

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

Ответить

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

Ответить

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

Ответить