2013-07-25 2 views
3

Я просмотрел пару потоков о поиске точки пересечения между двумя OBB. Я до сих пор не понимаю, как найти ось наименьшего проникновения. Мне нужно найти ось наименьшего проникновения, которая, как мне кажется, также называется последней разделительной осью в статье Дэвида Эберли, чтобы выяснить, какую часть таблицы я должен использовать для вычисления точки пересечения. Это бумага и страницы, представляющие интерес, начинаются с 9 http://www.geometrictools.com/Documentation/DynamicCollisionDetection.pdf.
Итак, как мне найти ось наименьшего проникновения/последнюю разделительную ось?OBB-OBB Точка пересечения

ответ

2

Вещь в работе - Теорема о разделительной оси См. http://en.wikipedia.org/wiki/Hyperplane_separation_theorem.

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

Поскольку OBB имеют 6 граней, где 2 параллельны друг другу, у вас есть уникальные 3 нормальные для OBB.

Другие 3x3 для продуктов с крестом дают 3 + 3 + 3x3 = 16 нормалей для тестирования.

Проецируйте ваши два OBB на линии, определенные этими нормалями и точкой, например. Происхождение.

Если выступы перекрываются, у вас нет контакта (поэтому, «разделяя» оси).

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

Вам нужно будет сравнить перекрытие всех выступов и взять хотя бы один. Это будет ваша глубина перекрытия. Вычисление R - (R_0 + R_1) для каждой оси из таблицы 1 Эберли на стр. 7 должно делать трюк (просто обратите внимание, что общее деление L * L, которое осталось вне вершины страницы 6, должно быть выполнено, чтобы получить реальное перекрытие глубина).

пример кода на открытой динамики двигателя: http://sourceforge.net/p/opende/code/1939/tree/trunk/ode/src/box.cpp (игнорировать их fudge_factor если вы хотите строго, чтобы оси наименьшего перекрытия).

Физика пули имеет нечто похожее, я думаю.

+0

Большое спасибо за разъяснение! Я думал, что мне нужно проверять только 15 осей, но я знаю, что вы имели в виду. Поэтому просто чтобы убедиться, что мне нужно найти результат R- (R_0 + R_1)/(|| L || * || L ||). Другими словами я должен разделить R- (R_0 + R_1) на величину квадрата L, чтобы найти фактическое расстояние? – OctopusPrime314

+0

L - проверенная ось – OctopusPrime314

+0

Да, это должно быть правдой, по крайней мере, для первых 6 осей. Из затылка я думаю, что он должен быть таким же для остальных 9, но не стесняйтесь проверять формулы на стр. 6 для проверки. –