Видимость точек

Визуализация точек в CesiumJS опирается на совокупность факторов: геометрическое положение объекта в мировых координатах, состояние камеры, правила отбраковки (culling), параметры рендеринга и взаимодействие с глубинным буфером. Видимость точки не является бинарной характеристикой «показать/скрыть» — она формируется динамически на каждом кадре.


Геометрическая основа точки

Каждая точка в сцене CesiumJS задаётся в пространстве как позиция в системе координат WGS84, преобразуемая в Cartesian3.

const position = Cesium.Cartesian3.fromDegrees(
    37.6173, 
    55.7558, 
    100.0
);

На этапе рендеринга происходит последовательное преобразование:

  • географические координаты (долгота, широта, высота)
  • мировые координаты сцены
  • координаты камеры (view space)
  • экранные координаты (clip space)

Видимость точки определяется уже на этапе clip space и после проекции на экран.


Отсечение вне поля зрения (Frustum Culling)

Первый уровень определения видимости — проверка попадания в усечённую пирамиду обзора камеры (view frustum).

Точка считается невидимой, если:

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

CesiumJS применяет аппаратное и программное отсечение ещё до этапа растеризации.


Влияние расстояния до камеры

Расстояние до камеры напрямую влияет на пиксельный размер точки и её видимость.

PointPrimitive и PixelSize

const viewer = new Cesium.Viewer("cesiumContainer");

const point = viewer.entities.add({
    position: Cesium.Cartesian3.fromDegrees(10, 45, 0),
    point: {
        pixelSize: 10,
        color: Cesium.Color.YELLOW
    }
});

При увеличении расстояния:

  • точка уменьшается до 1 пикселя
  • далее может становиться субпиксельной
  • затем отбрасывается как незначимая (в зависимости от настроек)

DistanceDisplayCondition

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

point: {
    pixelSize: 8,
    distanceDisplayCondition: new Cesium.DistanceDisplayCondition(
        0.0,
        5000.0
    )
}

Поведение:

  • ближе минимальной границы — скрытие
  • внутри диапазона — отображение
  • дальше максимальной границы — скрытие

Это используется для оптимизации плотных облаков точек и LOD-логики.


Z-buffer и перекрытие объектов

Видимость точки зависит от глубинного теста (depth test). Даже если точка находится в пределах frustum, она может быть скрыта геометрией:

  • рельефом terrain
  • 3D Tiles объектами
  • моделями (glTF)
  • другими точками

При включённом depth test точка сравнивается с глубиной сцены:

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

Влияние глобуса и рельефа

При работе с глобусом используется эллипсоидальная модель Земли. Точки могут:

  • частично погружаться в поверхность
  • скрываться из-за terrain clipping
  • изменять видимость при включённом depth testing against terrain
viewer.scene.globe.depthTestAgainstTerrain = true;

Это критично для корректной визуализации объектов на поверхности.


PointPrimitiveCollection и производительность видимости

При большом количестве точек CesiumJS использует батчинг через PointPrimitiveCollection.

const points = scene.primitives.add(new Cesium.PointPrimitiveCollection());

points.add({
    position: Cesium.Cartesian3.fromDegrees(20, 50),
    pixelSize: 5,
    color: Cesium.Color.RED
});

Механизмы влияющие на видимость:

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

Видимость в 3D Tiles и облаках точек

При работе с 3D Tiles точки могут быть частью:

  • point cloud tileset
  • классифицированных облаков точек
  • фотограмметрических данных

Здесь применяется многоуровневый LOD:

  • скрытие целых тайлов
  • прореживание точек внутри тайла
  • адаптация плотности под экранное пространство
const tileset = new Cesium.Cesium3DTileset({
    url: "tileset.json"
});

viewer.scene.primitives.add(tileset);

Screen-space ошибки и пиксельная значимость

Важным фактором является экранная значимость точки. Если объект занимает меньше одного пикселя:

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

Это особенно заметно при:

  • отдалении камеры
  • высокой плотности данных
  • облаках точек LiDAR

Billboard как альтернативная модель видимости

Хотя billboard не является точкой в строгом смысле, он часто используется как её визуальный аналог.

viewer.entities.add({
    position: Cesium.Cartesian3.fromDegrees(30, 60),
    billboard: {
        image: "marker.png",
        scale: 1.0
    }
});

Особенности:

  • всегда ориентирован к камере
  • может игнорировать глубину (billboard.disableDepthTestDistance)
  • сохраняет читаемость на больших расстояниях

Условная видимость через выражения

CesiumJS поддерживает выражения времени и динамическое управление видимостью.

point: {
    pixelSize: 6,
    show: new Cesium.CallbackProperty(function (time) {
        return time.secondsOfDay % 10 < 5;
    }, false)
}

Поведение:

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

Цвет как фактор воспринимаемой видимости

Хотя цвет не влияет напрямую на алгоритм culling, он влияет на восприятие:

  • прозрачность (alpha blending)
  • яркость относительно фона
  • контраст с terrain и атмосферой
color: Cesium.Color.RED.withAlpha(0.3)

Полупрозрачные точки могут казаться исчезающими при наложении:

  • тумана
  • облаков атмосферы
  • других semi-transparent объектов

Атмосфера и постобработка

Постобработка сцены влияет на итоговую видимость:

  • HDR tone mapping
  • fog attenuation
  • lighting model globe illumination

В условиях сильного атмосферного рассеяния дальние точки визуально исчезают, хотя формально остаются отрисованными.


Кэширование и отложенное обновление видимости

CesiumJS оптимизирует повторную оценку видимости:

  • переиспользование bounding volumes
  • кэш frustum checks
  • пакетная проверка точек в коллекциях

Это уменьшает стоимость пересчёта видимости при каждом кадре.


Итоговая модель принятия решения о видимости

Каждая точка проходит последовательную цепочку фильтров:

  1. Преобразование координат
  2. Frustum culling
  3. Distance-based filtering
  4. Depth testing
  5. Tile/LOD evaluation
  6. Screen-space thresholding
  7. Blending and postprocessing

Любой этап может привести к исключению точки из финального кадра, даже если она геометрически присутствует в сцене.