Введение
График сцены — это общая структура данных, широко используемая в приложениях для векторной графики и современных компьютерных играх, которая организует логическое и часто пространственное представление графической сцены. Это совокупность узлов, объединенных в структуру графа или дерева. Узел дерева может иметь несколько дочерних узлов, но только одного родительского, при этом эффект, примененный к родителю, распространяется на все его дочерние узлы; операция, выполненная над группой, автоматически применяется ко всем её элементам. Во многих программах эффективным и естественным способом обработки таких операций является связывание матрицы геометрического преобразования (см. также преобразование и матрица) с каждым уровнем группы и последовательное перемножение этих матриц. Распространенной функцией, например, является возможность объединять связанные фигуры и объекты в составной объект, которым затем можно манипулировать так же легко, как и отдельным объектом.
Графики сцен в инструментах редактирования графики
В векторной графике каждый листовой узел в графике сцены представляет собой некую атомарную единицу документа, обычно фигуру, такую как эллипс или кривая Безье. Хотя сами фигуры (особенно кривые) могут быть дополнительно разложены на узлы, например, узлы сплайна, практичнее рассматривать график сцены как состоящий из фигур, а не переходить на более низкий уровень представления. Еще одной полезной концепцией, ориентированной на пользователя, является слой. Слой действует как прозрачный лист, на который можно поместить любое количество фигур и групп фигур. Документ, таким образом, становится набором слоев, каждый из которых можно удобно сделать невидимым, затемнить или заблокировать (сделать доступным только для чтения). Некоторые приложения располагают все слои в линейном списке, в то время как другие поддерживают слои внутри слоев на любую желаемую глубину. Внутренне между слоями и группами может не быть никакой реальной структурной разницы, поскольку они оба являются просто узлами графика сцены. Если различия необходимы, распространенным способом объявления типа в C++ будет создание общего класса узлов, а затем вывод классов слоев и групп из этого класса. Например, член, определяющий видимость, будет являться характеристикой слоя, но необязательно группы.
Графики сцен в играх и 3D-приложениях
Сцена графов полезна для современных игр, использующих 3D-графику и всё более масштабные миры или уровни. В таких приложениях узлы в сцене графа (как правило) представляют собой сущности или объекты в сцене. Например, игра может определить логическую связь между рыцарем и лошадью, так что рыцарь рассматривается как продолжение лошади. В сцене графе будет узел "лошадь" с присоединённым к нему узлом "рыцарь". Сцена граф также может описывать пространственные, а также логические отношения между различными сущностями: рыцарь перемещается в 3D-пространстве вместе с лошадью. В этих крупных приложениях требования к памяти являются ключевым фактором при проектировании сцены графа. По этой причине многие крупные системы сцен графов используют инстанцирование геометрии для снижения затрат памяти и повышения производительности. В нашем примере выше каждый рыцарь является отдельным узлом сцены, но графическое представление рыцаря (состоящее из 3D-сетки, текстур, материалов и шейдеров) инстанцируется. Это означает, что хранится только одна копия данных, на которую затем ссылаются все узлы "рыцаря" в сцене графе. Это позволяет уменьшить объём используемой памяти и повысить скорость, поскольку при создании нового узла рыцаря данные о внешнем виде не требуется дублировать.
Реализация графиков сцен
Самая простая форма графа сцен использует структуру данных в виде массива или связанного списка, а отображение его объектов заключается в последовательной линейной итерации по узлам. Другие распространенные операции, такие как проверка пересечения объектов с указателем мыши, также выполняются посредством линейного поиска. Для небольших графов сцен этого обычно бывает достаточно.
Операции и отправка графиков сцены
Применение операции к графу сцены требует способа диспетчеризации операции в зависимости от типа узла. Например, при рендеринге узел группы преобразований будет накапливать своё преобразование посредством умножения матриц, смещения векторов, кватернионов или углов Эйлера. После этого листовой узел отправляет объект на рендеринг. Некоторые реализации могут отрисовывать объект напрямую, вызывая базовый API рендеринга, такой как DirectX или OpenGL. Однако, поскольку базовая реализация API рендеринга обычно обладает низкой переносимостью, можно разделить граф сцены и системы рендеринга. Для реализации такой диспетчеризации можно использовать несколько различных подходов. В объектно-ориентированных языках, таких как C++, это можно легко реализовать с помощью виртуальных функций, каждая из которых представляет операцию, которую можно выполнить над узлом. Виртуальные функции просты в написании, но обычно невозможно добавить новые операции к узлам без доступа к исходному коду. В качестве альтернативы можно использовать шаблон "Посетитель". Он имеет схожий недостаток – также сложно добавлять новые типы узлов. Другие методы включают использование RTTI (Run Time Type Information). Операцию можно реализовать как класс, который передаётся текущему узлу; затем он запрашивает тип узла с помощью RTTI и ищет соответствующую операцию в массиве обратных вызовов или функторов. Это требует инициализации отображения типов в обратные вызовы или функторы во время выполнения, но обеспечивает большую гибкость, скорость и расширяемость. Существуют вариации этих методов, и новые подходы могут предложить дополнительные преимущества. Одной из альтернатив является перестроение графа сцены, когда граф сцены перестраивается для каждой выполняемой операции. Это, однако, может быть очень медленным, но приводит к созданию высокооптимизированного графа сцены. Это демонстрирует, что хорошая реализация графа сцены сильно зависит от области применения.
Проходные
Обходы являются ключом к возможностям применения операций к графам сцены. Обход обычно состоит из начала с какого-либо произвольного узла (часто корня графа сцены), применения операции (или операций) – часто операции обновления и рендеринга применяются последовательно, – и рекурсивного перемещения вниз по графу сцены (дереву) к дочерним узлам, пока не будет достигнут листовой узел. В этот момент многие движки графов сцены затем возвращаются вверх по дереву, применяя аналогичную операцию. Например, рассмотрим операцию рендеринга, учитывающую преобразования: при рекурсивном обходе иерархии графа сцены вызывается операция предварительного рендеринга. Если узел является узлом преобразования, он добавляет собственное преобразование к текущей матрице преобразований. После завершения обхода всех дочерних узлов, вызывается операция последующего рендеринга узла, чтобы узел преобразования мог отменить преобразование. Такой подход значительно снижает необходимое количество умножений матриц. Некоторые операции с графом сцены на самом деле более эффективны, когда узлы обходятся в другом порядке – для этого некоторые системы реализуют перестройку графа сцены, чтобы изменить порядок узлов в графе сцены для упрощения анализа или представления в виде дерева. Например, в 2D-случаях графы сцены обычно отрисовывают себя, начиная с корневого узла дерева и рекурсивно отрисовывая дочерние узлы. Листья дерева представляют собой объекты, находящиеся на переднем плане. Поскольку отрисовка происходит сзади наперед, при этом ближние объекты просто перекрывают дальние, этот процесс известен как использование алгоритма художника. В 3D-системах, которые часто используют буфер глубины, более эффективно сначала отрисовывать ближние объекты, поскольку для дальних объектов часто требуется только проверка глубины, а не фактический рендеринг, поскольку они перекрываются ближними объектами.
Графики сцены и иерархии граничных объемов (BVH)
Иерархии ограничивающих объемов (BVH) полезны для множества задач, включая эффективную отсечку и ускорение обнаружения столкновений между объектами. BVH – это пространственная структура, но она не обязательно должна разделять геометрию (см. пространственное разделение ниже). BVH представляет собой дерево ограничивающих объемов (часто сфер, ограничивающих ящиков, выровненных по осям, или ориентированных ограничивающих ящиков). В нижней части иерархии размер объема достаточно мал, чтобы плотно охватывать один объект (или, возможно, даже небольшую часть объекта в BVH высокого разрешения). При подъеме по иерархии каждый узел имеет собственный объем, который плотно охватывает все объемы, находящиеся под ним. В корне дерева находится объем, охватывающий все объемы в дереве (всю сцену). BVH полезны для ускорения обнаружения столкновений между объектами. Если ограничивающий объем объекта не пересекает объем, расположенный выше в дереве, он не может пересечь ни один объект ниже этого узла (следовательно, все они быстро отбрасываются). Существуют некоторые сходства между BVH и графами сцен. Граф сцены можно легко адаптировать для включения или преобразования в BVH, если каждый узел имеет связанный с ним объем или добавлен специально созданный «объект-ограничитель» в удобном месте в иерархии. Это может быть нетипичное представление графа сцены, но включение BVH в граф сцены имеет свои преимущества.
Графики сцены и пространственное разделение
Эффективным способом объединения пространственного разделения и графов сцен является создание узла-листа сцены, содержащего данные пространственного разделения. Это может повысить вычислительную эффективность рендеринга. Пространственные данные обычно статичны и, как правило, содержат данные неподвижных объектов сцены в некоторой разделенной форме. В некоторых системах системы и их рендеринг могут быть реализованы раздельно. Это допустимо, и ни один из подходов не имеет явных преимуществ. Особенно нежелательно, чтобы граф сцены содержался внутри системы пространственного разделения, поскольку граф сцены лучше рассматривать как более общую систему по отношению к пространственному разделению. Для очень больших сцен или графов сцен, генерируемых исключительно во время выполнения (как это происходит в программах трассировки лучей), требуется более автоматизированный способ определения групповых узлов. Трассировщик лучей, например, принимает описание сцены 3D-модели и строит внутреннее представление, разбивающее ее отдельные части на ограничивающие объемы (также называемые ограничивающими плоскостями). Эти объемы группируются иерархически, чтобы тесты на пересечение лучей (в рамках определения видимости) могли быть выполнены эффективно. Например, групповой объем, не пересекающийся с лучом от глаза, может полностью пропустить тестирование всех своих элементов. Аналогичная эффективность наблюдается и в 2D-приложениях. Если пользователь увеличил документ так, что на экране компьютера видна только его часть, а затем прокручивает его, полезно использовать ограничивающий прямоугольник (или, в этом случае, схему ограничивающего прямоугольника) для быстрого определения видимых элементов графа сцены и, следовательно, тех, которые действительно необходимо отрисовать. В зависимости от особенностей производительности отрисовки приложения, на дизайн графа сцены может существенно влиять необходимость повышения эффективности рендеринга. В 3D-играх, таких как Quake, широко используются деревья бинарного разделения пространства (BSP) для минимизации тестов видимости. Однако построение деревьев BSP по графам сцен дизайна занимает много времени, и их необходимо пересчитывать при изменении графа сцены дизайна, поэтому уровни, как правило, остаются статичными, а динамические объекты обычно не учитываются в схеме пространственного разделения. Графы сцен для плотных регулярных объектов, таких как карты высот и полигональные сетки, обычно используют квадродеревья и октадеревья, которые являются специализированными вариантами 3D-иерархии ограничивающих объемов. Поскольку карта высот сама по себе занимает объем в виде ящика, рекурсивное деление этого ящика на восемь подящиков (отсюда «окта» в октадереве) до достижения отдельных элементов карты высот является эффективным и естественным подходом. Квадродерево – это просто двумерное октадерево.
РОЖДЫ
PHIGS была первой коммерческой спецификацией графа сцены и стала стандартом ANSI в 1988 году. Разные реализации были предложены производителями оборудования Unix. Система 3D-графики HOOPS, по всей видимости, была первой коммерческой библиотекой графа сцены, предоставленной единственным поставщиком программного обеспечения. Она была разработана для работы с различными низкоуровневыми 2D и 3D интерфейсами, а первая крупная производственная версия (v3.0) была завершена в 1991 году.
СГИ
В 1991 году компания Silicon Graphics (SGI) выпустила OpenGL Performer, более известный как Performer, который стал основной системой сценографа для большинства продуктов SGI в дальнейшем. В 1992 году SGI выпустила IRIS Inventor 1.0 – высокоуровневый сценограф, построенный на основе Performer. За ним последовал Open Inventor в 1994 году, еще одна итерация высокоуровневого сценографа, построенная на более новых версиях Performer. Дополнительные библиотеки сценографов 3D можно найти в: Категория: 3D-сценографические API.
X3D
X3D — это свободно используемый открытый стандарт формата файлов и среды выполнения для представления и обмена 3D-сценами и объектами с использованием XML. Это стандартизированный ISO формат, предоставляющий систему хранения, получения и воспроизведения графического контента в реальном времени, внедренного в приложения, в рамках открытой архитектуры, поддерживающей широкий спектр областей применения и пользовательских сценариев.
Статьи
Бар Зив, Ави. "Сценографы: прошлое, настоящее и будущее"
Кэри, Рикк и Белл, Гэвин (1997). "Аннотированное справочное руководство по VRML 97"
Хелман, Джим; Рольф, Джон (1994). "IRIS Performer: высокопроизводительный многопроцессорный инструментарий для 3D-графики в реальном времени"
PEXTimes – "Неофициально, расширение PHIGS для X. Официально, PEX не являлся акронимом." Штраус, Пол (1993). "IRIS Inventor, набор инструментов для 3D-графики"
Carey, Rikk and Bell, Gavin (1997). "The Annotated VRML 97 Reference Manual"
Helman, Jim; Rohlf, John (1994). "IRIS Performer: A High Performance Multiprocessing Toolkit for Real Time 3D Graphics"
PEXTimes – "Unofficially, the PHIGS Extension to X. Officially, PEX was not an acronym." Strauss, Paul (1993). "IRIS Inventor, a 3D Graphics Toolkit"