Морфинг режимов в CesiumJS представляет собой механизм плавного перехода между различными представлениями сцены: трёхмерным глобусом, двумерной картой и промежуточным режимом Columbus View. В основе лежит унифицированная модель сцены, в которой геометрия, камера и проекция интерполируются во времени, обеспечивая непрерывную трансформацию визуального пространства без резких скачков состояния.
В CesiumJS выделяются три базовых режима отображения, задаваемых
через SceneMode:
Каждый режим определяет способ проецирования координат и поведение камеры. Переход между ними реализуется не как мгновенная замена матрицы проекции, а как интерполяция набора параметров сцены.
scene.mode = Cesium.SceneMode.SCENE3D;
Состояние сцены может изменяться напрямую, однако для морфинга используются специализированные методы сцены.
Морфинг в CesiumJS затрагивает несколько уровней:
Ключевой параметр — время морфинга:
scene.morphTo3D(1.5);
Значение задаёт длительность перехода в секундах. Во время интервала сцена находится в промежуточном состоянии, где одновременно существуют признаки обоих режимов.
Переход в трёхмерный глобус осуществляется через:
scene.morphTo3D(1.0);
В процессе:
Ключевым аспектом является трансформация координат из 2D-плоскости в геодезическую систему WGS84, где долгота и широта становятся угловыми координатами на сфере.
Обратный процесс реализуется через:
scene.morphTo2D(1.0);
При этом:
Проекция заменяется на линейное отображение координат, где долгота становится X-осью, а широта — Y-осью.
Columbus View используется как гибридный режим:
scene.morphToColumbusView(1.0);
Он сочетает:
Данный режим исторически используется для визуализации больших наборов данных с сохранением географической привязки и глубины.
Переключение режимов базируется на перечислении:
Cesium.SceneMode.SCENE3D;
Cesium.SceneMode.SCENE2D;
Cesium.SceneMode.COLUMBUS_VIEW;
Сцена хранит текущее состояние в:
scene.mode
Во время морфинга это значение может оставаться прежним до завершения анимации, тогда как визуальное представление уже находится в промежуточной фазе.
Камера является центральным элементом морфинга. Она должна сохранять непрерывность восприятия сцены при изменении проекции.
В 3D режиме используется перспективная камера:
В 2D режиме:
Во время морфинга происходит интерполяция матриц:
Система событий позволяет отслеживать этапы перехода:
scene.morphStart.addEventListener(function() {
console.log("start");
});
scene.morphComplete.addEventListener(function() {
console.log("end");
});
Эти события отражают границы интервала интерполяции. Между ними сцена находится в смешанном состоянии.
Геометрические объекты, добавленные в сцену, адаптируются к режиму отображения:
Особое внимание уделяется предотвращению резких скачков глубины (z-fighting), которые могут возникать при переходных состояниях.
Параметр времени влияет на характер интерполяции:
scene.morphTo2D(0.2); // быстрый переход
scene.morphTo3D(3.0); // плавный переход
При малых значениях увеличивается вероятность визуальных артефактов, связанных с резкой сменой проекций. При больших значениях возрастает нагрузка на синхронизацию слоёв сцены.
Поверхность Земли в CesiumJS представлена комбинацией:
Во время морфинга:
Переход требует пересчёта нормалей и частичной реконструкции буферов высот.
Основные преобразования происходят между:
Во время морфинга выполняется многократная интерполяция:
Это обеспечивает визуальную стабильность объектов, закреплённых за земной поверхностью.
Некоторые особенности морфинга связаны с архитектурой WebGL:
Особенно чувствительными являются кастомные шейдерные материалы, которые должны учитывать смену матрицы проекции.
Состояние интерфейсных элементов часто привязывается к режиму сцены:
При морфинге требуется учитывать, что scene.mode не
изменяется мгновенно, поэтому логика должна ориентироваться на фазу
анимации, а не только на конечное состояние.
Морфинг является вычислительно затратной операцией, так как требует:
Оптимизация достигается через:
Во время морфинга основной цикл рендеринга остаётся непрерывным. Изменяется только набор коэффициентов интерполяции:
Эти параметры изменяются синусоидально или линейно в зависимости от реализации внутреннего tween-движка сцены.
При последовательных вызовах:
scene.morphTo2D(1.0);
scene.morphTo3D(1.0);
второй вызов перезапускает интерполяцию. Система не выполняет параллельный морфинг, а заменяет текущую цель трансформации.
Поведение сцены в таких случаях определяется последним активным запросом перехода.
Во время морфинга управление камерой может быть:
Любое изменение положения камеры немедленно включается в текущую интерполяцию, предотвращая разрыв между пользовательским вводом и визуальной моделью сцены.