Объёмы

В CesiumJS под объёмами понимаются трёхмерные пространственные структуры, которые занимают конечную область в сцене и имеют внутреннюю геометрию или подразумеваемое заполнение. В отличие от поверхностных моделей, работающих только с оболочкой объекта, объёмные представления учитывают внутреннее пространство, позволяя выполнять задачи визуализации плотностей, классификации, отсечения и анализа пространственных данных.

Ключевая особенность объёмов в контексте CesiumJS заключается в том, что они не всегда представлены как «полностью заполненная» геометрия. Часто это комбинация поверхностей, шейдерных эффектов, данных 3D Tiles и GPU-вычислений.


Геометрические объёмы: базовые подходы

Экструзия как основной механизм формирования объёмов

Наиболее распространённый способ создания объёмов — экструзия двумерных контуров в третье измерение. В CesiumJS это реализуется через свойства extrudedHeight и height.

const entity = viewer.entities.add({
  polygon: {
    hierarchy: Cesium.Cartesian3.fromDegreesArray([
      -115.0, 37.0,
      -115.0, 32.0,
      -107.0, 33.0,
      -102.0, 31.0,
      -102.0, 35.0
    ]),
    height: 1000,
    extrudedHeight: 5000,
    material: Cesium.Color.BLUE.withAlpha(0.5),
    outline: true,
    outlineColor: Cesium.Color.WHITE
  }
});

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

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

Прямоугольные и параметрические объёмы

CesiumJS поддерживает параметрические объёмы через примитивы:

const box = viewer.entities.add({
  position: Cesium.Cartesian3.fromDegrees(-75.0, 40.0, 300000.0),
  box: {
    dimensions: new Cesium.Cartesian3(400000.0, 300000.0, 500000.0),
    material: Cesium.Color.RED.withAlpha(0.4)
  }
});

Аналогично используются сферы и эллипсоиды:

viewer.entities.add({
  position: Cesium.Cartesian3.fromDegrees(-100.0, 40.0),
  ellipsoid: {
    radii: new Cesium.Cartesian3(200000.0, 200000.0, 300000.0),
    material: Cesium.Color.YELLOW.withAlpha(0.3)
  }
});

Объёмы в Entity API и сцена высокого уровня абстракции

Entity API предоставляет декларативный способ описания объёмов, скрывая низкоуровневые вычисления геометрии.

Основные типы объёмных сущностей:

  • polygon с экструзией
  • box
  • ellipsoid
  • cylinder
  • corridor

Цилиндр как объём

viewer.entities.add({
  position: Cesium.Cartesian3.fromDegrees(-90.0, 40.0, 0),
  cylinder: {
    length: 500000.0,
    topRadius: 200000.0,
    bottomRadius: 200000.0,
    material: Cesium.Color.GREEN.withAlpha(0.4)
  }
});

Цилиндры применяются для:

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

Примитивы как низкоуровневое представление объёмов

В отличие от Entity API, примитивы обеспечивают более высокую производительность и контроль над отрисовкой.

const instance = new Cesium.GeometryInstance({
  geometry: Cesium.BoxGeometry.fromDimensions({
    dimensions: new Cesium.Cartesian3(300000.0, 300000.0, 300000.0)
  }),
  modelMatrix: Cesium.Transforms.eastNorthUpToFixedFrame(
    Cesium.Cartesian3.fromDegrees(-80.0, 35.0, 250000.0)
  ),
  attributes: {
    color: Cesium.ColorGeometryInstanceAttribute.fromColor(
      Cesium.Color.BLUE.withAlpha(0.5)
    )
  }
});

viewer.scene.primitives.add(new Cesium.Primitive({
  geometryInstances: instance,
  appearance: new Cesium.PerInstanceColorAppearance({
    translucent: true
  })
}));

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

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

3D Tiles и объёмное представление больших данных

3D Tiles представляет собой основной механизм работы с крупными объёмами данных в CesiumJS. Хотя визуально это чаще поверхностные модели, концептуально они формируют иерархический объём сцены.

const tileset = new Cesium.Cesium3DTileset({
  url: 'https://assets.cesium.com/tileset.json'
});

viewer.scene.primitives.add(tileset);

Клиппинг как инструмент формирования «виртуальных объёмов»

Один из ключевых механизмов работы с объёмами в 3D Tiles — отсечение.

tileset.clippingPlanes = new Cesium.ClippingPlaneCollection({
  planes: [
    new Cesium.ClippingPlane(new Cesium.Cartesian3(1.0, 0.0, 0.0), -1000.0)
  ],
  unionClippingRegions: true
});

Clipping planes позволяют:

  • вырезать внутренние части объёмов
  • анализировать сечения зданий
  • визуализировать скрытые структуры

Классификация как объёмное наложение данных

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

const classification = viewer.entities.add({
  polygon: {
    hierarchy: Cesium.Cartesian3.fromDegreesArray([
      -108.0, 38.0,
      -108.0, 35.0,
      -102.0, 35.0,
      -102.0, 38.0
    ]),
    extrudedHeight: 2000,
    classificationType: Cesium.ClassificationType.TERRAIN,
    material: Cesium.Color.RED.withAlpha(0.4)
  }
});

Типы классификации:

  • TERRAIN — влияние на рельеф
  • 3D_TILE — воздействие на модели
  • BOTH — комбинированное применение

Классификация используется для:

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

Объёмные эффекты и частично поддерживаемые технологии

CesiumJS поддерживает ряд GPU-ориентированных подходов, которые приближаются к объёмной визуализации:

  • атмосферные слои
  • облака и аэрозоли (через постэффекты)
  • полупрозрачные поля влияния
  • voxel-based представления (экспериментальные реализации)

Воксельные структуры

Воксельные объёмы представляют собой дискретную сетку значений в 3D пространстве. Они используются для:

  • геологических моделей
  • медицинской визуализации
  • плотностных полей

В CesiumJS воксельные подходы обычно реализуются через кастомные примитивы и шейдеры, либо через экспериментальные API.


Взаимодействие объёмов с координатной системой

Все объёмы в CesiumJS привязаны к глобальной эллипсоидальной модели Земли WGS84. Это накладывает особенности:

  • масштаб объектов зависит от кривизны поверхности
  • локальные объёмы требуют трансформации в ENU-систему
  • ориентация объёмов часто строится через Transforms.eastNorthUpToFixedFrame
const modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(
  Cesium.Cartesian3.fromDegrees(-75.0, 40.0, 0.0)
);

Производительность при работе с объёмами

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

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

  • количество вершин в геометрии
  • прозрачность и overdraw
  • количество clipping planes
  • частота обновления динамических объёмов

Практика оптимизации включает:

  • использование Primitive вместо Entity
  • батчинг геометрии
  • снижение детализации LOD
  • минимизацию прозрачных слоёв
  • кэширование матриц трансформации

Динамические объёмы и изменение во времени

CesiumJS поддерживает временную динамику объёмов через Property систему.

polygon: {
  extrudedHeight: new Cesium.CallbackProperty(function(time) {
    return 1000 + Math.sin(Date.now() * 0.001) * 500;
  }, false)
}

Такие объёмы применяются для:

  • моделирования волн влияния
  • анимации роста объектов
  • визуализации временных процессов

Сечения и анализ внутренних структур

Сечения являются одним из ключевых инструментов анализа объёмов. Они позволяют визуализировать внутреннюю структуру 3D объектов.

viewer.scene.globe.clippingPlanes = new Cesium.ClippingPlaneCollection({
  planes: [
    new Cesium.ClippingPlane(new Cesium.Cartesian3(0, 1, 0), -5000)
  ]
});

Использование сечений позволяет:

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

Сложные составные объёмы

Композиция объёмов достигается путём наложения нескольких примитивов и логических операций:

  • объединение (union)
  • пересечение (intersection)
  • вычитание (difference через clipping)

Хотя CesiumJS не предоставляет полноценную CSG-систему на уровне API, подобные операции реализуются через комбинацию:

  • clipping planes
  • прозрачных слоёв
  • отдельных сущностей

Объёмы как средство пространственного моделирования

Объёмное представление в CesiumJS выступает универсальным инструментом для:

  • анализа пространственных данных
  • визуализации зон влияния
  • построения интерактивных 3D сцен
  • интеграции геоданных с временной динамикой