Делаем процедурный панельный дом в Blender

Всем привет!

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

Начнём

Т.к. мои познания в Blender находятся на низком уровне, то, для основы, использовал данный ролик. Для начала импортировал модели, которые делал давно в SketchUp:

Делаем процедурный панельный дом в Blender Blender, Процедурная генерация, Панельный дом, 3D моделирование, Длиннопост

Модели этажей

И на каждой модели необходимо точку Origin (оранжева точка) установить на одном и том же уровне и внизу, если ширина одинаковая, то можно воспользоваться одни углом на модели, я делал все по центру. Для этого заходим в редактирование (TAB), выбираем грани (клавиша 2) и выделяем как минимум 2 противоположные, после нажимаем сочетание Shift+S, и выбираем в низу Cursor to select:

Делаем процедурный панельный дом в Blender Blender, Процедурная генерация, Панельный дом, 3D моделирование, Длиннопост

Выделяем по низу моделей

Она устанавливает 3D курсор посередине, между двумя гранями, после выходим из редактирования (TAB) и нажимаем на модели ПКМ и выбираем Set Origin -> Origin to 3D Cursor:

Делаем процедурный панельный дом в Blender Blender, Процедурная генерация, Панельный дом, 3D моделирование, Длиннопост

Необходимо это делать по нижней части модели, т.к. Blender будет на неё ориентировать при процедурном построении этажей. Чтобы 3D Cursor встал на начало координат, т.к. на нём будут создаваться модели, необходимо нажать Shift+C.

Создаём простой куб (Shift+A -> Mesh -> Cube), после наведите курсор мыши на нижний левый угол, пока не появится перекрестие, зажимаем ЛКМ и подымаем его, после чего выбираем Geometry Node Editor и после нажимаем New:

Делаем процедурный панельный дом в Blender Blender, Процедурная генерация, Панельный дом, 3D моделирование, Длиннопост

После чего появляются 2 Нода:

Делаем процедурный панельный дом в Blender Blender, Процедурная генерация, Панельный дом, 3D моделирование, Длиннопост

Создаём Нод Math (Математический), с помощью Shift+A, в верху нажимаем на Search и вводим Math. В нём выбираем значение Subtract (вычитание), из Нода Group Input выбираем пустую ячейки и переносим связь от неё, к верхней пустой ячейки. После чего в Group Input ячейка приобретёт имя Value, но её можно задать и любое другое, для этого в правой части окна нажимаете на Group и там посредством двойного нажатия ЛКМ переименовываете:

Делаем процедурный панельный дом в Blender Blender, Процедурная генерация, Панельный дом, 3D моделирование, Длиннопост

Далее создаёте Нод Math, который можно сделать посредством копирования предыдущего Shift+D, и выбираем значение Multiply (умножение), даём ему нижнее значение, равное высоте модели, а верхнее соединяем с предыдущем Нодом. Т.к. последующие этажи будут по линии, а отсчёт начинается с 0, то при перемножении высоты моделей, точки уходят дальше и появляется разрыв между этажами:

Делаем процедурный панельный дом в Blender Blender, Процедурная генерация, Панельный дом, 3D моделирование, Длиннопост

После создаём Combine XYZ, соединяем с Z, далее Curve Line, соединяем с End, после Resample Curve, из предыдущего Нода соединяем ячейки Curve, из Group Input значения с этажами и Count.

Далее создаём/копируем Нод Math Subtract и соединяем верхнюю ячейку и Group Input с этажами. Далее создаём Нод Index и Compare со значениями Integer и Not Equal, соединяем Subtract с B, Index с A. Далее создаём Separate Geometry, Not Equal соединяем с Selection, а Resample Curve с Geometry.

Делаем процедурный панельный дом в Blender Blender, Процедурная генерация, Панельный дом, 3D моделирование, Длиннопост

После Instance on Points, и добавляем нашу модель, а именно крыши, посредством переноса объекта из меню Object на рабочий стол Geometry Nodes. Соединяем значение Geometry из модели с Instance в Instance on Points. От Separate Geometry значение Inverted соединяем с Point, Selected с другим созданным Separate Geometry.

Делаем процедурный панельный дом в Blender Blender, Процедурная генерация, Панельный дом, 3D моделирование, Длиннопост

От Separate Geometry от Inverted будет идти связь к Instance on Points с 1 этажом:

Делаем процедурный панельный дом в Blender Blender, Процедурная генерация, Панельный дом, 3D моделирование, Длиннопост

А от Selected к этажам. С той лишь разницей, что к ней уже будет идти связь от Compare, а к нему от Index. В общем далее так же, как на скриншоте:

Делаем процедурный панельный дом в Blender Blender, Процедурная генерация, Панельный дом, 3D моделирование, Длиннопост

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

Делаем процедурный панельный дом в Blender Blender, Процедурная генерация, Панельный дом, 3D моделирование, Длиннопост

И в конце создаём Нод Join Geometry и связываем с ним все Instance on Points.

В итоге вот что получилось, если обращать внимание на козырьки и высоту
балконов (по ним смотрел есть рандом или нет):

Делаем процедурный панельный дом в Blender Blender, Процедурная генерация, Панельный дом, 3D моделирование, Длиннопост

Итого

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