Процедуральный Рим не за день строился (часть 2)

Сижу вот в прачечной, жду, пока шмотки довертятся. Пока могу начать вторую часть. Ещё одна неделя работы над проектом подошла к концу. Неделя утомительная и душная, но необходимая. Основное достижение - отдельные куски из Гудини, создаваемые тремя людьми параллельно, наконец собраны воедино внутри Анрила.

Процедуральный Рим не за день строился (часть 2)
Процедуральный Рим не за день строился (часть 2)

Да, выглядит в лучшем случае как MIT проект из конца девяностых или начала двухтысячных. Но поменять плейсхолдер модельки, накинуть материалы и оформить декали (только что понял, что я без понятия, надо говорить декали или декалы на русском, вроде декали, декалы звучит как-то не так...) это не проблема. Даже кадров более чем достаточно несмотря на немалое количество уникальной геометрии с далеко не самой оптимизированной на данный момент топологией. Скажем спасибо наниту и инстансингу всего подряд. Можно ли оптимизировать лучше и сделать красивше? Да, естественно, мы тут всё же не быдло MITшное, мы тут все жё tech ARTISTы.

Процедуральный Рим не за день строился (часть 2)

Но это не в приоритете. Что в приоритете? Та часть, в которой на пути между Гудини и Анрилом с вероятностью 30% Анрил падает на пол, бьётся в припадке и умирает. Причём не мгновенно, а сперва заставив тебя подождать добрых 3-4 минуты. Если импорт прошёл успешно, то дальше полёт нормальный. Будь нашей целью сделать одну карту, на том бы и порешали. Но мы здесь говорим о симуляторе, в который в дальнейшем должны загружать новые карты по желанию. Вероятно на автомате скриптами. И в этом случае тридцатипроцентная вероятность полного абзаца становится большой проблемой.

Причем для пущего веселья логи при крашах разные. Все мы косимся на 16 гигов оперативки как главный источник проблем. К примеру, для генережки города по файлам Матрицы рекомендуется 64 гигабайта. Тут человек внимательный может заметить, что наш результат пока выглядит как говно на фоне Матрицы. Напоминаю вам о разнице в планировке и подходе. Мы вынуждены создавать намного больше уникальной геометрии из-за того что улицы Бельгии не имеют какого-то простого паттерна. Больше уникальной геометрии это большая нагрузка на оперативку.

Поверх этого докидываем слайсинг и пэкинг. Да, если ты вбрасываешь мега меш в Анрил и хуяришь поверх наниты, то так называемый калинг (простите за англицизмы, будет ещё большая каша, если я начну русифицировать всё это дерьмо) нихрена не работает. Ты смотришь на 1/60 земли, но компьютер также тратит ресурсы на оставшиеся 59/60, которые ты не видишь. В Гудини это решается нодом под названием pack. Подключил мега меш перед выводом в Анрил к этому ноду и всё чики-пуки, отдельные островки геометрии будут разделены для калинга. Одна беда... Есть некий необозначенный предел количества островов, который Анрил может переварить. Так что вставив нашу огромную плоскость земли и подключив её к pack, мы получаем очередной припадок и всё крашится. И тут в дело вступает слайсинг. Вместо того, чтобы применять pack ко всему мешу разом, мы нарезаем его на куски и пакуем эти куски по отдельности перед слиянием и выгрузкой в Анрил. Нарезали на 9 кусков и вот у вас уже не 100 островков, а только 9. Это если вы не превысили некое незримое предельное число полигонов, после которого пэкер сходит с ума и начинает вырезать куски из 9 островков и превращать их в отдельные островки, что с одной стороны да похуй как бы, калинг есть и ничего не крашится, а с другой - без понимания предела и причино-следственных связей мы можем упустить какие-то баги из этого вытекающие.

Вы наверное ща всё это прочитали и у многих застыл на губах вопрос: "Чево блять?". Вот также и мы эту неделю с этим бились. Я вообще в состоянии потока ходил вторник, среду и четверг, только и думая о бесконечной череде проблем и багов. Даже пришлось скрипт на питоне внутри Гудини написать для автоматического поиска файлов по паттерну названия.

Но давайте хоть немного не о проблемах, а о решениях. Например могу показать сетап системы вокруг нода building from patterns, которая генерит здания.

На входе мы имеем два инпута в лице уже распределенных по биомам "островов" тротуара и также аутлайны зданий из Open Street Maps.

Процедуральный Рим не за день строился (часть 2)
Процедуральный Рим не за день строился (часть 2)

Биомы со зданиями в нашем случае это красный и жёлтый. Вы можете заметить, что здания с карт находятся повсюду, в том числе в синих, фиолетовых и зелёных биомах, в которых их быть не должно. Почему это происходит? Потому что мы рандомизировали биомы не обращая внимание на данные карт, чтобы иметь больше вариативности с одного и того же клочка из OSM. Как решить? Ну, к примеру, мы можем:

1) Удалить все биомы кроме нужных.

Процедуральный Рим не за день строился (часть 2)

2) послать лучи из каждой точки зданий вниз и записать, какие из них ударились о землю, а какие нет. Если хотя бы одна точка оказывается стоящей на красном/жёлтом биоме, здание остаётся. Вы также можете заметить, что первоначально здания были полигонами, но теперь это просто точки. Нам пришлось удалить полигоны и сохранить точки, потому что иначе "гениальный" луч Гудини ударялся о полигон, из которого был отправлен. Это можно решить иначе, отправляя луч не прямо из точек, а чутка сместив его вниз. Но это Гудини, здесь всё можно сделать тридцатью разными способами и всё равно в итоге заплакать и пожалеть, что не пошёл на экономический, ибо таков путь истинного гудиниста.

Процедуральный Рим не за день строился (часть 2)
Процедуральный Рим не за день строился (часть 2)

