Морфинг между режимами

Морфинг режимов в CesiumJS представляет собой механизм плавного перехода между различными представлениями сцены: трёхмерным глобусом, двумерной картой и промежуточным режимом Columbus View. В основе лежит унифицированная модель сцены, в которой геометрия, камера и проекция интерполируются во времени, обеспечивая непрерывную трансформацию визуального пространства без резких скачков состояния.

В CesiumJS выделяются три базовых режима отображения, задаваемых через SceneMode:

  • 3D (SCENE3D) — полноценный геоцентрический глобус
  • 2D (SCENE2D) — ортографическая или псевдоплоская карта
  • Columbus View (COLUMBUS_VIEW) — гибридная проекция с наклонной перспективой

Каждый режим определяет способ проецирования координат и поведение камеры. Переход между ними реализуется не как мгновенная замена матрицы проекции, а как интерполяция набора параметров сцены.

scene.mode = Cesium.SceneMode.SCENE3D;

Состояние сцены может изменяться напрямую, однако для морфинга используются специализированные методы сцены.

Морфинг как процесс интерполяции состояния сцены

Морфинг в CesiumJS затрагивает несколько уровней:

  • матрицу проекции (Perspective ↔︎ Orthographic)
  • положение и ориентацию камеры
  • геометрию глобуса
  • поведение depth testing и culling
  • визуальные слои и декорации

Ключевой параметр — время морфинга:

scene.morphTo3D(1.5);

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

Переход в 3D режим

Переход в трёхмерный глобус осуществляется через:

scene.morphTo3D(1.0);

В процессе:

  • плоская карта постепенно изгибается в сферу
  • высотные данные terrain начинают влиять на геометрию
  • камера переходит в перспективную проекцию
  • исчезает ограничение фиксированной вертикальной оси

Ключевым аспектом является трансформация координат из 2D-плоскости в геодезическую систему WGS84, где долгота и широта становятся угловыми координатами на сфере.

Переход в 2D режим

Обратный процесс реализуется через:

scene.morphTo2D(1.0);

При этом:

  • глобус «расплющивается» в плоскость
  • высоты перестают влиять на визуальное положение объектов
  • камера переходит в ортографическую проекцию
  • вращение ограничивается осью Z

Проекция заменяется на линейное отображение координат, где долгота становится X-осью, а широта — Y-осью.

Columbus View как промежуточное состояние

Columbus View используется как гибридный режим:

scene.morphToColumbusView(1.0);

Он сочетает:

  • наклонную перспективу
  • частичную сферическую деформацию
  • сохранение псевдо-3D восприятия без полного глобуса

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

Внутренняя логика SceneMode

Переключение режимов базируется на перечислении:

Cesium.SceneMode.SCENE3D;
Cesium.SceneMode.SCENE2D;
Cesium.SceneMode.COLUMBUS_VIEW;

Сцена хранит текущее состояние в:

scene.mode

Во время морфинга это значение может оставаться прежним до завершения анимации, тогда как визуальное представление уже находится в промежуточной фазе.

Камера и синхронизация трансформаций

Камера является центральным элементом морфинга. Она должна сохранять непрерывность восприятия сцены при изменении проекции.

В 3D режиме используется перспективная камера:

  • поле зрения (FOV)
  • матрица вида (view matrix)
  • матрица проекции (projection matrix)

В 2D режиме:

  • ортографическая проекция
  • фиксированное направление взгляда
  • ограниченная свобода вращения

Во время морфинга происходит интерполяция матриц:

  • view matrix изменяется плавно
  • projection matrix заменяется через blending
  • положение камеры трансформируется из ECEF в 2D экранные координаты

События начала и завершения морфинга

Система событий позволяет отслеживать этапы перехода:

scene.morphStart.addEventListener(function() {
    console.log("start");
});

scene.morphComplete.addEventListener(function() {
    console.log("end");
});

Эти события отражают границы интервала интерполяции. Между ними сцена находится в смешанном состоянии.

Поведение объектов во время морфинга

Геометрические объекты, добавленные в сцену, адаптируются к режиму отображения:

  • billboards и labels перерасчитывают экранные координаты
  • polygons меняют способ проекции вершин
  • 3D Tiles адаптируют LOD в зависимости от кривизны поверхности
  • terrain может временно упрощаться для стабильной анимации

Особое внимание уделяется предотвращению резких скачков глубины (z-fighting), которые могут возникать при переходных состояниях.

Роль времени морфинга

Параметр времени влияет на характер интерполяции:

scene.morphTo2D(0.2); // быстрый переход
scene.morphTo3D(3.0); // плавный переход

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

Влияние terrain и ellipsoid

Поверхность Земли в CesiumJS представлена комбинацией:

  • эллипсоида WGS84
  • цифровой модели рельефа (terrain provider)

Во время морфинга:

  • в 3D режиме terrain полностью активен
  • в 2D режиме рельеф проецируется в плоскость
  • в Columbus View используется частичное сглаживание высот

Переход требует пересчёта нормалей и частичной реконструкции буферов высот.

Синхронизация координатных систем

Основные преобразования происходят между:

  • Cartesian3 (ECEF)
  • Cartographic (longitude, latitude, height)
  • Screen space coordinates

Во время морфинга выполняется многократная интерполяция:

  • географические координаты остаются стабильными
  • экранные координаты изменяются непрерывно
  • высота интерполируется в зависимости от режима

Это обеспечивает визуальную стабильность объектов, закреплённых за земной поверхностью.

Ограничения и особенности поведения

Некоторые особенности морфинга связаны с архитектурой WebGL:

  • шейдеры могут пересоздаваться при смене режима
  • depth buffer очищается в промежуточных фазах
  • прозрачные материалы требуют повторной сортировки
  • post-processing эффекты могут временно отключаться

Особенно чувствительными являются кастомные шейдерные материалы, которые должны учитывать смену матрицы проекции.

Практика синхронизации пользовательского состояния

Состояние интерфейсных элементов часто привязывается к режиму сцены:

  • элементы управления картой
  • индикаторы ориентации
  • визуализация сетки координат
  • слои аннотаций

При морфинге требуется учитывать, что scene.mode не изменяется мгновенно, поэтому логика должна ориентироваться на фазу анимации, а не только на конечное состояние.

Оптимизационные аспекты

Морфинг является вычислительно затратной операцией, так как требует:

  • обновления матриц трансформации каждый кадр
  • пересчёта геометрии в экранном пространстве
  • синхронизации всех примитивов сцены
  • адаптации LOD для 3D Tiles

Оптимизация достигается через:

  • упрощение геометрии в переходной фазе
  • временное снижение частоты обновления слоёв
  • кэширование промежуточных матриц камеры
  • отключение второстепенных эффектов

Поведение анимационного цикла

Во время морфинга основной цикл рендеринга остаётся непрерывным. Изменяется только набор коэффициентов интерполяции:

  • коэффициент сферичности
  • степень перспективы
  • глубина проекции
  • смешивание матриц

Эти параметры изменяются синусоидально или линейно в зависимости от реализации внутреннего tween-движка сцены.

Координация нескольких переходов

При последовательных вызовах:

scene.morphTo2D(1.0);
scene.morphTo3D(1.0);

второй вызов перезапускает интерполяцию. Система не выполняет параллельный морфинг, а заменяет текущую цель трансформации.

Поведение сцены в таких случаях определяется последним активным запросом перехода.

Влияние пользовательского ввода

Во время морфинга управление камерой может быть:

  • частично заблокировано
  • интерполировано к новой системе координат
  • временно перенаправлено на внутренний контроллер сцены

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