Gamedev Роман Шувалов
6 518

Как я делал игру на основе карты реального мира

Ковырял я, значит, OpenStreetMap, чтобы отрендерить велосипедную карту с лесными тропинками. И параллельно практиковался в игрострое. И в какой-то момент щёлкнуло: «А что, если...». Собственно, результат на картинке.

В закладки
RTX off, RTX on (на самом деле это всего лишь мой рендерер)

Конечно, картинка далека от идеала, но во многих населённых пунктах места довольно узнаваемы. После сборки самой первой версии без текстур и декораций я долго просто летал по городу и разглядывал местность. Поэтому, когда меня спрашивают «чем это отличается от Google Street View», я всегда теряюсь, что же ответить.

Поведаю небольшую историю о создании игры.

Планета OSM

Первый вопрос, который встал — как обрабатывать исходные данные. Исходник планеты OpenStreetMap весит порядка 50 гигабайт, и всю планету надо было разбить на тайлы. А потом конвертировать каждый тайл в удобный мне формат.

Эксперименты с postgis-базой не привели ни к чему хорошему: работало, но крайне медленно и как-то неуклюже. В какой-то момент я понял, что база данных мне вообще не нужна: при обработке фрагмента территории мне никогда не потребуется обращаться к данным из другой территории.

Так что, обзаведясь ёмким SSD, я начал нарезку планеты двумя программами из пакета osmctools: osmconvert и osmfilter. Для расчёта координат конкретных тайлов пришлось написать маленькую вспомогательную утилитку (их потом было написано ещё немало).

Визуализация тайлов в Geofabrik's Tile Calculator

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

Поэтому я воспользовался gdal только для «умного чтения» исходника OSM и преобразования геометрии в легко читаемый формат WKT, а сохранялку в нужный мне формат с сохранением формы зданий написал самостоятельно с использованием библиотеки libgeos.

Следующая задача — упаковка тайлов. Их общее число равно 4^Z, где Z — масштаб. В моём случае четырнадцатый, итого 4^14 = 268 миллионов тайлов. Тот факт, что большинство тайлов попадёт на океан или на пустые территории, не сильно скрашивает картину. Казалось бы, взять и упаковать, на лету сжав каким-нибудь gzip-ом, в чём проблема-то? А проблема в том, что тайлы будут подгружаться по сети. И тащить из сети 100-мегабайтный архив ради парочки тайлов не самое оптимальное решение.

А решение было найдено следующее: тайлы упаковываются в зигзагообразном порядке, клиенты будут загружать их через HTTP Range в нужном им масштабе и количестве. Просто и эффективно.

Рельеф

OSM не хранит данные о рельефе, за ним пришлось обращаться к сервису Viewfinderpanoramas, автор которого удобно скомпоновал карту высот ASTER GDEM и SRTM. Нарезка на тайлы производилась аналогично геоданным, для перепроецирования растровых изображений использовалась утилита gdalwarp. Тайлы в 11-м масштабе имеют размер 256х256, с учётом ребра соседнего тайла 257х257, а для вычисления бесшовных нормалей добавлен еще один ряд и столбец по периметру, итого 259х259. Негусто, но в целом достаточно.

Генерирование геометрии

Тут ничего особенного, сплошная рутина. Из интересностей — угадывание высоты здания по площади основания (если высота здания не указана явно). Проект ещё в разработке, детализация будет повышаться по мере доработки новых слоев.

Скриншот снят где-то в Самаре
А этот — в Праге

А где игра-то?

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

Музончик

Не упущу возможность похвалиться первой (ладно, не первой, но первой, за которую не стыдно) пробой в музыкальном оформлении. Трек для трейлера записан в Linux MultiMedia Studio с использованием встроенных инструментов и свободных банков SF2.

Трейлер с авторской музыкой

Что дальше?

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

Ну а кто хочет полетать в своем городе уже сейчас, ранний доступ Steam к вашим услугам. Загрузить можно практически любую точку планеты, кроме Северного полюса и Антарктиды.

Такие дела. Спасибо за внимание.

#опыт

Материал дополнен редакцией

Материал опубликован пользователем. Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

Написать
{ "author_name": "Роман Шувалов", "author_type": "self", "tags": ["\u043e\u043f\u044b\u0442"], "comments": 50, "likes": 107, "favorites": 77, "is_advertisement": false, "subsite_label": "gamedev", "id": 30052, "is_wide": false, "is_ugc": true, "date": "Thu, 25 Oct 2018 18:26:03 +0300" }
{ "id": 30052, "author_id": 27072, "diff_limit": 1000, "urls": {"diff":"\/comments\/30052\/get","add":"\/comments\/30052\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/30052"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 64954 }

50 комментариев 50 комм.

Популярные

По порядку

Написать комментарий...
104

такс такс
в этой компутерной игре можно воссоздать школу
по скользкой дорожке идете!

Ответить
1

Сделать школу уровнем для контры/кваки было норм ещё когда я в школе учился.

Ответить
29

Мир хрущевок - охрененно.

Ответить
6

Хрущворлд

Ответить
7

Скриншот снят где-то в Самаре.

Эх, узнаю Самару

Ответить
1

Ну нифига ж себе, два почти одинаковых проекта выпущены почти одновременно. Хотя идея не такая уж неповторимая, я был крайне удивлен, когда узнал, что на момент начала разработки не было почти ничего подобного (были импортёры в Блендеры и всякие Юнити, но это для единичных городов).

Ответить
3

Я думал это апдейт того другого проекта лол.
Вообще какая-то гранд стратегия с геймплеем на уровне настолок уже была бы охуенной на такой карте.

Ответить
0

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

Ответить
1

Три. Давно вышел Megaton Rainfall.

Ответить
0

Во, всё пытался вспомнить название этой игрушки после просмотра ролика из статьи. Автор явно в нее гамал)

