Плоскости отсечения в 3D-сценах используются для ограничения видимой геометрии по одну сторону от заданной математической плоскости. В контексте CesiumJS механизм clipping planes применяется к глобусу, 3D Tiles, экструдированным объектам и отдельным источникам данных, позволяя «разрезать» сцену и анализировать внутреннюю структуру геометрии.
Математически плоскость задаётся уравнением:
[ Ax + By + Cz + D = 0]
где вектор ((A, B, C)) определяет нормаль плоскости, а (D) — смещение. Любая точка пространства классифицируется относительно плоскости через знак подстановки в уравнение: положительное значение соответствует одной полуплоскости, отрицательное — другой.
В CesiumJS плоскости отсечения объединяются в коллекции
ClippingPlaneCollection. Она может применяться к:
Cesium3DTilesetGlobeModelPrimitiveОсновная структура:
const clippingPlanes = new Cesium.ClippingPlaneCollection({
planes: [
new Cesium.ClippingPlane(
new Cesium.Cartesian3(1.0, 0.0, 0.0),
0.0
)
],
unionClippingRegions: false
});
Каждая плоскость задаётся:
Cartesian3)distance)Наиболее распространённый сценарий — отсечение 3D Tileset:
const tileset = viewer.scene.primitives.add(
new Cesium.Cesium3DTileset({
url: "tileset.json",
clippingPlanes: new Cesium.ClippingPlaneCollection({
planes: [
new Cesium.ClippingPlane(
new Cesium.Cartesian3(0.0, 0.0, -1.0),
0.0
)
]
})
})
);
В этом случае геометрия отсекается по высоте, что позволяет «разрезать» здания или подземные структуры.
ClippingPlanes могут применяться к глобусу:
viewer.scene.globe.clippingPlanes = new Cesium.ClippingPlaneCollection({
planes: [
new Cesium.ClippingPlane(
new Cesium.Cartesian3(0.0, 1.0, 0.0),
0.0
)
]
});
Глобус перестаёт рендерить части террейна по одну сторону от плоскости, что используется для геологического анализа, визуализации разрезов и инженерных задач.
Ключевая настройка — unionClippingRegions.
unionClippingRegions: false
Объект отображается только там, где он удовлетворяет всем плоскостям одновременно. Это логическая операция AND.
unionClippingRegions: true
Объект сохраняется, если он проходит хотя бы одну плоскость. Это логическая операция OR.
Эта разница критична при построении сложных сечений.
Плоскости могут быть заданы в мировых координатах или относительных к
объекту. При работе с Model и Cesium3DTileset
важно учитывать трансформации:
modelMatrix)Пример привязки к объекту:
tileset.clippingPlanes.modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(
Cesium.Cartesian3.fromDegrees(longitude, latitude)
);
Плоскость можно динамически изменять через нормаль и расстояние.
const plane = clippingPlanes.get(0);
plane.normal = Cesium.Cartesian3.UNIT_Z;
plane.distance = 100.0;
Для интерактивного редактирования часто используется привязка к гизмо-манипуляторам или событиям мыши.
CesiumJS позволяет включить отображение вспомогательной геометрии:
clippingPlanes.edgeWidth = 2.0;
clippingPlanes.edgeColor = Cesium.Color.YELLOW;
Параметры:
edgeWidth — толщина линии сеченияedgeColor — цвет визуализации разрезаЭта отрисовка помогает интерпретировать границу отсечения в пространстве.
Комбинации плоскостей позволяют формировать объемы отсечения (clipping volumes). Например, «коробка» создаётся шестью плоскостями:
planes: [
new Cesium.ClippingPlane(new Cesium.Cartesian3(1, 0, 0), 100),
new Cesium.ClippingPlane(new Cesium.Cartesian3(-1, 0, 0), 100),
new Cesium.ClippingPlane(new Cesium.Cartesian3(0, 1, 0), 100),
new Cesium.ClippingPlane(new Cesium.Cartesian3(0, -1, 0), 100),
new Cesium.ClippingPlane(new Cesium.Cartesian3(0, 0, 1), 100),
new Cesium.ClippingPlane(new Cesium.Cartesian3(0, 0, -1), 100)
]
Такой подход используется для выделения подземных участков или инженерных сечений зданий.
Clipping planes обрабатываются на уровне шейдеров GPU. Это означает:
Однако существуют ограничения:
Отсечённые поверхности не участвуют в освещении и тенях. При этом:
Ключевая сложность связана с несоответствием систем координат:
Cartesian3.fromDegreesТипичная ошибка — использование нормали в одном пространстве и расстояния в другом, что приводит к смещённым или «плавающим» сечениям.
Clipping planes часто используются для анимации «разреза» сцены:
let d = 0.0;
viewer.clock.onTick.addEventListener(() => {
d += 1.0;
clippingPlanes.get(0).distance = d;
});
Это создаёт эффект постепенного раскрытия внутренней структуры модели или рельефа.
Clipping planes могут сочетаться с:
ClassificationPrimitiveCustomShaderВ таких комбинациях возникает важный порядок обработки: сначала выполняется отсечение геометрии, затем шейдерные модификации и классификация.