Когда использовать Binary Space Partitioning, Quadtree, Octree?

Недавно я узнал о деревьях разделения двоичного пространства и их применении в трехмерной графике и обнаружении столкновений. Я также вкратце просмотрел материал, относящийся к квадродеревьям и октодеревьям. Когда бы вы использовали квадродеревья вместо bsp-деревьев или наоборот? Они взаимозаменяемы? Я был бы удовлетворен, если бы у меня было достаточно информации, чтобы заполнить такую ​​таблицу:

            | BSP | Quadtree | Octree
------------+----------------+-------
Situation A |  X  |          |
Situation B |     |     X    |
Situation C |     |          |   X

Что такое A, B и C?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
76
0
39 994
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

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

Обычно на эти вопросы нет однозначного ответа. Я бы предположил, что A, B и C являются результатом функции размера вашего пространства и количества вещей, которые вы различаете.

Уточните, подойдет ли BSP для большого или маленького помещения? Больше или меньше предметов?

Martin 19.09.2008 09:31

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

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

BSP лучше всего подходит для городских условий.

Quadtree лучше всего подходит, когда вы используете карту высот для местности и т. д.

Octree лучше всего подходит, когда у вас есть сгустки геометрии в трехмерном пространстве, например, в солнечной системе.

BSP - хороший вариант для ускорения обнаружения столкновений, в зависимости от того, какой вариант вы используете. Они особенно быстры в точечных и линейных или лучевых тестах, несколько менее быстрые и немного более сложные для объектов с объемом.

Что касается их использования в графике, то BSP в значительной степени устарели. Октодеревья хорошо работают для таких вещей, как грубая выборка видимости, как и деревья AABB.

Ответ принят как подходящий

На ваш вопрос нет однозначного ответа. Это полностью зависит от того, как организованы ваши данные.

Что нужно иметь в виду:

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

Октодеревья и BVH (иерархии граничных объемов) выигрывают, если данные трехмерны. Это также очень хорошо работает, если ваши геометрические объекты сгруппированы в трехмерном пространстве. (см. Octree против BVH) (заархивировано из оригинал)

Преимущество Oc- и Quadtrees в том, что вы можете прекратить генерировать деревья в любое время. Если вы хотите визуализировать графику с помощью графического ускорителя, он позволяет вам просто генерировать деревья на уровне объекта и отправлять каждый объект в одном вызове отрисовки в графический API. Это выполняет много лучше, чем отправка отдельных треугольников (что вам нужно сделать, если вы используете BSP-Trees в полной мере).

BSP-деревья - это действительно особый случай. Они очень хорошо работают в 2D и 3D, но создание хороших BSP-деревьев - это само по себе искусство. У BSP-деревьев есть недостаток, заключающийся в том, что вам, возможно, придется разделить вашу геометрию на более мелкие части. Это может увеличить общее количество полигонов в вашем наборе данных. Они хороши для рендеринга, но намного лучше для обнаружения столкновений и трассировки лучей.

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

Кстати, именно поэтому они были так популярны 10 лет назад. Quake использовал их, потому что это позволяло графическому движку / программному растеризатору не использовать дорогостоящий z-буфер.

Все упомянутые деревья - это просто семейства деревьев. Существуют также свободные октодеревья, гибридные деревья kd-деревьев и множество других связанных структур.

Хороший ответ, хотя я не совсем понимаю, что вы подразумеваете под «отправкой» объекта в GPU вместо отдельных треугольников. Вы имеете в виду VBO против немедленного режима? Я подумал, потому что это можно сделать с помощью обоих подходов ...

Aktau 07.07.2012 01:52

@DavidJeske Этому ответу шесть лет. Давно в информатике. Возможно, сейчас это изменилось.

Nils Pipenbrinck 23.10.2014 01:41

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

David Jeske 23.10.2014 01:41

BSP на самом деле, я имею в виду В самом деле, плохи для любой современной сцены. Они были потрясающими в те времена, когда нужно было сортировать несколько треугольников. Очевидно, что в настоящее время небольшая перерисовка (даже с использованием хардкорных шейдеров фрагментов) выполняется на путь быстрее, чем сортировка и отрисовка каждого треугольника в сцене по отдельности. Отрисовка z-preass устраняет все перерисовки и выполняется быстрее на Все еще.

RecursiveExceptionException 06.11.2016 22:32

Самая большая практическая разница между BSP-деревьями и другими видами 3D-деревьев состоит в том, что BSP-деревья могут быть более оптимальными, но работают только с геометрией статический. Это связано с тем, что BSP-деревья, как правило, строятся очень медленно, и для типичного статичного городского уровня игры часто требуются часы или дни.

Две основные причины, по которым BSP-деревья строятся дольше: (а) они используют не выровненные по оси плоскости разделения, которые требуют больше времени для оптимального поиска, и (б) они разделяют геометрию на границах осей, гарантируя, что никакие объекты не пересекают плоскости разделения.

Другие типы 3D-деревьев (Octrees, Quadtrees, kd-tree, Bounding-Volume-Hierarchy) используют выровненные по оси ограничивающие объемы, и объемам (необязательно) разрешено перекрытие, поэтому содержащиеся в нем объекты не нужно разрезать по объему. границы. Они оба делают деревья менее оптимальными, чем BSP-деревья, но быстрее строятся и легче заменяются для динамических объектов.

Экстраполируя эти факторы на ситуации ...

Наружные территории обычно используют изображения земли на основе поля высот, либо простые карты высот, либо более сложные методы гео-мип-карт, такие как ROAM. Сама земля не участвует в трехмерном разбиении пространства, только объекты, размещенные на земле.

Миры с множеством экземпляров более простой и похожей геометрии (дома, деревья, астероиды и т. д.) Часто будут использовать не-BSP-дерево (например, BVH), потому что размещение геометрии в BSP-дереве будет означать дублирование и разделение детализировать геометрию для каждого экземпляра.

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

См. Также: Octree против BVH (заархивировано из оригинал), Учебное пособие по иерархии ограничивающих объемов, Учебник BSP.

@rjdkolb Я установил его на новое место, если вам все еще интересно.

Bart 08.09.2016 10:38

Если вы не знаете, что делаете, всегда выбирайте октодеревья, чтобы перестать сосредотачиваться на переоптимизации и начать работать над более серьезными функциями. Серьезно, узкие места всегда будут где-то еще, или вы разрабатываете свой код вокруг оптимизированной системы, которая в конечном итоге предотвращает определенные типы изменений позже.

Другие вопросы по теме