Создание OOBB из точек - PullRequest
       34

Создание OOBB из точек

16 голосов
/ 31 мая 2011

Как я могу создать минимальный OOBB для заданных баллов?Создать AABB или сферу очень легко, но у меня проблемы с созданием минимального OOBB.

[править]

Первый ответ не дал мне хороших результатов.У меня нет огромного облака очков.У меня мало очков.Я делаю генерацию геометрии столкновения.Например, куб имеет 36 точек (6 сторон, 2 треугольника в каждом, 3 точки в каждом треугольнике).И алгоритм из первого поста дал плохие результаты для куба.Пример точек для куба: http://nopaste.dk/download/3382 (должен возвращать ось идентичности)

Ответы [ 3 ]

15 голосов
/ 04 июня 2011

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

Возможно, если вы заранее знаете, что объект является, например, кубом, вы можете использовать специализированный метод и использовать PCA для всего остального.

С другой стороны, если вы хотите вычислить истинный OBB, существуют существующие реализации, которые вы можете использовать, например. http://www.geometrictools.com/LibMathematics/Containment/Containment.html (в частности http://www.geometrictools.com/LibMathematics/Containment/Wm5ContMinBox3.cpp). Я полагаю, что это реализует алгоритм, упомянутый в комментариях к вашему вопросу.

Цитата с этой страницы:

Файлы ContMinBox3 реализуют алгоритм для вычисления коробка минимального объема, содержащая точки. Этот метод вычисляет выпуклая оболочка из точек, выпуклая многогранник. Коробка минимального объема либо лицо совпадает с грань выпуклого многогранника или имеет направления оси, заданные тремя взаимно перпендикулярные края выпуклый многогранник. Каждое лицо выпуклый многогранник обрабатывается проецируя многогранник на плоскость лица, вычисляя прямоугольник минимальной площади, содержащий прогнозы и вычисление интервал минимальной длины, содержащий проекции на перпендикуляр лицо. Прямоугольник минимальной площади и интервал минимальной длины объединить в сформировать ящик кандидата. Тогда все троек ребер выпуклого многогранника обработанный. Если любая тройка имеет взаимно перпендикулярные края, самая маленькая коробка с осями в направлениях края вычисляются. Из всех этих коробок тот с наименьшим объемом поле минимального объема, содержащее исходный набор точек.

Если, как вы говорите, ваши объекты не имеют большого количества вершин, время выполнения должно быть приемлемым.

В обсуждении на http://www.gamedev.net/topic/320675-how-to-create-oriented-bounding-box/ автор вышеуказанной библиотеки проливает свет на эту тему:

Подход Gottschalk к построению OBB состоит в том, чтобы вычислить ковариационную матрицу для набора точек. Собственные векторы этой матрицы являются осями OBB. Среднее количество баллов - центр OBB. OBB не гарантирует минимальный объем всех содержащих ящиков. Дерево OBB строится путем рекурсивного разбиения треугольной сетки, вершинами которой являются множество точек. Несколько пара эвристик упоминаются для разделения.

Поле минимального объема (MVB), содержащее набор точек, - это поле минимального объема, содержащее выпуклую оболочку точек. Корпус представляет собой выпуклый многогранник. Основываясь на результатах Джо О'Рурка, MVB поддерживается гранью многогранника или тремя перпендикулярными ребрами многогранника. «Поддерживается гранью» означает, что у MVB грань совпадает с гранью многогранника. «Поддерживается тремя перпендикулярными ребрами» означает, что три перпендикулярных ребра MVB ​​совпадают с ребрами многогранника.

Как указывает jyk, реализации любого из этих алгоритмов не тривиальны. Тем не менее, никогда не позволяйте этому отговорить вас от попыток :) AABB может хорошо подойти, но он также может быть очень плохим. Рассмотрим «тонкий» цилиндр с конечными точками в (0,0,0) и (1,1,1) [представьте, что цилиндр - это отрезок, соединяющий точки]. AABB - это 0 <= x <= 1, 0 <= y <= 1 и 0 <= z <= 1, с объемом 1. MVB имеет центр (1,1,1) / 2, ось (1,1,1) / sqrt (3), и степень для этой оси sqrt (3) / 2. У него также есть две дополнительные оси, перпендикулярные первой оси, но экстенты равны 0. Объем этого поля равен 0. Если вы дадите отрезку линии небольшую толщину, MVB станет немного больше, но все равно имеет объем, намного меньший, чем что из AABB. </p>

Какой тип ящика вы выберете, зависит от данных вашего собственного приложения.

Реализация всего этого находится на моем сайте www.geometrictools.com.Я использую эвристику медианного разбиения для деревьев ограничивающего объема.Для построения MVB требуются выпуклый искатель корпуса в 2D, выпуклый искатель корпуса в 3D и метод вычисления поля минимальной площади, содержащего набор плоских точек - для этого я использую метод вращающегося штангенциркуля.

10 голосов
/ 31 мая 2011

Сначала вы должны вычислить центр тяжести точек в псевдокоде

mu = sum(0..N, x[i]) / N

, затем вы должны вычислить ковариационную матрицу

C = sum(0..N, mult(x[i]-mu, transpose(x[i]-mu)));

Обратите внимание, что мульт выполняет (3x1) умножение матрицы на (1x3) умножение матрицы, и в результате получается матрица 3x3.

Собственные векторы матрицы C определяют три оси OBB.

5 голосов
/ 10 декабря 2014

В C ++ появилась новая библиотека ApproxMVBB, которая вычисляет аппроксимацию для ограничивающей рамки минимального объема . Он выпущен под лицензией MPL 2.0 и написан мной.

Если у вас есть время, посмотрите на: http://gabyx.github.io/ApproxMVBB/

Библиотека совместима с C ++ 11 и требует только Eigen http://eigen.tuxfamily.org. Тесты показывают, что аппроксимация для 140 миллионов точек в 3D может быть рассчитана за разумное время (около 5-7 секунд) в зависимости от настроек аппроксимации.

...