Ответить
0

Ну, там вроде ненастоящие города (только похожие стилистически на настоящие).

Ответить
1

Там еще ссылку на очень хороший, но мёртвый проект дали: http://www.outerra.com/

Домов там нет, к сожалению, но по родной местности полетать прикольно

Ответить
3

О! У Дуката как раз обзор смотрел.)

Ответить
3

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

Ответить
2

Музон неплох, а игру с такими домами надо было делать про зомбарей и назвать, скажем, Z-StreetS. Представьте, толпы зомби в адской демонстрации с шариками и портретами Брежнева. Красота! :D

Ответить
1

Спасибо, купил.

Ответить
1

Последовал вашему примеру.

Ответить
1

Генерирование геометрии

Тут ничего особенного, сплошная рутина

Я бы лучше про это почитал, чем про ковыряния в данных. Автор, запили разбор.

Ответить
0

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

Ответить
0

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

Ответить
3

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

Ответить
–6

Не удивлюсь если тебя через пару лет попытаются закрыть с словами "в етой калипуторной игре можна летат над школай и тама брасат гранаты в учиников !"11 запретитьказнитьсрочнаебать!Ёё1!"3!!" или что-то типа того :)

Ответить
0

а 3D здания делали сами или откуда-то их надергали?

Ответить
0

А вобще есть где то карты с крупными городами? Что бы их можно было потом в играх и пользовать? Может быть уже есть готовые. Пусть за деньги. Я находил для юнити, но это абстрактные сити. А мне интересны реальные города мира

Ответить
0

Ну так я это и показываю. Для использования в других играх будет либо экспортер в открытые форматы, либо просто ссылка на исходники (когда они будут публикованы).

Ответить
0

Респект! Ждем развития идеи

Ответить
0

Класс! Автору респект!

Ответить
0

Хотелось бы походить по своему городу жаль что никто не сделает=(

Ответить
0

А вы из какого города?

Ответить
0

Курган, Курганская область

Ответить
0

Купил игру если добавишь что можно будет походить по городу как в гта это будет 10/12

Ответить
0

Идея неплохая, но вот геймплей там уж настолько не нужен.

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

Ответить
0

Роман, идея очень хорошая! Маленькое пожелание: было бы круто, чтобы здания генерировались в аутентичном архитектурном стиле и по городам можно было бы просто гулять. Это же будет идеальная игра для тех, кто любит путешествовать и хотел бы посмотреть на мир, но не может делать это часто

Ответить
0

Купил, полетал в фрироаме по всем родным местам, всё выглядит 1-в-1 как в жизни, 10/10

Ответить
0

Вы совершили фатальную ошибку, некорректно отобразив деревню КоренногоАмериканца. Он там целое видео записал про накрученные русскими лайки и устроил разгром геймплея (собственно, заслуженно).
Как так можно вообще, в игре за 99 рублей нет точности гуглмэпс?! Я тоже негодую!
Где мой родной Косой Брод?! :D

Ответить
0

Два слова: поддержка ВР.

Ответить
0

Камера далековата от земли, а приблизить намеренно не даю: детализации не хватает.

Ответить
0

Можно сделать как в сайлент хилле - они запилили туман, чтобы плохие текстуры не было видно...
Правда превращать весь мир в сайлент хилл, так себе идея, конечно.

Ответить
0

Блин, братишка, это чума. Заношу бабки. Но я хочу походить по своим улицам и т.д.

Ответить
0

Когда нибудь примерно такими и будут онлайн карты типа яндекс и гугл.

Ответить
0

У гугла в крупных городах (в основном за рубежом) и сейчас есть, но на основе спутниковых снимков и, так сказать, с оригинальной геометрией.

Ответить
0

На glosm смотрели? Это менее масштабный проект, не игра, а только 3D-рендерер для данных OSM. Но сходство есть.

Ответить
0

Не помню, но наверняка смотрел, когда перед началом разработки изучал существующие проекты на эту тему. В любом случае там исходникам 7 лет и много устаревшего OpenGL-функционала.

Ответить
0

Роман, привет!
Очень круто всё сделано! А когда ты планируешь выложить исходники? Или можно как-то уже сейчас договориться и использовать твои нароботки? Хочется сделать, чтобы можно было ездить на автомобиле по городам.

Ответить
–1

Карту на скриншот Doom не забыл наложить?

Ответить
0

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjog" } } }, { "id": 10, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-250597-0", "render_to": "inpage_VI-250597-0-1134314964", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=clmf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudo", "p2": "ftjf" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvc" } } } ]
Гейб Ньюэлл наконец-то анонсировал то,
чего все так долго ждали
Подписаться на push-уведомления