stringtranslate.com

Двоичное разбиение пространства

Процесс создания BSP-дерева

В информатике двоичное разбиение пространства ( BSP ) — это метод разбиения пространства , который рекурсивно подразделяет евклидово пространство на два выпуклых множества , используя гиперплоскости в качестве разбиений. Этот процесс разбиения приводит к представлению объектов в пространстве в виде древовидной структуры данных, известной как дерево BSP .

Двоичное разбиение пространства было разработано в контексте 3D компьютерной графики в 1969 году. [1] [2] Структура дерева BSP полезна при рендеринге , поскольку она может эффективно предоставлять пространственную информацию об объектах в сцене, например, объекты, упорядоченные спереди назад по отношению к зрителю в заданном месте. Другие приложения BSP включают: выполнение геометрических операций с фигурами ( конструктивная сплошная геометрия ) в САПР , [3] обнаружение столкновений в робототехнике и 3D видеоиграх, трассировку лучей , моделирование виртуального ландшафта, [4] и другие приложения, которые включают обработку сложных пространственных сцен.

История

Обзор

Пример рекурсивного бинарного разбиения пространства квадродерева для двумерного индекса.

Бинарное разбиение пространства — это общий процесс рекурсивного деления сцены на две части до тех пор, пока разбиение не удовлетворит одному или нескольким требованиям. Его можно рассматривать как обобщение других пространственных древовидных структур, таких как k -d деревья и квадродеревья , где гиперплоскости, разделяющие пространство, могут иметь любую ориентацию, а не быть выровненными с осями координат, как в k -d деревьях или квадродеревьях. При использовании в компьютерной графике для рендеринга сцен, состоящих из плоских полигонов , плоскости разбиения часто выбираются так, чтобы совпадать с плоскостями, определяемыми полигонами в сцене.

Конкретный выбор плоскости разбиения и критерий завершения процесса разбиения варьируются в зависимости от цели BSP-дерева. Например, при рендеринге компьютерной графики сцена делится до тех пор, пока каждый узел BSP-дерева не будет содержать только полигоны, которые могут быть отрисованы в произвольном порядке. При использовании отбраковки задних граней каждый узел, таким образом, содержит выпуклый набор полигонов, тогда как при рендеринге двухсторонних полигонов каждый узел BSP-дерева содержит только полигоны в одной плоскости. При обнаружении столкновений или трассировке лучей сцена может быть разделена на примитивы, на которых тесты на столкновение или пересечение лучей являются простыми.

Бинарное разбиение пространства возникло из компьютерной графики, требующей быстрой отрисовки трехмерных сцен, состоящих из полигонов. Простым способом рисования таких сцен является алгоритм художника , который создает полигоны в порядке удаления от зрителя, сзади вперед, закрашивая фон и предыдущие полигоны каждым более близким объектом. Этот подход имеет два недостатка: время, необходимое для сортировки полигонов в порядке сзади вперед, и возможность ошибок в перекрывающихся полигонах. Фукс и соавторы [2] показали, что построение BSP-дерева решило обе эти проблемы, предоставив быстрый метод сортировки полигонов относительно заданной точки обзора (линейной по количеству полигонов в сцене) и разделив перекрывающиеся полигоны, чтобы избежать ошибок, которые могут возникнуть с алгоритмом художника. Недостатком бинарного разбиения пространства является то, что генерация BSP-дерева может занять много времени. Обычно он выполняется один раз на статической геометрии, как предварительный этап расчета, перед рендерингом или другими операциями в реальном времени на сцене. Расходы на построение дерева BSP затрудняют и делают неэффективным непосредственное внедрение движущихся объектов в дерево.

Поколение

Каноническое использование BSP-дерева — для рендеринга полигонов (двусторонних, то есть без отсечения задней грани ) с помощью алгоритма художника. Каждый полигон обозначается передней и задней сторонами, которые могут быть выбраны произвольно и влияют только на структуру дерева, но не на требуемый результат. [2] Такое дерево строится из несортированного списка всех полигонов в сцене. Рекурсивный алгоритм построения BSP-дерева из этого списка полигонов: [2]

  1. Выберите многоугольник P из списка.
  2. Создайте узел N в дереве BSP и добавьте P в список полигонов в этом узле.
  3. Для каждого другого полигона в списке:
    1. Если этот многоугольник полностью находится перед плоскостью, содержащей P , переместите этот многоугольник в список узлов перед P.
    2. Если этот многоугольник полностью находится позади плоскости, содержащей P , переместите этот многоугольник в список узлов позади P.
    3. Если этот многоугольник пересекается плоскостью, содержащей P , разделите его на два многоугольника и переместите их в соответствующие списки многоугольников позади и перед P.
    4. Если этот многоугольник лежит в плоскости, содержащей P , добавьте его в список многоугольников в узле N.
  4. Применим этот алгоритм к списку полигонов перед P.
  5. Применим этот алгоритм к списку полигонов позади P.

Следующая диаграмма иллюстрирует использование этого алгоритма при преобразовании списка линий или полигонов в дерево BSP. На каждом из восьми шагов (i.-viii.) алгоритм выше применяется к списку линий, и к дереву добавляется один новый узел.

