ScenegraphLayer в Deck.gl представляет собой специализированный слой для рендеринга трёхмерных сцен, основанных на графе сцены (scene graph). Его ключевая задача — эффективное отображение сложных 3D-объектов, таких как модели формата glTF, с поддержкой трансформаций, анимаций и инстансинга. В отличие от более низкоуровневых слоёв, работающих с примитивами (линии, полигоны, точки), ScenegraphLayer оперирует готовыми иерархическими структурами, описывающими полноценные 3D-сцены.
ScenegraphLayer занимает промежуточный уровень между абстракцией данных и WebGL-рендерингом. Он опирается на инфраструктуру Deck.gl и связку с luma.gl для работы с шейдерами и GPU-ресурсами.
Основная концепция слоя заключается в следующем:
ScenegraphLayer особенно полезен при визуализации:
ScenegraphLayer ожидает структуру данных, где каждый объект представляет экземпляр сцены. Типичный набор полей включает координаты и трансформации.
Ключевые свойства данных:
position — координаты в пространстве [x, y, z];orientation — угол или кватернион поворота;scale — масштабирование объекта;Каждый элемент массива данных интерпретируется как отдельный экземпляр сцены, даже если используется одна и та же модель.
Сердцем ScenegraphLayer является параметр scenegraph. Он
задаёт структуру 3D-модели и может быть представлен:
Scenegraph включает:
Иерархическая структура позволяет корректно обрабатывать сложные модели, где части объекта имеют собственные координатные системы.
ScenegraphLayer наследует базовые свойства слоя Deck.gl и добавляет специализированные параметры.
Определяет 3D-модель, которая будет инстансироваться. Может быть разделяемым ресурсом между всеми объектами слоя.
Функция или поле данных, определяющее положение экземпляра:
Определяет ориентацию объекта. Поддерживаются различные форматы:
Задаёт масштабирование экземпляра сцены. Может быть:
Используется для модификации цвета материалов через шейдерные переопределения.
Внутренний механизм, позволяющий проигрывать анимации glTF-моделей. Используется при наличии animation clips внутри scenegraph.
ScenegraphLayer строится вокруг идеи instanced rendering, но с расширением на уровень сцены.
Процесс рендеринга включает этапы:
Загрузка scenegraph и его разбор на GPU-совместимые структуры.
Подготовка буферов для геометрии и материалов.
Для каждого экземпляра вычисляется матрица модели:
Применение матриц к узлам scenegraph.
Рендеринг всех экземпляров с минимизацией переключений состояния WebGL.
Особенность заключается в том, что иерархия узлов сохраняется, а трансформации применяются рекурсивно.
Наиболее распространённый сценарий использования ScenegraphLayer связан с форматом glTF.
При загрузке через loaders.gl:
glTF поддерживает:
ScenegraphLayer может использовать эти возможности при условии корректной подготовки сцены.
Deck.gl использует правостороннюю систему координат с ориентацией, совместимой с WebGL.
ScenegraphLayer комбинирует три уровня трансформаций:
Итоговая матрица вычисляется как произведение:
Особое значение имеет порядок умножения матриц, так как он влияет на итоговое положение объекта.
Одной из ключевых особенностей ScenegraphLayer является эффективная работа с большим количеством 3D-объектов.
Оптимизации включают:
При визуализации тысяч объектов, таких как деревья или автомобили, ScenegraphLayer обеспечивает значительное снижение нагрузки по сравнению с индивидуальным рендерингом каждого объекта.
ScenegraphLayer поддерживает анимационные клипы, встроенные в scenegraph.
Механизм включает:
Типы анимаций:
Анимации могут быть активированы глобально или на уровне отдельных экземпляров.
Возможности ScenegraphLayer расширяются через кастомные шейдеры WebGL.
Основные точки расширения:
Шейдерная кастомизация позволяет реализовывать эффекты:
ScenegraphLayer часто используется совместно с другими слоями Deck.gl:
Композиция слоёв позволяет строить многослойные сцены, где ScenegraphLayer отвечает за сложные объекты, а остальные слои — за вспомогательную геометрию и данные.
При работе с большими наборами данных важную роль играет стратегия LOD (Level of Detail).
Подходы включают:
Дополнительно применяется frustum culling — отсечение объектов вне области видимости камеры.
ScenegraphLayer используется в задачах, где требуется сочетание данных и сложной 3D-геометрии:
Каждый сценарий опирается на повторное использование моделей и высокую плотность данных.
Несмотря на высокую производительность, ScenegraphLayer имеет ряд ограничений:
Эффективность сильно зависит от оптимизации моделей до этапа загрузки в Deck.gl.
ScenegraphLayer интегрируется с системой камеры Deck.gl:
Положение камеры напрямую влияет на производительность из-за изменения числа видимых объектов, требующих рендеринга.
ScenegraphLayer поддерживает реактивную модель обновления:
Это позволяет использовать слой в динамических приложениях, где данные изменяются в реальном времени.