Режимы просмотра

CesiumJS оперирует тремя основными режимами отображения сцены, которые определяют способ проекции и интерпретации географических данных: трёхмерный режим, двумерный режим и промежуточный режим Колумба (Columbus View). Эти режимы реализованы на уровне SceneMode и управляются через объект сцены viewer.scene.

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


Трёхмерный режим (SCENE3D)

Трёхмерный режим является основным и наиболее функциональным в CesiumJS. Он использует глобальную сферическую модель Земли с поддержкой перспективной камеры.

В этом режиме:

  • Земля представляется как эллипсоид WGS84
  • Камера свободно перемещается в трёхмерном пространстве
  • Поддерживаются наклоны, вращения и облет объектов
  • Используется перспективная проекция

Переключение в 3D осуществляется через:

viewer.scene.mode = Cesium.SceneMode.SCENE3D;

или через морфинг:

viewer.scene.morphTo3D(1.5);

Параметр морфинга определяет длительность перехода в секундах.

Особенности камеры в 3D

Камера в трёхмерном режиме имеет полную свободу вращения:

viewer.camera.setView({
    destination: Cesium.Cartesian3.fromDegrees(30.5, 50.45, 1500000)
});

Дополнительно доступны:

  • вращение вокруг точки интереса
  • наклон (pitch)
  • поворот (heading)

Двумерный режим (SCENE2D)

Двумерный режим переводит сцену в плоскую картографическую проекцию. Геометрия Земли «разворачивается» в прямоугольную координатную плоскость.

Характерные свойства:

  • используется ортографическая проекция
  • отсутствует перспектива
  • север всегда направлен вверх
  • камера ограничена перемещением по осям X и Y

Переключение:

viewer.scene.mode = Cesium.SceneMode.SCENE2D;

Морфинг:

viewer.scene.morphTo2D(2.0);

Поведение камеры в 2D

В двумерном режиме камера теряет свободу вращения:

  • недоступен pitch
  • недоступен heading
  • масштабирование происходит линейно

Пример установки вида:

viewer.camera.setView({
    destination: Cesium.Rectangle.fromDegrees(
        -20.0, 10.0, 20.0, 50.0
    )
});

Режим Колумба (COLUMBUS VIEW)

Режим Колумба представляет собой гибрид между 2D и 3D. Он отображает данные на развернутой плоскости, но сохраняет возможность вертикального возвышения объектов.

Основные характеристики:

  • горизонтальное положение данных соответствует 2D-карте
  • высота объектов отображается как вертикальное смещение
  • камера может наклоняться, но без полной сферической геометрии
  • используется для визуального анализа высотных данных

Переключение:

viewer.scene.mode = Cesium.SceneMode.COLUMBUS_VIEW;

Морфинг:

viewer.scene.morphToColumbusView(1.5);

Особенности визуализации

В этом режиме:

  • рельеф и здания «вырастают» вверх от плоскости
  • карта остаётся фиксированной по горизонтали
  • геометрия упрощается для повышения производительности

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

CesiumJS поддерживает плавное переключение между режимами без перезагрузки сцены. Этот процесс называется morphing.

Доступные методы:

viewer.scene.morphTo3D(duration);
viewer.scene.morphTo2D(duration);
viewer.scene.morphToColumbusView(duration);

Где duration задаёт длительность анимации.

Морфинг реализован через интерполяцию параметров камеры и геометрии сцены, включая:

  • изменение проекции
  • перерасчёт координат
  • трансформацию матриц вида
  • адаптацию тайлового слоя

SceneMode и управление состоянием сцены

Основной интерфейс для контроля режима:

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

Текущее состояние сцены:

const mode = viewer.scene.mode;

Проверка режима:

if (viewer.scene.mode === Cesium.SceneMode.SCENE3D) {
    // логика для 3D
}

Ограничения и различия режимов

Каждый режим накладывает собственные ограничения на рендеринг и взаимодействие.

3D режим

  • максимальная гибкость камеры
  • высокая нагрузка на GPU
  • полноценная глобальная визуализация

2D режим

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

Columbus View

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

Влияние режима на сущности и примитивы

Entity API и примитивы Cesium адаптируются под текущий режим автоматически. Однако поведение отдельных компонентов может изменяться:

  • Billboard и Label остаются экранно-ориентированными
  • Model корректирует ориентацию под камеру
  • Polygon и Polyline пересчитываются под текущую проекцию

Пример добавления сущности:

viewer.entities.add({
    position: Cesium.Cartesian3.fromDegrees(30, 50),
    point: {
        pixelSize: 10,
        color: Cesium.Color.RED
    }
});

Эта сущность корректно отображается во всех режимах, но её визуальная интерпретация зависит от сцены.


Программное управление режимами через интерфейс сцены

Cesium предоставляет низкоуровневый доступ к сцене:

const scene = viewer.scene;
scene.mode = Cesium.SceneMode.SCENE3D;

Также доступно управление через события:

scene.morphStart.addEventListener(function() {
    // начало перехода
});

scene.morphComplete.addEventListener(function() {
    // завершение перехода
});

Связь режимов с производительностью

Выбор режима напрямую влияет на нагрузку рендеринга:

  • 3D требует активного использования WebGL и сложных шейдеров
  • 2D снижает количество вычислений за счёт упрощённой геометрии
  • Columbus View балансирует между ними

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