При помощи Geometry Nodes в Blender мы можем быстро расположить множество мелких объектов вдоль границ одного большого меша и регулировать размер занимаемой или площади.
Добавим в сцену куб (shift + a – Mesh – Cube), назначим на него модификатор Geometry Nodes и инициализируем начальное дерево нод, нажатием на кнопку “New”.
Мы не будем использовать исходную геометрию куба заменим ее полностью нодами.
Добавим в нодовое дерево ноды с геометрией куба (shift + a – Mesh – Primitives – Cube) и плоскости (shift + a – Mesh – Primitives – Grid) и объединим их геометрию при помощи нода Join Geometry (shift + a – Geometry – Join Geometry).
Заполним плоскость точками по всей площади. Для этого добавим нод Distribute Points on Faces (shift + a – Point – Distribute Points on Faces), соединим его вход Mesh с выходом Mesh нода Grid, а выход Points подключили к ноду Join Geometry.
Увеличим количество точек, подняв значение поля Density до 100.
Расположить точки только вдоль граней куба, нам поможет нод Geometry Proximity. Он предназначен для нахождения минимального расстояния от геометрии меша.
Добавим этот нод (shift + a – Geometry – Sample – Geometry Proximity).
Исходная геометрия, от которой мы берем расстояние, это наш куб. Соединим выход Mesh нода Cube со входом Target нода Geometry Proximity.
В параметрах нода выберем режим Faces чтобы расстояние считалось от граней куба.
С выхода Distance мы будем получать значение расстояния от геометрии куба. Для того чтобы отсекать точки, разбросанные по плоскости, в зависимости от этого расстояния, соединим выход Distance со входом Selection нода Distribute Points on Faces.
Так как расстояние от граней куба мы будем считать для положения точек, добавим нод Position (shift + a – Geometry – Read – Position) и соединим его со входом Source Position нода Geometry Proximity.
Пока в расположении точек ничего не поменялось. Это потому что мы не задали границу, по которой мы будем отсекать лишние точки.
Добавим нод Math (shift + a – Utilities – Math) сразу после нода Geometrh Proximity. Переключим его в режим Less Than и попробуем поменять значение Value.
Как мы видим, часть точек отсеклась, однако отсечение сделано очень грубо. Так получилось потому, что отсечение по Selection в ноде Distribute Points on Faces производится по полигонам геометрии, на которой размещаются точки.
Увеличим разрешение плоскости Grid, увеличив значения в полях VerticesX и VerticesY нода Grid.
Регулируя количество точек параметром Density нода Distribute Points on Faces и границу их расположения параметром Value нода Math (Less Than) можно добиться требуемого качества заполнения.
Переключившись в режим Wireframe можно заметить, что поинты отсекаются не только с внешней стороны куба, но и с внутренней.
Для того чтобы превратить поинты в реальную геометрию, добавим нод Instance on Points (shift + a – Instances – Instance on Points) сразу после нода Distribute Points on Faces.
На его вход Instances можно подать любую геометрию, для простоты соединим этот вход с выходом Mesh нода Cube и уменьшим масштаб в поле Scale.
В результате мы получили куб, окруженный по периметру стайкой маленьких кубиков.