Как определить, перекрывается ли часть или весь объект с другим объектом в приложении Android OpenGL-ES? - PullRequest
1 голос
/ 18 февраля 2011

Предположим, у меня есть 3 куба в случайном месте / ориентации, и я хочу определить, перекрывает ли (или сталкивается) ли какой-либо куб с другим кубом. Это наложение или столкновение также может произойти, так как местоположение / вращение кубов изменяются в каждом кадре. Обратите внимание, что для этого я ищу решение на базе Android и OpenGL ES (1.0 или 1.1).

1 Ответ

4 голосов
/ 18 февраля 2011

Это на самом деле не проблема OpenGL - она ​​просто выполняет рендеринг. Я не знаю ни одной готовой библиотеки Android для обнаружения столкновений в 3D, так что вам, возможно, придется делать математику самостоятельно. Эффективное обнаружение столкновений - это, как правило, искусство использования быстрых дешевых тестов, чтобы избежать более дорогого анализа. Для вашей проблемы хорошим подходом к обнаружению того, что куб A пересекает куб b, было бы сделать быстрый тест отклонения, либо

  1. Вычислить ограничивающие сферы для A и B - если расстояние между центрами двух сфер больше, чем сумма радиусов, то A и B не пересекаются
  2. Вычислить выровненные по оси ограничивающие рамки для A и B - если границы не пересекаются ( очень легко проверить ), то ни A, ни B

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

Включение вершин проверяет вершины A, чтобы определить, лежат ли они в пределах B: либо поверните вершину в систему отсчета B, чтобы проверить на включение, либо используйте плоскости граней B непосредственно в frustum стиль операции.

Пересечение ребер / граней - это тестирование каждого из ребер A для пересечения с треугольниками граней B.

Хотя тест на включение вершин немного дешевле, чем тест Edge / Face, кубы могут пересекаться, не охватывая вершины друг друга, поэтому отрицательный результат не означает отсутствие пересечения. Аналогично, кубы могут пересекаться без пересечения ребра и грани (если один лежит внутри другого). Вам нужно будет выполнить несколько тестов, чтобы поймать каждое пересечение. Этого можно избежать, если вы сделаете некоторые предположения о том, как кубы могут перемещаться от кадра к кадру, то есть, если A и B не касались последнего кадра, маловероятно, что они полностью находятся в пределах B сейчас.

...