Я хочу знать приблизительное трехмерное положение и трехмерной нормали места столкновения двух трехмерных выпуклых корпусов (A
против B
).
ЦП в скобках показывает относительное время ЦП, необходимое для моей законченной программы.
Часть 1: ранний выход (ЦП 1%)
На первом этапе я использую очень дешевый алгоритм - теорему об оси разделения.
Для Например, я использую 15 осей для 2 кубов. (В реальных случаях формы более сложные.)
Если есть хотя бы одна ось, которая может разделяться, return "no-collide"
.
В противном случае выполните следующую часть.
Часть 2: вершина против объема (ЦП 10%)
- Проверьте каждую вершину
A
- не находится ли она внутриB
. - Проверьте каждую вершину
B
- не находится ли она внутриA
.
Часть 3: Edge против Edge (ЦП> 20%)
Странный случай например. https://gamedev.stackexchange.com/questions/75437/collision-detection-3d-rectangles-using-sat. Я украл изображение оттуда: -
Таким образом, мне также нужно край против края.
- Для каждой пары ребер A и B (12 * 12 = 144 пары) найдите ближайшую точку на ребре
A
относительно краяB
. Проверить, находится ли вершина внутриB
. - (наоборот) Для каждой пары ребер B и A проверьте, находится ли такая вершина внутри
A
.
Вау, это много вычислений.
Однако это еще не конец.
Проблема
Сообщаемое положение столкновения не очень точное (слева: текущее, справа: желаемое): -
Чтобы решить эту проблему, я подумал о создании новой выпуклой формы =
A intersect B
.
Есть несколько бесплатных библиотек C ++ (например, OpenMesh), но я думаю, что это слишком дорого для ЦП.
Обратите внимание, что мне не нужно, чтобы он был точным.Он также иногда сообщает о неправильном нормальном состоянии (слева: текущее, справа: желание): -
^ Эту проблему можно решить, добавив проверку край (из A) против лица (из B), но это сделало бы обнаружение столкновений еще более дорогостоящим.
Вопрос
Похоже, что распространенные алгоритмы в Интернете (из которых я копирую) распознают только микрочипы.
ИМХО, алгоритм вершинного объема / ребра-ребра фокусируется на топологии, а не на том факте, что обе формы твердые em> объемы.
Какой алгоритм более точен (1-й приоритет) и, возможно, дешевле?
Мой подход может быть неправильным на базовом уровне.
Чтобы ускорить процесс, я уже немного подрезал, например выберите только пару ребер A и B, которые расположены близко друг к другу.
Ссылки: -
<< / a> проверяет только наличие столкновения.
https://math.stackexchange.com/questions/397413/determine-direction-of-minimum-overlap-of-convex-polygons Без ответа Математический вопрос, очень похожий на этот.
Изменить (через 10 дней)
Теперь я могу найти все пересекающиеся точки выпуклости (выпуклость изображена в виде розового треугольника / прямоугольника): -
Вот как я считаю нормальным.
Для каждой разделяющей оси (все = 15 осей) я проецирую розовую выпуклость на ось.
Ось, которая дает кратчайшее проекционное расстояние (розовая стрелка ) должно быть нормальным направлением.
Мое вышеупомянутое предположение часто является правильным (например, слева), но иногда неверным (например, правильным).
Как улучшить его с меньшими затратами на ЦП?