Конечное число полигонов или линий в дереве часто больше (иногда намного больше [2] ), чем исходный список, поскольку линии или полигоны, пересекающие плоскость разбиения, должны быть разделены на две части. Желательно минимизировать это увеличение, но также поддерживать разумный баланс в конечном дереве. Поэтому выбор того, какой полигон или линия используются в качестве плоскости разбиения (на шаге 1 алгоритма), важен для создания эффективного дерева BSP.

Прохождение

Дерево BSP обходит за линейное время в порядке, определяемом конкретной функцией дерева. Снова используя пример рендеринга двусторонних полигонов с использованием алгоритма художника, для правильного рисования полигона P требуется, чтобы сначала были нарисованы все полигоны за плоскостью, в которой лежит P , затем полигон P , затем, наконец, полигоны перед P . Если этот порядок рисования выполняется для всех полигонов в сцене, то вся сцена отображается в правильном порядке. Эту процедуру можно реализовать путем рекурсивного обхода дерева BSP с использованием следующего алгоритма. [2] Из заданного местоположения просмотра V , чтобы отрисовать дерево BSP,

  1. Если текущий узел является конечным узлом, визуализируйте полигоны в текущем узле.
  2. В противном случае, если точка просмотра V находится перед текущим узлом:
    1. Визуализируйте дочернее дерево BSP, содержащее полигоны позади текущего узла.
    2. Визуализация полигонов в текущем узле
    3. Визуализируйте дочернее дерево BSP, содержащее полигоны перед текущим узлом.
  3. В противном случае, если точка просмотра V находится позади текущего узла:
    1. Визуализируйте дочернее дерево BSP, содержащее полигоны перед текущим узлом.
    2. Визуализация полигонов в текущем узле
    3. Визуализируйте дочернее дерево BSP, содержащее полигоны позади текущего узла.
  4. В противном случае точка просмотра V должна находиться точно на плоскости, связанной с текущим узлом. Тогда:
    1. Визуализируйте дочернее дерево BSP, содержащее полигоны перед текущим узлом.
    2. Визуализируйте дочернее дерево BSP, содержащее полигоны позади текущего узла.

Рекурсивное применение этого алгоритма к сгенерированному выше дереву BSP приводит к следующим шагам:

Дерево обходит за линейное время и отображает полигоны в порядке от дальнего к ближнему ( D1 , B1 , C1 , A , D2 , B2 , C2 , D3 ), подходящем для алгоритма художника.

Приложение

BSP-деревья часто используются в 3D- видеоиграх , особенно в шутерах от первого лица и в играх с внутренним окружением. Игровые движки, использующие BSP-деревья, включают Doom (id Tech 1) , Quake (вариант id Tech 2) , GoldSrc и Source . В них BSP-деревья, содержащие статическую геометрию сцены, часто используются вместе с Z-буфером для корректного объединения подвижных объектов, таких как двери и персонажи, на фоновой сцене. Хотя двоичное разделение пространства обеспечивает удобный способ хранения и извлечения пространственной информации о полигонах в сцене, оно не решает проблему определения видимой поверхности . BSP-деревья также применялись для сжатия изображений. [5]

Смотрите также

Ссылки

  1. ^ ab Schumacker, RA; Brand, B.; Gilliland, MG; Sharp, WH (1969). Исследование применения изображений, созданных на компьютере, к визуальному моделированию (отчет). Лаборатория кадровых ресурсов ВВС США. AFHRL-TR-69-14.
  2. ^ abcdefg Фукс, Генри; Кедем, Цви. М.; Нейлор, Брюс Ф. (1980). «О генерации видимых поверхностей априорными древовидными структурами» (PDF) . SIGGRAPH '80 Труды 7-й ежегодной конференции по компьютерной графике и интерактивным технологиям . ACM. стр. 124–133. doi :10.1145/965105.807481.
  3. ^ ab Тибо, Уильям К.; Нейлор, Брюс Ф. (1987). «Операции над множествами на многогранниках с использованием деревьев двоичного разбиения пространства». SIGGRAPH '87 Труды 14-й ежегодной конференции по компьютерной графике и интерактивным технологиям . ACM. стр. 153–162. doi :10.1145/37402.37421.
  4. ^ Этерингтон, Томас Р.; Морган, Фрейзер Дж.; О'Салливан, Дэвид (2022). «Двоичное разбиение пространства генерирует иерархические и прямолинейные нейтральные модели ландшафта, подходящие для ландшафтов, в которых доминирует человек». Landscape Ecology . 37 (7): 1761–1769. Bibcode : 2022LaEco..37.1761E. doi : 10.1007/s10980-022-01452-6 .
  5. ^ Х. Радха, М. Веттерли и Р. Леонарди, «Сжатие изображений с использованием деревьев двоичного разбиения пространства», в IEEE Transactions on Image Processing , т. 5, № 12, стр. 1610-1624, декабрь 1996 г., doi: 10.1109/83.544569.

Дополнительные ссылки

Внешние ссылки