Виталий Черницкий
разработчик
из команды веб-карт
Миша Белошицкий
разработчик
из команды веб-карт
3D-карта
Продолжаем работать с объёмным изображением на карте. Теперь 3D стало совсем настоящим.
В январе мы научили карту отображать хилшейд , сделав её чуть более объёмной и красивой. Это начинание захотелось продолжить и научиться настоящей трёхмерности, то есть отображать не только светотень от гор, а полноценную 3D-модель местности.
Как выглядят другие 3D-карты и что надо нам
Перед началом работ над рельефом мы посмотрели на то, как это делает Mapbox.
Впоследствие похожее решение выпустил и Google.
Ребята проделали большую работу, в результате которой получилась впечатляющая картинка с заявкой на кинематографичность.

Оба решения использовали спутниковые снимки, натянутые на полигональную сетку. Такое решение нам не подходит — спутниковые снимки стоят недёшево и занимают много места на сервере. А хотелось решения, которое сохраняло бы привычный вид нашей карты, лишь привнося в неё новую фичу.
Работа с данными высот
Для рельефа нужны данные высот в карте. Мы воспользовались датасетом ALOS World 3D от Японского аэрокосмического агентства, которое выручало нас и в работе с хилшейдом. Данные оттуда мы скачали и нарезали на растровые тайлы.

Интересным оказался вопрос кодирования данных высот. Обычно для этого используется формат PNG, но наши исследования показали, что проще кодировать их простой бинарный формат, который будет неплохо сжиматься gzip-ом при передаче по сети. К тому же бинарный формат гораздо проще в распаковке чем PNG.
Каждый зум карты — это данные, которые надо скачать. Для нас это важно, чтобы 2ГИС работал быстро
Использовать данные высот для карты решили так: генерируем регулярную полигональную сетку и добавляем высоты в её вершинах.
Теперь осталось отрисовать нашу привычную карту в текстуру и затем наложить её на полигональную сетку. Получится то, что нужно.
Ну почти.
Опять хилшейд
Для правильного восприятия трёхмерных данных недостаточно просто отрисовать их в объёмном пространстве. Форма рельефа будет неразличима из-за отсутствия светотени, ведь во многом благодаря ей человеческий глаз определяет форму поверхности. Нужен хилшейд.

Векторный хилшейд на карте у нас уже был. Но нам хотелось избежать использования двух источников данных — высотных данных рельефа и тайлов векторного хилшейда. Имея под рукой высотные данные достаточно несложно отрисовать хилшейд из них при помощи шейдеров*.
* Шейдеры — программа для видеокарт, которая отрисовывает вершины, грани и поверхности, создавая иллюзию 3D-объекта
И он выглядит неплохо на среднем зуме, но вот на более близких и более далёких зумах сказывается низкое разрешение используемых высотных данных, и горы превращаются в пологие холмики.
Поэтому мы пришли к гибридному варианту: на малых зумах мы оставили векторный хилшейд, а в приближении оставили шейдерный.
Камера
Когда на карте появляется рельеф, работа камеры усложняется. Мы должны каким-то образом организовать её работу так, чтобы она позволяла комфортно перемещаться над рельефом, не залезать под горы и не проваливаться в текстуры.

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

В итоге мы стали добавлять к высоте камеры высоту под точкой, куда она смотрит. Это позволило реализовать плавные перемещения, при которых зум в центре не меняется.
Что дальше
3D-рельеф заложил хорошую основу для дальнейшего развития карты. В ближайших планах — добавить больше трёхмерных объектов на карту, сделать более реалистичным отображение канатных дорог, мостов и тоннелей. Чтобы любоваться картой было ещё приятнее, можно разблокировать максимальный угол наклона — это позволит смотреть вдаль. Ну, и под дорогами и сооружениями нужно выровнять основу — чтобы они смотрелись более естественно в сложном рельефе.

И ещё несколько скриншотов того, что теперь умеет наша 3D-карта.
Пока 3D-карта интегрируется в онлайн-версию 2ГИС, можно посмотреть на демо: выбирайте одну из пяти гористых локаций в левом верхнем углу и любуйтесь новым рельефом. Работает только в том случае, если читаете Доставили на десктопе.
Нажимая кнопку «Комментировать», вы принимаете условие Лицензионного соглашения и даёте ООО «ДубльГИС» согласие на обработку персональных данных на условиях и в целях, определённых « Политикой конфиденциальности ».