Правильное усечение аабба

Мне нужен 100% правильный тест пересечения Fabrum Aabb для использования с отбраковкой Frustrum. Следующая ссылка объясняет, почему большинство реализаций не проходит 100% правильный тест, и предоставляет решение.

http://iquilezles.org/www/articles/frustumcorrect/frustumcorrect.htm

Однако это решение даже не на 100% правильно? Можете ли вы вспомнить случай, когда это не удается? Я думаю, что могу, но трудно объяснить. Не могли бы вы предложить лучшее решение, если считаете, что это не работает?

1 ответ

Решение

Вы правы, данное решение не на 100% правильно.

То, что он пытается сделать, - это так называемая теорема о разделяющей оси (или теорема о гиперплоскости).

В первой половине он проверяет ось, определенную плоскостями усеченного конуса, а во второй половине он проверяет ось, определенную AABB. Это правильно и необходимо для теста SAT.

Чего ему не хватает, так это оси, определяемой перекрестным произведением пар ребер, по одному от каждого многогранника. AABB имеет 3 уникальных ребра (ребра, которые имеют уникальное направление), а усеченный имеет 6 уникальных ребер. Таким образом, в коде отсутствует тест перекрытия для 3*6=18 возможных разделяющих осей.

Один тест перекрытия для данной оси выглядит следующим образом:

  • Спроецируйте все точки объекта A на эту ось. Это приведет к интервалу I1.
  • Спроецируйте все точки объекта B на эту ось. Это приведет к интервалу I2.
  • Если I1 не перекрывает I2, то разделяющая ось найдена и A не пересекает B.
  • Если I1 перекрывает I2, это не разделяющая ось -> проверить следующую ось.
Другие вопросы по тегам