Генерация 3d карты из OpenStreetMap data

Настраиваемый генератор 3D карты, модуль загрузки и управления картой

Задача проекта:
1. создание инструмента для генерации 3D карты с настраиваемым дизайном, высоким качеством картинки и оптимизированными моделями с последующей упаковкой карты в unity AssetBundle. Так же необходимо иметь возможность пересоздать отдельный участок карты;
2. создание модуля для загрузки карты из созданных AssetBundles для подключения в любом проекте. Модуль должен включать инструменты оптимизации вроде Frustum Culling и LOD систем;
3. генерация карты Москвы и части Московской области с помощью созданного инструмента.

Особенности проекта:
На текущий момент на рынке существует достаточно много решений по созданию 3D карт, такие как Mapbox или CityEngine, однако многие из них обладают существенными недостатками, например: модели слишком неоптимизированные и обладают высоким полигонажем; невозможно сгенерировать карту определенного региона, в частности Москвы; полученную карту невозможно кастомизировать под собственные нужды или вообще интегрировать в 3D движок (к примеру, Unity). Важным моментом является также то, что 3D карта — это большой объект, требующий больших графических ресурсов для рендеринга. Для снижения нагрузки необходимо иметь:
1. хорошо оптимизированные модели без лишних полигонов, для снижения нагрузки рендеринга и уменьшения необходимой оперативной памяти.
2. возможность объединять модели в единый меш, для уменьшения количества вызовов отрисовки.
3. возможность разбивать карту на отдельные составляющие части для подключения техник оптимизации вроде Frustum Culling и LOD.
Для корректной реализации всех этих требований, а также последующего улучшения созданной карты, подключения новых технологий (например, Houdini), был реализован этот проект.

Команда проекта
Dev: Игнатьев Вадим

Сроки: 3 месяца

OpenStreetMapUnity3D3d map VRFrustum CullingLODBlender osm LUAм

Что и как было сделано:

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

Для генерации 3D мешей картографических объектов использовался плагин blender-osm, данный плагин может генерировать из данных OpenStreetMap участок карты в 3D. Для автоматизации был реализован дополнительный плагин, который по заданным параметрам сетки с помощью blender-osm генерирует отдельные ячейки карты, после чего происходит экспорт созданной ячейки карты в fbx формат.

Полученные файлы обрабатываются специальным Unity проектом, в котором удаляются лишние объекты, создаются слои карты, производится обработка меша (например, объединение в единый меш группы однотипных объектов), применяется необходимый дизайн.

По окончанию обработки созданная карта упаковывается в AssetBundles, которые загружаются в конечное приложение с помощью отдельного модуля. Данный модуль создает сетку карты и заполняет ее необходимыми объектами из asset bundles, а также подключает Frustum Culling и LOD систему.