EllipsoidSurfaceAppearance в CesiumJS представляет собой специализированный класс визуального представления, предназначенный для рендеринга геометрии, «прилипшей» к поверхности эллипсоида. Он используется в связке с примитивами (Primitive API) и ориентирован на задачи отображения больших поверхностей, таких как полигоны, покрывающие участки земного шара, с корректным учётом кривизны планеты и встроенной системой материалов Cesium.
EllipsoidSurfaceAppearance относится к уровню Appearance API, который в CesiumJS отвечает не за геометрию, а за то, как она будет отрисована. Геометрия создаётся отдельно (например, PolygonGeometry, RectangleGeometry), а Appearance определяет:
EllipsoidSurfaceAppearance оптимизирован для случаев, когда вершины геометрии лежат на поверхности эллипсоида, а не в произвольном 3D-пространстве. Это ключевое отличие от базовых Appearance-классов.
Основная особенность заключается в интерпретации входных координат. В отличие от свободной 3D-геометрии, здесь предполагается:
Cesium использует WGS84-эллипсоид как базовую модель Земли. EllipsoidSurfaceAppearance обеспечивает корректное вычисление нормалей и тангенциальных векторов, необходимых для шейдинга и текстурирования поверхности.
EllipsoidSurfaceAppearance тесно связан с системой материалов Cesium Material. Материал определяет визуальное поведение поверхности, включая:
Внутри шейдеров используется стандартная структура czm_material, которая формируется на основе выбранного материала:
czm_materialInput materialInput;
czm_material material = czm_getMaterial(materialInput);
EllipsoidSurfaceAppearance автоматически подготавливает входные данные для материала, включая:
Типичная конфигурация EllipsoidSurfaceAppearance включает следующие параметры:
Пример инициализации:
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 базируется на аналитически вычисляемых нормалях эллипсоида. Это позволяет избежать артефактов, характерных для плоских карт:
Такой подход обеспечивает корректное поведение диффузного и спекулярного освещения без необходимости хранить нормали в геометрии.
UV-координаты вычисляются процедурно:
Особенность EllipsoidSurfaceAppearance заключается в том, что UV не фиксированы в геометрии, а вычисляются в шейдере, что снижает объём данных и повышает гибкость.
При включённом translucent=true активируется альфа-композиция, влияющая на:
Cesium автоматически разделяет непрозрачные и прозрачные объекты, однако EllipsoidSurfaceAppearance может требовать ручного контроля при сложных сценах, где перекрываются большие поверхности.
EllipsoidSurfaceAppearance оптимизирован для крупномасштабных данных:
Основные факторы, влияющие на производительность:
EllipsoidSurfaceAppearance занимает специфическую нишу среди других Appearance-классов:
Ключевое отличие заключается в глубокой интеграции с моделью эллипсоида и автоматической географической интерпретации данных.
EllipsoidSurfaceAppearance допускает расширение через пользовательские материалы. В таких случаях используется GLSL-подобный синтаксис Cesium:
material: new Cesium.Material({
fabric: {
type: 'Checkerboard',
uniforms: {
lightColor: Cesium.Color.WHITE,
darkColor: Cesium.Color.BLACK
}
}
})
Шейдерная логика внедряется в pipeline через czm_material, что позволяет:
EllipsoidSurfaceAppearance тесно взаимодействует с depth buffer:
При некорректной настройке могут возникать артефакты наложения, особенно при пересечении с terrain и 3D Tiles.
Несмотря на гибкость, существуют ограничения:
Использование вне географического контекста приводит к потере преимуществ и деградации производительности.
EllipsoidSurfaceAppearance часто используется для:
За счёт процедурной природы UV и тесной связи с эллипсоидом достигается высокая точность наложения данных на поверхность планеты без предварительного запекания текстур.