Последние года два я занимался визуализацией данных на базе виртуального глобуса. Все наработки воплощались в жизнь в виде приложения под кодовым названием «Виртуальная Земля», которое дальше использовалось в разных проектах: виртуальная модель Долины гейзеров, прототип тренажера для сотрудников Ленинградской АЭС, виртуальное Протвино, визуализация полёта корабля Восток, визуализация сейсмических данных.

Исторически сложилось, что за основу приложения был взят фреймворк AVANGO NG, который является надстройкой над графическим инструментарием OpenSceneGraph. Для создания самого виртуального глобуса использовался VirtualPlanetBuilder, а позже – osgEarth.

Я по возможности использовал встроенные возможности OSG, osgEarth, Avango и интегрировал их между собой. Дополнительно было добавлено следующее:

  • Визуализация данных из KML-файлов
    • Метки, линии, контуры и их описания
    • 3д-модели
    • Фотопанорамы (PhotoOverlay)
    • Наложения (ScreenOverlay и GroundOverlay)
    • Путешествия (Tour)
    • Меню для включения/выключения частей KML-файлов.
  • Контекстное меню для меток
    • Показ (стерео-)видео, привязанного к метке
    • Проигрывание аудиофайла, привязанного к метке
  • Визуализация атмосферы, солнца и звёздного неба
  • Покадровая запись видео с приложения
  • Управление камерой с помощью мыши, клавиатуры и джойстика 3dconnexion
  • Режим прогулки
  • Анимация движения космических аппаратов на орбите
  • Освещение зданий и космических аппаратов в зависимости от времени суток
  • Рендеринг дорог с разметкой и лесов
    • на основе данных из KML-файлов
    • на основе данных OpenStreetMap
  • Моделирование дорожного трафика
  • Визуализация природных явлений
    • Схема работы геотермальной системы Долины гейзеров (магматический очаг, линии тока воды, флюиды
    • Схема работы гейзера (надземная и подземная части)
    • Дождь
    • Пожар

Однако, со временем стало ясно, что Аванго создаёт больше трудностей, чем решает. Изначально предполагалось, что Аванго ускорит разработку приложения, благодаря использованию языка Питон. Аванго обеспечивает привязку к Питону основных классов OSG. И действительно, простые задачи на Аванго решаются очень просто. Но чем сложнее задача, тем чаще оказывается, что на уровне Питона нет нужного функционала. Приходится спускаться на уровень C++, где потом возникает необходимость писать большой объём рутинного кода только для того, чтобы привязать свои наработки к Питону.

Другая «фича» Аванго – граф потоков данных. Предполагается, что приложение должно состоять из набора изолированных сущностей – «полевых контейнеров», которые связываются между собой потоками данных. При изменении данных у одного полевого контейнера с одного конца связи они автоматически пересылаются на другой конец связи другому полевому контейнеру. Идея на первый взгляд здравая, но:

  1. На Питоне создавать новые полевые контейнеры просто. Их становится очень много и может возникнуть путаница. Сложно держать в голове все связи. К тому же обработка полевых контейнеров на Питоне сильно замедляет работу приложения.
  2. На C++ создавать новые полевые контейнеры – это ад. Требуется огромное количество дополнительного кода для поддержки работы потоков.

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

Также при визуализации данных на глобусе жизненно важным является использование типа данных double и соответственно вектора osg::Vec3d. Точности типа float не хватает, и поэтому, например, при движении камеры возникает дерганье. Однако, в Аванго тип osg::Vec3d не экспортирован на уровень Питона. Только osg::Vec3f. Мне пришлось добавлять поддержку osg::Vec3d самостоятельно.

Для хранения всех моих изменений в коде Аванго я сделал форк.

Ну, и пара слов про кроссплатформенность. Аванго изначально разрабатывался под Линуксом. И здесь у него наилучшая поддержка. Под Виндой не работают модуль связи с джойстиками и модуль аудио. Под Маком Аванго не работает. Про Андроид и айОС я вообще молчу.

Поэтому я решил отказаться от использования Аванго и полностью перейти на OSG и osgEarth. Кодовое название нового приложения - «Виртуальная Земля 2.0». Часть кода из старого приложения, которая была написана на C++, будет перенести не сложно. Часть функционала уже реализована в osgEarth, например, базовая поддержка KML.

Для создания меню в приложении решил использовать библиотеку CEGUI. За основу взял пример, выложенный в рассылке OSG. Правда, неожиданно обнаружилось, что CEGUI не поддерживает пассивное стерео. Но я разберусь с этим.

В последующих постах будет описание процесса разработки.