В особом случае, когда персонаж вращается только вокруг своей оси, параллельной оси Y, обнаружение столкновения с другой выровненной по оси прямоугольной призмой уменьшается до:
Проверьте, неY-интервал персонажа пересекает Y-интервал другой призмы.
Проверьте, пересекаются ли соответствующие XZ-сечения двух призм, что составляет проблему обнаружения столкновения между двумя повернутымипрямоугольники.
Если ответ на оба вышеизложенных вопроса положительный, то и только тогда призмы перекрываются.
Снижая конкретную проблему до проблемы перекрывающихся интервалов иПересекающиеся (повернутые) прямоугольники, есть много хороших ресурсов кода для каждой из этих задач.Первое задание довольно тривиально:
Пересекающиеся интервалы
Два закрытых интервала [a, b] и [c, d] пересекаются, если и только c ≤ b и a≤ д.Здесь мы также предполагаем, что обозначения интервалов согласованы, то есть a ≤ b и c ≤ d (в противном случае поменяйте местами конечные точки, если это необходимо).
Пересекающиеся повернутые прямоугольники
Высокий рейтинг SO на этот конкретный вопрос здесь .Реализация Lua, которую я написал для чуть более общей проблемы, Наименьшее расстояние между двумя прямоугольниками , включает в себя оптимизацию "раннего выхода" (ограничивающий круг и вершину в прямоугольнике), о которой я упоминал в этом потоке ,Мой код Lua возвращает «ложь», если повернутые прямоугольники пересекаются, в противном случае расстояние между ними.Для целей Java возвращаемое значение ноль в случаях коллизии будет служить.