EllipsoidSurfaceAppearance

EllipsoidSurfaceAppearance в CesiumJS представляет собой специализированный класс визуального представления, предназначенный для рендеринга геометрии, «прилипшей» к поверхности эллипсоида. Он используется в связке с примитивами (Primitive API) и ориентирован на задачи отображения больших поверхностей, таких как полигоны, покрывающие участки земного шара, с корректным учётом кривизны планеты и встроенной системой материалов Cesium.

EllipsoidSurfaceAppearance относится к уровню Appearance API, который в CesiumJS отвечает не за геометрию, а за то, как она будет отрисована. Геометрия создаётся отдельно (например, PolygonGeometry, RectangleGeometry), а Appearance определяет:

  • шейдерную модель;
  • способ интерполяции атрибутов;
  • правила работы с материалами;
  • поведение прозрачности и глубины.

EllipsoidSurfaceAppearance оптимизирован для случаев, когда вершины геометрии лежат на поверхности эллипсоида, а не в произвольном 3D-пространстве. Это ключевое отличие от базовых Appearance-классов.

Геометрическая модель и привязка к эллипсоиду

Основная особенность заключается в интерпретации входных координат. В отличие от свободной 3D-геометрии, здесь предполагается:

  • координаты задаются в виде Cartographic (долгота, широта, высота);
  • высота часто равна нулю или минимально варьируется;
  • вершины проецируются на эллипсоидическую поверхность.

Cesium использует WGS84-эллипсоид как базовую модель Земли. EllipsoidSurfaceAppearance обеспечивает корректное вычисление нормалей и тангенциальных векторов, необходимых для шейдинга и текстурирования поверхности.

Шейдерная структура и Material System

EllipsoidSurfaceAppearance тесно связан с системой материалов Cesium Material. Материал определяет визуальное поведение поверхности, включая:

  • цветовые градиенты;
  • процедурные текстуры;
  • анимации (например, пульсация, потоковые эффекты);
  • маски и смешивание слоёв.

Внутри шейдеров используется стандартная структура czm_material, которая формируется на основе выбранного материала:

czm_materialInput materialInput;
czm_material material = czm_getMaterial(materialInput);

EllipsoidSurfaceAppearance автоматически подготавливает входные данные для материала, включая:

  • UV-координаты, рассчитанные на основе географической проекции;
  • нормали поверхности эллипсоида;
  • координаты в eye-space.

Конструктор и базовые параметры

Типичная конфигурация EllipsoidSurfaceAppearance включает следующие параметры:

  • material — экземпляр материала Cesium;
  • translucent — определяет необходимость прозрачного рендеринга;
  • aboveGround — управление поведением относительно поверхности Земли;
  • flat — упрощённое освещение без сложных расчётов нормалей.

Пример инициализации:

const appearance = new Cesium.EllipsoidSurfaceAppearance({
    material: Cesium.Material.fromType('Color', {
        color: Cesium.Color.BLUE.withAlpha(0.5)
    }),
    translucent: true
});

Данный объект затем используется в Primitive:

const primitive = new Cesium.Primitive({
    geometryInstances: geometryInstance,
    appearance: appearance
});

Работа с освещением и нормалями

Освещение в EllipsoidSurfaceAppearance базируется на аналитически вычисляемых нормалях эллипсоида. Это позволяет избежать артефактов, характерных для плоских карт:

  • нормали рассчитываются на основе позиции на эллипсоиде;
  • используется радиус-вектор от центра Земли;
  • нормали нормализуются в eye-space.

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

Проекция текстур и UV-развёртка

UV-координаты вычисляются процедурно:

  • долгота отображается на ось U;
  • широта отображается на ось V;
  • применяется коррекция на полюсах для уменьшения искажений.

Особенность EllipsoidSurfaceAppearance заключается в том, что UV не фиксированы в геометрии, а вычисляются в шейдере, что снижает объём данных и повышает гибкость.

Прозрачность и порядок отрисовки

При включённом translucent=true активируется альфа-композиция, влияющая на:

  • сортировку примитивов;
  • необходимость многопроходного рендеринга;
  • blending в WebGL контексте.

Cesium автоматически разделяет непрозрачные и прозрачные объекты, однако EllipsoidSurfaceAppearance может требовать ручного контроля при сложных сценах, где перекрываются большие поверхности.

Производительность и оптимизация

EllipsoidSurfaceAppearance оптимизирован для крупномасштабных данных:

  • минимизация передачи атрибутов в GPU;
  • отказ от хранения нормалей в буферах;
  • использование процедурных вычислений;
  • уменьшение количества uniform-переменных.

Основные факторы, влияющие на производительность:

  • количество вершин геометрии;
  • сложность материала (процедурные шейдеры дороже простых цветов);
  • использование прозрачности (deferred rendering ограничен);
  • пересечение с другими слоями поверхности.

Отличие от других Appearance

EllipsoidSurfaceAppearance занимает специфическую нишу среди других Appearance-классов:

  • PerInstanceColorAppearance — ориентирован на цвет на уровне экземпляров, без привязки к поверхности эллипсоида;
  • MaterialAppearance — более универсален, но менее оптимизирован для географических поверхностей;
  • EllipsoidSurfaceAppearance — специализирован для картографических примитивов на поверхности планеты.

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

Интеграция с пользовательскими шейдерами

EllipsoidSurfaceAppearance допускает расширение через пользовательские материалы. В таких случаях используется GLSL-подобный синтаксис Cesium:

material: new Cesium.Material({
    fabric: {
        type: 'Checkerboard',
        uniforms: {
            lightColor: Cesium.Color.WHITE,
            darkColor: Cesium.Color.BLACK
        }
    }
})

Шейдерная логика внедряется в pipeline через czm_material, что позволяет:

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

Поведение в контексте глубины (Depth Testing)

EllipsoidSurfaceAppearance тесно взаимодействует с depth buffer:

  • предотвращает z-fighting при корректной географической привязке;
  • учитывает curvature ellipsoid при сравнении глубины;
  • поддерживает режим clamping к поверхности Земли.

При некорректной настройке могут возникать артефакты наложения, особенно при пересечении с terrain и 3D Tiles.

Ограничения модели

Несмотря на гибкость, существуют ограничения:

  • не предназначен для свободной 3D-геометрии;
  • ограниченная поддержка сложных деформаций поверхности;
  • зависимость от эллипсоидальной модели Земли;
  • возможные артефакты на полюсах при сложных текстурах.

Использование вне географического контекста приводит к потере преимуществ и деградации производительности.

Роль в построении картографических слоёв

EllipsoidSurfaceAppearance часто используется для:

  • отображения политических границ;
  • тепловых карт (heatmaps);
  • океанографических и климатических слоёв;
  • масок регионов;
  • визуализации аналитических данных на глобусе.

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