Как расположить объекты на плоскости без пересечений в 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 1 голос
Article Rating
Подписаться
Уведомить о
guest

0 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии