В 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 предоставляет декларативный способ описания объёмов, скрывая низкоуровневые вычисления геометрии.
Основные типы объёмных сущностей:
polygon с экструзиейboxellipsoidcylindercorridorviewer.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 представляет собой основной механизм работы с крупными объёмами данных в 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-ориентированных подходов, которые приближаются к объёмной визуализации:
Воксельные объёмы представляют собой дискретную сетку значений в 3D пространстве. Они используются для:
В CesiumJS воксельные подходы обычно реализуются через кастомные примитивы и шейдеры, либо через экспериментальные API.
Все объёмы в CesiumJS привязаны к глобальной эллипсоидальной модели Земли WGS84. Это накладывает особенности:
Transforms.eastNorthUpToFixedFrameconst modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(
Cesium.Cartesian3.fromDegrees(-75.0, 40.0, 0.0)
);
Объёмные структуры оказывают значительную нагрузку на GPU и CPU, особенно при большом количестве примитивов или сложных шейдерных вычислениях.
Основные факторы производительности:
Практика оптимизации включает:
Primitive вместо EntityCesiumJS поддерживает временную динамику объёмов через
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)
]
});
Использование сечений позволяет:
Композиция объёмов достигается путём наложения нескольких примитивов и логических операций:
Хотя CesiumJS не предоставляет полноценную CSG-систему на уровне API, подобные операции реализуются через комбинацию:
Объёмное представление в CesiumJS выступает универсальным инструментом для: