Экзагерация рельефа

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

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


Любая поверхность в глобусе Cesium представляется функцией высоты:

[ h = f(, )]

где () — широта, () — долгота, (h) — высота относительно эллипсоида WGS84.

Экзагерация вводит коэффициент масштабирования вертикальной оси:

[ h’ = h k]

где (k) — коэффициент вертикального преувеличения.

При (k > 1) усиливается визуальная контрастность рельефа, при (k < 1) поверхность визуально «сплющивается».


Механизмы экзагерации в CesiumJS

Террейн-экзагерация сцены

В CesiumJS основным глобальным параметром является вертикальное преувеличение сцены:

viewer.scene.verticalExaggeration = 2.0;

Этот коэффициент влияет на все источники высот:

  • геометрия террейна (Cesium Terrain)
  • процедурные поверхности
  • 3D Tiles с относительными высотами

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


Экзагерация террейна

Отдельный уровень управления связан с поверхностью глобуса:

viewer.scene.globe.terrainExaggeration = 3.0;

Этот параметр влияет исключительно на цифровую модель рельефа, не затрагивая 3D Tiles и иные объекты сцены.

Разделение уровней экзагерации позволяет комбинировать эффекты:

  • усиление только рельефа
  • усиление всей сцены
  • независимая настройка слоёв данных

Применение к 3D Tiles

Геометрия, загружаемая через 3D Tiles, часто содержит абсолютные координаты. В этом случае экзагерация требует преобразования относительно центра модели:

[ ’ = + ( - ) k]

где:

  • () — исходная вершина
  • () — опорная точка (anchor)
    1. — коэффициент экзагерации

В CesiumJS подобные трансформации реализуются через modelMatrix:

const scale = Cesium.Matrix4.fromScale(
  new Cesium.Cartesian3(1.0, 1.0, 2.5),
  new Cesium.Matrix4()
);

tileset.modelMatrix = scale;

Такой подход позволяет локально усиливать вертикальные размеры конкретных объектов без влияния на глобус.


Динамическое изменение экзагерации

Изменение коэффициента в реальном времени часто используется для аналитической визуализации:

let k = 1.0;

viewer.scene.verticalExaggeration = k;

setInterval(() => {
  k += 0.1;
  if (k > 5.0) k = 1.0;
  viewer.scene.verticalExaggeration = k;
}, 1000);

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


Влияние на освещение и тени

Экзагерация изменяет геометрию поверхности, что напрямую влияет на:

  • расчёт нормалей террейна
  • угол падения света
  • длину и направление теней

При увеличении коэффициента:

  • тени становятся более вытянутыми
  • возрастает визуальная контрастность склонов
  • усиливается эффект рельефности

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


Взаимодействие с LOD и тайлингом

Cesium Terrain и 3D Tiles используют многоуровневую детализацию (LOD). При экзагерации:

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

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


Численные и визуальные артефакты

Сильная экзагерация приводит к ряду проблем:

1. Z-fighting При увеличении вертикального масштаба поверхности могут пересекаться с объектами сцены из-за недостаточной точности depth buffer.

2. Clipping near plane Высокие вертикальные значения увеличивают вероятность отсечения геометрии ближней плоскостью камеры.

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

4. Искажение 3D Tiles Геометрия зданий может визуально «вытягиваться» непропорционально основаниям.


Комбинирование с шейдерными эффектами

Экзагерация часто используется совместно с кастомными шейдерами террейна:

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

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


Практика многослойной экзагерации

В сложных сценах применяется раздельное масштабирование:

  • глобус: умеренное усиление рельефа
  • 3D Tiles: локальная корректировка высот
  • аналитические слои: независимая визуализация значений

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


Ограничения аппаратной реализации

На уровне GPU экзагерация реализуется через модификацию вершинных шейдеров. Основные ограничения:

  • точность float32 при больших масштабах сцен
  • производительность пересчёта нормалей
  • стоимость пересэмплинга террейна при динамических изменениях коэффициента

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


Особенности работы с глобальными координатами

Cesium использует геоцентрическую систему координат (ECEF), где малые ошибки масштабирования на больших расстояниях приводят к заметным визуальным сдвигам. Экзагерация усиливает эти эффекты, поскольку увеличивает абсолютные значения координат по оси нормали к эллипсоиду, что влияет на численную стабильность матриц преобразования.