Распределение инстансов объектов по поверхности меша в Blender легко реализовывается при помощи Geometry Nodes. В простейшей настройке такого нодового дерева при изменении масштаба объекта, размеры расположенных на его поверхности инстансов тоже пропорционально изменяются. Однако можно собрать ноды и так, что при изменении размеров базового меша размеры инстансов на нем останутся неизменными, а будет меняться их количество.
Соберем для начала базовое дерево нод для распределения инстансов одного меша (Suzanne) по поверхности другого меша (Plane).
Добавим в сцену Сюзанну (shift + a – Mesh – Monkey). Уменьшим ее нажав сочетание клавиш s – .2 – Enter и применим масштаб, нажав ctrl + a – Scale. Скроем ее, нажав клавишу “h”.
Добавим в сцену плоскость (shift + a – Mesh – Plane). Назначим ей модификатор Geometry Nodes и инициализируем базовое дерево нод.
Для начала создадим простейшую связку нод для распределения инстансов Сюзанны по поверхности плоскости.
Добавим в главную ветку нод Distribute Points on Faces (shift + a – Point – Distribute Points on Faces) и нод Instances on Points (shift + a – Instances – Instances on Points).
Добавим нод Object Info (shift + a – Input – Object Info). В его поле Object выберем Suzanne и соединим его выход Geometry со входом Instance нода Instance on Points.
Для нода Distribute Points on Faces выберем режим Poisson Disk и установим значение поля Distance Min равное 0.5, чтобы распределённые меши не пересекались между собой.
Вместо плоскости мы получили распределенные по ней меши Сюзанны.
Если теперь попробовать масштабировать плоскость, нажав клавишу “s” и двигая мышку, меши Сюзанны так же будут масштабироваться.
Для того чтобы при масштабировании плоскости сохранять исходный размер мешей Сюзанны проще всего перед нодом Distribute Points on Faces добавить нод Transform (shift + a – Geometry – Transform) и масштабировать плоскость не через нажатие клавиш “s” во вьюпорте, а изменяя значения в поле Scale этого нода.
Таким образом мы сразу получили требуемое поведение – масштабируется только плоскость, а инстансы, оставаясь постоянного размера, заполняют всю ее площадь.
Однако залезать каждый раз в дерево нод для изменения масштаба не очень удобно. Масштабирование плоскости во вьюпорте можно связать с изменением ее масштаба через Geometry Nodes.
Для того чтобы получить коэффициент масштаба из вьюпорта, добавим в дерево еще один нод Object Info (shift + a – Input – Object Info). Однако в его поле Object укажем саму нашу плоскость Plane. Теперь с выхода Scale этого нода мы можем получить текущий масштаб плоскости во вьюпорте. Соединим выход Scale нода Object Info со входом Scale нода Transform.
Таким образом мы масштабируем плоскость через Geometry Nodes, но коэффициент масштаба берем с плоскости во вьюпорте.
Если теперь мы попробуем масштабировать плоскость во вьюпорте нажатием клавиши “s”, мы увидим практически то поведение, которое нам нужно, однако меши Сюзанны все-таки тоже будут изменяться в размерах. Также можно заметить, что коэффициент масштабирования увеличен – при небольшом движении мышки плоскость масштабируется сильнее чем раньше.
Это происходит потому, что мы наложили друг на друга и теперь одновременно используем два способа масштабирования – объектный во вьюпорте и через Geometry Nodes. Для того чтобы решить эту проблему, нужно скомпенсировать двойное масштабирование.
Добавим еще один нод Transform (shift + a – Geometry – Transform) в главную ветку дерева после нода Instance on Points. Для того чтобы скомпенсировать двойное масштабирование, нам нужно задать через этот нод обратный масштаб – умножить его на единицу, деленную на коэффициент масштабирования.
Добавим нод Vector Math (shift + a – Vector – Vector Math) и переключим его в режим деления Divide. Все значения в верхнем поле Value установим равные 1.0. Соединим выход Scale нода Object Info для плоскости Plane с нижним полем Value нода Vector Math (Divide). Таким образом мы получаем значение обратного масштаба.
Выход Value этого нода соединим со входом Scale второго нода Transform. Таким образом мы умножаем масштаб на обратный коэффициент, компенсируя двойное масштабирование.
Теперь масштабируя плоскость во вьюпорте мы получаем полностью рабочее поведение – размер инстансов не меняется, и инстансы заполняют всю изменяющуюся площадь плоскости.