Как расположить объекты на плоскости без пересечений в Blender при помощи Geometry Nodes

Для того чтобы заполнить объектами плоскость в Blender Geometry Nodes обычно используется нод Distrubute Points on Faces, который выдает набор точек, случайным образом раскиданных по поверхности полигонов меша, после чего в этих точках располагаются нужные объекты. В простейшем случае эти точки располагаются случайно и объекты, привязанные к ним, могут пересекаться друг с другом, если точки окажутся близко друг от друга. Однако при небольшой доработке можно настроить ноды так, что привязанные к точкам меши пересекаться не будут.

Добавим в сцену плоскость (shift+a – Mesh – Plane). Добавим для плоскости модификатор Geometry Nodes и нажатием на кнопку New создадим новое нодовое дерево.

Добавим в нодовое дерево нод Distribute Points on Faces (shift+a – Points – Distribute Points on Faces) чтобы получить распределение точек на плоскости.

Добавим нод Instance on Points (shift+a  – Instance – Instance on Points) для привязки объектов к полученным точкам.

Добавим нод UV Sphere (shift+a – Mesh Primitives – UV Sphere) и соединим его выход Mesh со входом Instance нода Instance on Points. В поле радиуса в ноде UV Sphere укажем значение равное 0.2.

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

Для решения проблемы пересечения объектов в ноде Distribute Points on Faces есть отдельный режим Poisson Disk. При его включении точки на поверхности располагаются все равно случайным образом, но так, чтобы расстояние между двумя соседними точками никогда не было меньше значения, указанного в поле Distance Min.

Переключим нод Distribute Points on Faces в режим Poisson Disk.

Для нашего примера, минимальное расстояние между сферами, чтобы они не пересекались между собой, будет равно радиусу сферы, умноженному на 2. Так как мы указали радиус сферы равным 0.2, укажем в поле Distance Min нода Distribute Points on Faces значение 0.4.

В результате все пересечения устранены.

Для объектов сложнее сферы, минимальное расстояние без пересечений можно получить, например, при помощи нода Bounding Box или, чуть более точно, при помощи нода сбора статистики Attribute Statistic.

Добавим нод Attribute Statistic (shift+a – Attribute – Attribute Statistic) в нодовое дерево. Соединим его вход Geometry с выходом Geometry нода UV Sphere так как именно для геометрии сферы мы будем определять нужное расстояние.

У нода Attribute Statistic есть выход Range, который возвращает наибольшее расстояние между точками меша – как раз то, что нам нужно.

Переключим нод в режим работы Vector – Point, чтобы получать значения с атрибута “точка” векторного типа.

Добавим нод Position (shift+a – Input – Position) и соединим его выход Position со входом Attribute нода Attribute Statistic, чтобы собирать статистику по вершинам меша.

Вектор, получаемый с выхода Range, трехмерный, а для контроля расстояния между объектами на плоскости нам нужна только его проекция на плоскость XY. Добавим в дерево ноды Separate XYZ (shift+a – Vector – Separate XYZ) и Combine XYZ (shift + a – Vector – Combine XYZ) и соединим их входы выходы для осей X и Y, оставив ось Z несоединенной. Соединим со входом Vector нода Separate XYZ выход Range нода Attribute Statistic. Таким образом мы получим проекцию вектора Range на плоскость XY.

Для определения расстояния между объектами нам теперь просто нужно взять длину этой проекции. Добавим нод Vector Math (shift + a – Vector – Math) и переключим его в режим Length. Соединим выход Vector нода Combine XYZ со входом Vector нода Vector Math.

Полученное на выходе нода Vector Math значение – максимальный размер объекта в проекции на плоскость, подадим на вход поля Distance Min нода Distribute Points on Faces.

Теперь данную связку нод можно использовать с любыми объектами более сложной формы, чем сфера, без возникновения пересечений.

5 2 голоса
Article Rating
Подписаться
Уведомить о
guest

11 Комментарий
Новые
Старые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Alexander
Alexander
1 год назад

А как избавиться от пересечений если у меня коллекция в которой различные объекты, широкие и не широкие к примеру? Как сделать что бы он считал расстояние каждого объекта?

Костян
Костян
1 год назад

Вопрос, а как расположить объекты на плоскости без пересечения и не рандомно, а как решетка или масив на одинаковом растоянии, без привязки к сетке плоскости? Есть основа в виде плоскости, с неравномерной сеткой, и на ее поверхности нужно расположить кубики в вде решетки, друг за другом по иксу и игрику в очереди. И я не могу додумать как все провернуть.

Костян
Костян
1 год назад
Ответить на  Nikita

FА каким образом этот масив можно разместить на плоскости?

Костян
Костян
1 год назад
Ответить на  Nikita

У меня есть объект ( плейн) с неравномерной сеткой на которую я хочу наложить эффект воксель. Но получается вариант где прямоугольники ложатся относительно плотности сетки, а не друг около друга. Что бы они не наезжали на себя, твой туториал мне помог, но вот выстроить их по плейну или по форме лица в ровной сетке не получается.

Костян
Костян
1 год назад
Ответить на  Nikita

Буду робовать, спасибо!

Илья
Илья
1 год назад

А как при этом сделать, что бы предметы не выступали за пределы плоскости на которой они спавнятся? У меня версия 3.6 и там предметы торчат за плоскость некоторые, если расположены на краю