Все начиналось с того, что я однажды родилс^Wрешил засунуть реальный город в GTA: San Andreas. Нормальное такое желание школьника. А собственно, почему бы и нет, ведь когда-то его выполнять надо?
Задача представлялась как нечто достаточно простое: надо просто натырить данных с OpenStreetsMap, присыпать спутниковыми снимками GoogleMaps, добавить фоточек (любых, хоть из ВТентакля) как источник текстур и в принципе все необходимые данные есть. Полигончики домов выдавливаем на нужное количество этажей, дороги рисуем вдоль домиков, все что между дорогой и домиком - газоны и клумбы. В принципе, все просто, можно заморочиться и написать процедурный генератор городов. В принципе, ничего сложного. К тому же это уже не однократно было сделано:
OSM-3D
https://wiki.openstreetmap.org/wiki/RU:OSM-3DOSM2World
https://wiki.openstreetmap.org/wiki/RU:OSM2World https://wiki.openstreetmap.org/wiki/OSM2World + https://osm2world.org/screens/f4map
https://demo.f4map.com/#lat=56.6336370&lon=47.9036327&zoom=20 (дождитесь фонтана)
Есть и другие авторы и изделия народного хозяйства на https://wiki.openstreetmap.org/wiki/Simple_3D_Buildings, как с большей, так и не меньшей степенью всратости, а то и степенью мертвости. OSM-3D
не вырос дальше интерфейса для автомобильных навигаторов 2007-го года, OSM2World
выглядит как игрушка под msdos, но умеет кушать гигабайты памяти, местами f4map
показывает что-то веселое, но это скорее благодаря багам реализации, а не полноте данных. Я же хочу город уровня GTA! Хотя бы GTA San Andreas, которая вышла в 2004 году! Мне что, самому создавать город?
Городов я раньше не создавал. Была попытка стать ландшафтным дизайнером, причем не одна, но складывать байты получалось лучше. А города - вообще какая-то закрытая тема, вроде бы никто не учит их создавать. Хотя бы в рамках игры. Потому решил начать с поиска существующих стандартов: к примеру, как часто расставлять фонари вдоль дорог? Нашелся ГОСТ 32947-2014
"Опоры стационарного электрического освещения"
, правда быстро выяснилось, что большинство ГОСТов в этой стране носят рекомендательный характер, так как дядя Вася поставит опору освещения там, где захочет, или где ему укажет прораб, и сделать генератор столбов на одних только правилах из ГОСТа не получится. Потом были найдены ГОСТ 33475-2015
, ГОСТ Р 51256-2018
, ГОСТ Р 58653-2019
и другие матерные слова.
Но вернемся к столбам освещения. Столбы освещения очень важны: это источники света для игровой сцены (прелайта в случае San Andreas), это то, что указывает на наличие дороги с большого расстояния, это тот самый высокочастотный городской шум, так приятный глазу, к тому же в них весело врезаться, когда катаешься по городу. Какие у нас есть данные и какие данные нам могут понадобиться? В вики проекта OSM есть следующие статьи:
- https://wiki.openstreetmap.org/wiki/Tag:highway%3Dstreet_lamp - статья о самих фонарях
- https://wiki.openstreetmap.org/wiki/Key:lamp_mount - частный случай, статья о столбах и прочих подвесах
Отсюда мы можем, если нам сильно повезет, вытащить информацию не только о столбе, но даже о его моделе и изготовителе! Причем можно узнать модель как самого абажура, так и самой лампочки, все это есть в OSM! Хватит ли мне этих данных? Конечно же нет! Так как я собрался расставлять фонари вдоль дорог, то мне нужны какие-то взаимосвязи именно с дорогами, чтобы полу-автоматически расставить фонари. А этих связей не только нет, но они и запрещены, разрешены только точечные данные, без привязки к чему-либо.
Далее, у меня в городе стоят красивые железобетонные столбы, с круглым сечением, на них есть крепежи для всяких камер и флагштоков, а на самой вершине - фонарь, явно поставленный туда штатно. Ближе к сельской местности же можно заметить, как фонари прикручены проволкой к 2 железобетонным ногам, которые обычно используют электрики, а то и вообще к деревянной опоре. Есть ли эти данные в OSM? В принципе да, есть lamp_mount, но почти всегда это будет lamp_mount=bent_mast
или lamp_mount=straight_mast
. Мне опять нехватает данных. тык - тут вообще можно найти все виды столбов
Подумав, решил идти 2 возможными путями:
-
Взять данные из OSM как некие legacy-наметки, поверх которых строить свой собственный нескучный мирок. К примеру, берем дорогу из OSM, используем ее только как референс, как некую сущность, которая существует только в редакторе, но которая нигде не видна и никак не рендерится. И уже опираясь на эту сущность начинаем богато набрасывать с лопаты свои нескучные слои и даже полигоны: типы столбов, фонарей, ширина обочины, есть на дороге поребрики или заборчики, наличие деревьев, люков и даже тротуаров. Есть заборчик вдоль тротуара? Задать его как отношение к невидимой абстрактной дороге, прописав начало-конец-смещение относительно референсной дороги. Для осуществления этой деятельности мне не помешали бы государственные гранты и пару-тройку научных или псевдонаучных институтов в подчинение. И главное, не привлекать внимание санитаров.
-
Взять саму игру (GTA San Andreas), за последние 20 лет игра отревершена вдоль и поперек, все внутренние форматы документированы и для них написаны всевозможные тулы. Из самой игры или из ее ресурсов вытащить данные или сымитировать процессы, которые можно сделать в реальной жизни. К примеру, в реальной жизни мы можем снять панораму местности (как это делает Google StreetView), такую же панораму можно снять и в игре, я как раз являюсь автором https://github.com/LudmilaPetrovna/panorama-gtasa/ (работоспособность сейчас не гарантирована). Добавить к таким панорамам снимки с виртуального же спутника, нарисовать виртуальные генпланы и другие средства, которые есть в реальности. И потом начать мапить, т.е. «оцифровывать» виртуальный игровой город так, словно он реальный. Затем, попытаться то, что мы намапили, отрендерить в 3D, чтобы это было максимально аутентично. Желательно так, чтобы это было пиксель-в-пиксель идентично. Так как у нас изначально игровые данные, то нам не нужны дорогие лидары, сверхточные дальномеры и фотоаппараты за миллионы даляров, все данные у нас уже есть, причем с точностью «до миллиметра». Все кирпичи, деревца и грязь на дорогах у нас уже стандартные. Остается все это дело классифицировать и сделать нескучный язык разметки, в который потом размечать реальный город с такой же точностью. По идее, тут бы помогли эти ваши нейросети, но нынче для запуска хелловорлда нужно иметь пару датацентров, а у меня их нет. Вроде бы этот способ более безопасен и интересен, но санитары тоже могут материализоваться.
Так вот, Лор. Что мне делать?