Particle systems

CesiumJS предоставляет систему частиц как высокопроизводительный механизм для визуализации динамических эффектов в геопространственной сцене. ParticleSystem реализован как GPU-ориентированный конвейер, в котором каждая частица представляет собой billboard-элемент с индивидуальными параметрами движения, цвета, масштаба и времени жизни. В отличие от классических CPU-симуляций, здесь обновление состояния частиц максимально переносится на графический процессор, что позволяет обрабатывать десятки и сотни тысяч частиц в реальном времени.

Система частиц в Cesium строится вокруг объекта ParticleSystem, который добавляется в сцену через scene.primitives.add. Каждая система инкапсулирует набор параметров генерации, физики и рендеринга.

Ключевая особенность архитектуры заключается в разделении:

  • генерации частиц (emission)
  • симуляции движения (simulation)
  • визуализации (rendering)

Генерация происходит через эмиттеры (emitters), которые определяют начальные условия появления частиц. Симуляция опирается на временную шкалу и набор физических параметров, таких как скорость, ускорение и внешние силы. Визуализация осуществляется через билборды с альфа-блендингом.

Базовая структура ParticleSystem

Основной конструктор принимает объект параметров, в котором задаются характеристики частиц:

  • image — текстура частицы (дым, огонь, искры)
  • startColor / endColor — интерполяция цвета во времени жизни
  • startScale / endScale — изменение размера
  • minimumParticleLife / maximumParticleLife — диапазон времени жизни
  • minimumSpeed / maximumSpeed — диапазон скорости
  • emissionRate — количество испускаемых частиц в секунду
  • imageSize — базовый размер спрайта
  • updateCallback — функция пользовательской физики

Система частиц обновляется на каждом кадре сцены, где каждая частица проходит этапы инициализации, интеграции и рендеринга.

Эмиттеры частиц

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

BoxEmitter

Генерация частиц внутри параллелепипеда. Используется для объемных источников дыма или взрывов.

  • равномерное распределение по объему
  • контроль размеров области эмиссии

SphereEmitter

Генерация внутри сферы или на её поверхности. Применяется для взрывных эффектов и радиальных всплесков.

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

ConeEmitter

Генерация в пределах конуса. Наиболее часто используется для реактивных струй, огня двигателя и направленных потоков.

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

Эмиттер передается через свойство emitter:

emitter: new Cesium.ConeEmitter(Cesium.Math.toRadians(25))

Физическая модель движения частиц

Каждая частица имеет вектор скорости и позицию, которые обновляются каждый кадр. Базовая модель включает:

  • линейную скорость
  • затухание (drag)
  • внешние силы (gravity, wind)
  • пользовательские модификаторы через updateCallback

Пример пользовательского обновления:

updateCallback: function(particle, dt) {
    particle.velocity.z -= 9.8 * dt;
}

Это позволяет вводить произвольные физические эффекты без изменения ядра системы.

Управление временем жизни

Каждая частица имеет параметр life, который уменьшается на каждом кадре. После достижения нуля частица уничтожается и заменяется новой.

Диапазон задается через:

  • minimumParticleLife
  • maximumParticleLife

Это создает стохастическую вариативность поведения системы, предотвращая визуальную монотонность.

Цвет и масштабирование во времени

Один из ключевых механизмов выразительности — интерполяция параметров:

  • startColorendColor
  • startScaleendScale

Cesium интерполирует значения линейно по нормализованному времени жизни частицы.

Типичный эффект:

  • яркое появление
  • постепенное потемнение
  • уменьшение прозрачности

Рендеринг и прозрачность

Частицы рендерятся как billboard-спрайты с включенным альфа-блендингом. Используются режимы смешивания:

  • additive blending — для огня, искр, энергии
  • alpha blending — для дыма и тумана

Правильная настройка material и текстуры критична для корректного визуального результата.

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

GPU-оптимизация и производительность

Система частиц оптимизирована под GPU, однако производительность зависит от нескольких факторов:

  • общее количество частиц
  • размер текстур
  • сложность updateCallback
  • частота эмиссии

Рекомендации архитектурного уровня:

  • минимизировать использование тяжелых JS-вычислений в updateCallback
  • использовать текстуры-атласы для уменьшения переключений ресурсов
  • ограничивать emissionRate в плотных сценах
  • избегать избыточного overlap прозрачных частиц

GPU-симуляция позволяет держать высокую плотность частиц без значительной нагрузки на CPU, однако bottleneck часто возникает на стадии overdraw в пиксельном шейдере.

Пространственная привязка к сцене

ParticleSystem может быть привязан к координатной системе сцены через modelMatrix. Это позволяет:

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

Пример логики привязки:

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

Динамическое управление системой

ParticleSystem поддерживает изменение параметров в реальном времени:

  • изменение emissionRate для усиления или ослабления эффекта
  • динамическая замена emitter для смены типа поведения
  • переключение текстур для разных стадий эффекта (дым → пепел)

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

  • старт взрыва
  • фаза расширения
  • рассеивание дыма

Частицы и взаимодействие с окружающей средой

Хотя базовая система не включает полноценную физику столкновений, возможно расширение через:

  • кастомный updateCallback
  • анализ высоты terrain
  • проверку глубины сцены

Типичный сценарий — ограничение движения частиц по высоте поверхности земли, что позволяет им «оседать» на рельефе.

Композиция сложных эффектов

Реалистичные эффекты редко строятся одной системой частиц. Обычно применяется композиция:

  • отдельная система для огня
  • отдельная для дыма
  • отдельная для искр
  • дополнительная система для светового ореола

Каждая система имеет независимые параметры жизни и эмиссии, но синхронизируется по времени запуска.

Работа с текстурами частиц

Качество визуализации напрямую зависит от выбора изображения частицы:

  • мягкие градиенты подходят для дыма
  • резкие контрастные формы — для искр
  • анимированные спрайт-листы — для сложных эффектов пламени

Поддерживается использование PNG с альфа-каналом, что позволяет формировать сложные полупрозрачные структуры без дополнительных вычислений.

Ограничения и особенности поведения

Система частиц имеет ряд архитектурных ограничений:

  • отсутствие полноценной rigid-body физики
  • ограниченная коллизия с объектами сцены
  • зависимость качества от fill-rate GPU
  • необходимость ручной балансировки параметров для стабильного FPS

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