Популярное
Свежее
Моя лента
Сообщения
Рейтинг
Пополнить Steam
Низкая комиссия
Темы
Игры
Офтоп
Гайды
Вопросы
Творчество
Ночной музпостинг
Кино и сериалы
Музыка
Инди
Скриншоты
Показать все
DTF
О проекте
Правила
Реклама
Приложения
Аккаунт удален
Gamedev
18.11.2023

Статья удалена

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

Статья удалена
Статья удалена

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

Статья удалена

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

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

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

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

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

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

Статья удалена
Статья удалена

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

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

Статья удалена

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

Статья удалена
Статья удалена

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

Статья удалена

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

Статья удалена

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

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

Статья удалена

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

Статья удалена
Статья удалена

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

Статья удалена

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

Статья удалена

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

Статья удалена

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

Статья удалена

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