3) Но постой, скажите вы, ты ведь удалил все полигоны, какой смысл был записывать результат удара лучей? Тут вступает в игру мой любимый нод, я его постоянно пытаюсь куда-нибудь впихнуть, attribute transfer. Берёте полигоны зданий до удаления, берёте точки после удаления но с данными о лучах, подключаете к ноду и каждая точка первого получает данные самой ближайшей к ней точки второго.

Процедуральный Рим не за день строился (часть 2)

3) Группируем полигоны, у которых есть хотя бы одна точка, чей луч ударился о землю.

Процедуральный Рим не за день строился (часть 2)

4) Время взрывать.

Удаляем к херам здания, которые не вошли в группу.

Процедуральный Рим не за день строился (часть 2)

5) Тут проделываем смешную штуку. Группируем смежные здания в блоки, чтобы задать среднюю высоту по блоку, свойственную европейской архитектуре. Булеаним здания с самими-собой, проверяем связанность (даёт нам аттрибут class, который говорит, к какому блоку относится каждый полигон), отправляем аттрибут зданиям до булеана, дабы их можно было комфортно вытягивать в дальнейшем.

Процедуральный Рим не за день строился (часть 2)
Процедуральный Рим не за день строился (часть 2)

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

Процедуральный Рим не за день строился (часть 2)

7) Треклятый for each. Местный способ делать лупы, который может очень сильно затормозить генерёжку. Но иногда лучше так, чем тратить часы на метод в обход.

Процедуральный Рим не за день строился (часть 2)

Здесь мы работаем над каждым блоком отдельно. создаём аттрибут высоты, рандомизируем его и используем нод osm_buildings для создания 3д блокаутов на основе имевшихся плоских полигонов + наша высота по блоку с некоторым +- рэнджем.

Процедуральный Рим не за день строился (часть 2)

Блокаут готов, теперь нужно подключить его к buildings from patterns. Но об этом уже в следующий раз.

Процедуральный Рим не за день строился (часть 2)

Также работаю над дипломной о генерации спрайт шитов в едином визуальном стиле с помощью stable diffusion стайл трансфера для ассетов. Хотел ещё попробовать сделать нерфы/сплаты по той же системе, но мне сказали сбавить обороты. Всё равно попробую, если время будет. Обещают дать доступ к рендерферме какой-то компании местной. Было б неплохо, а то я задушусь этим заниматься на gtx 3060 ноутбучной.

2323
8 комментариев

Комментарий недоступен

2

На калин мозг подвис. Всё думал о "кал", зная, что так правильно. Про глухую букву в конце вообще забыл. )

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

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

Я аутирование в гудини дропнул, через месяцев 8-12, т.к. просто не было сил терпеть того, как он работает и багует без остановки. Возможно, вина в ломаных версиях, но я пробовал многие и разные, всё равно появлялись какие-то баги. Причем, в зависимости от версии гудини - дрйавера на компе тоже надо менять/искать какую-то определенную версию, которая будет более менее нормально работать. Так ещё и от хардвейра зависит то, как гудини себя вёл - это ваще пиздец цирк какой-то.

Причем, если бы проблема была только в гудини... Ёбаные рендер движки - это просто пиздец(Считай кроме арнольда ничё и нет на шару, но арнольд - это... нет слов). Так я никогда в жизни ещё не ебался... Параметры №1 - все красиво и хорошо, перезагружаешь(шутка, он сам решает перезагрузиться/вылететь в 50% случаев) гудини - теперь рендер с настройками №1 - нихуя не так отображает всё, хотя де-факто ничего не изменилось, в итоге дрочишь все ползунки, и в какой-то момент понимаешь, что один ползунок просто перестал работать...
Ой... всё, я не хочу больше этого вспоминать. А если продолжить вспоминать, то эту хоррор-драму со 'странной хуетой происходящей в гудини' можно размером с дипломною работу написать.

А стоит он дохуя, как и рендер движки(причем нормальные движки ещё и спиздить нельзя или в них, буквально, нет каких-то функций определенных). Стади-лицензия - урезанная жёстко(Хотя, сейчас чекнул - она теперь полная, но нужен пруф студента и 75$ сверху).

Я даж не буду гудини защищать, софт реально злоебучий, как и майя какая-нибудь с рандомными вылетами. Я сёдня пытался векс код писать, ток в ручном режиме держать, в автоматическом обновлении стоит случайно слишком рано выйти из нода, неготовый код закрутится и с вероятностью 20% эта херобора упадёт. Даже у челов, которые город для Матрицы анриловской делали, проект стабилен только если твой компьютер размером с гараж. С драйверами проблем не было, но я опять же ток процедуральную геометрию делаю для анрила, эт всё же не симуляция из хреналиона точек.

Гудини да, это путь длинною в жизнь. Когда оно работает, а это процентов дай бог десять от общего времени, можно делать очень крутые штуки, очень глубокий софт. Остальные 90% времени ты пытаешься понять, почему нужно ставить именно четыре слеша в стринге в этом месте, чтобы векс работал, или почему какой-то атрибут всегда равен нулю. Я всё ж предпочитаю ноды обходить и писать кодом как можно больше, там хоть я обычно понимаю причино-следственную связь, чего не скажешь о ряде нодов.

Я в универе учусь, так что лицензия студенческая. Полный фарш, насколько знаю, да. Рашн едишн качал, когда узнал, что будет такая программа, работало, но, опять же, рендерить я в ней не пытался или симуляции делать, векторная матеша всякая и работа с облаками точек.

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

1

Я гуманитарий, мало что понял, но от такого чтива у меня встал😊

Уеч < юнити конечно, но пост отличный. Часть про погромированние не выкупил, в остальном ты конечно едрить заморочился)