Метод 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 и метод вычисления поля минимальной площади, содержащего набор плоских точек - для этого я использую метод вращающегося штангенциркуля.