Правильное усечение аабба
Мне нужен 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, это не разделяющая ось -> проверить следующую ось.