Clipping planes

Плоскости отсечения в 3D-сценах используются для ограничения видимой геометрии по одну сторону от заданной математической плоскости. В контексте CesiumJS механизм clipping planes применяется к глобусу, 3D Tiles, экструдированным объектам и отдельным источникам данных, позволяя «разрезать» сцену и анализировать внутреннюю структуру геометрии.

Математически плоскость задаётся уравнением:

[ Ax + By + Cz + D = 0]

где вектор ((A, B, C)) определяет нормаль плоскости, а (D) — смещение. Любая точка пространства классифицируется относительно плоскости через знак подстановки в уравнение: положительное значение соответствует одной полуплоскости, отрицательное — другой.


В CesiumJS плоскости отсечения объединяются в коллекции ClippingPlaneCollection. Она может применяться к:

  • Cesium3DTileset
  • Globe
  • Model
  • Primitive

Основная структура:

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 Tiles

Наиболее распространённый сценарий — отсечение 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 может иметь географическую привязку
  • нормаль плоскости интерпретируется в пространстве объекта

Пример привязки к объекту:

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. Это означает:

  • отсечение происходит до финального растеризатора
  • влияние на CPU минимально
  • сложность сцены почти не влияет на стоимость операции

Однако существуют ограничения:

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

Взаимодействие с материалами и освещением

Отсечённые поверхности не участвуют в освещении и тенях. При этом:

  • PBR-материалы корректно обрезаются
  • нормали на границе могут визуально «ломаться»
  • тени могут не соответствовать видимой геометрии при сложных конфигурациях

Координатные системы и частые ошибки

Ключевая сложность связана с несоответствием систем координат:

  • Cartesian3 — мировая система Cesium
  • локальные координаты модели — зависят от glTF/tileset
  • географические координаты требуют преобразования через Cartesian3.fromDegrees

Типичная ошибка — использование нормали в одном пространстве и расстояния в другом, что приводит к смещённым или «плавающим» сечениям.


Динамические разрезы и анимация

Clipping planes часто используются для анимации «разреза» сцены:

let d = 0.0;

viewer.clock.onTick.addEventListener(() => {
    d += 1.0;
    clippingPlanes.get(0).distance = d;
});

Это создаёт эффект постепенного раскрытия внутренней структуры модели или рельефа.


Комбинация с другими визуальными слоями

Clipping planes могут сочетаться с:

  • ClassificationPrimitive
  • CustomShader
  • terrain exaggeration
  • imagery layers

В таких комбинациях возникает важный порядок обработки: сначала выполняется отсечение геометрии, затем шейдерные модификации и классификация.


Практические сценарии применения

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