Еще одно предложение (которое охватывает сдерживание, и я думаю, что дешевле):
Проверьте, находятся ли какие-либо из 4 вершин # 1 внутри # 2, а затем проверьте, находятся ли какие-либо из 4 вершин # 2 внутри # 1. Вот как я бы предложил это сделать:
Предположим, что вершина # 1, которую вы проверяете, v, а 4 вершины # 2 v1 ... v4. Инвертировать-повернуть все 5 вершин по ориентации # 2. (Чтобы повернуть вектор u в обратном направлении на матрицу ориентации M, умножьте u на M-транспонированный: M ^ T u, предполагая, что в вашем соглашении ориентация работает путем умножения влево.)
Получившееся 2-е поле, называемое # 2 ', теперь выровнено по оси - вы можете сразу проверить, содержится ли в нем v.
Если вы нашли # 1-вершину внутри # 2-стопа, у вас есть пересечение. В противном случае - продолжить.
Сразу же приходит на ум несколько оптимизаций (может быть, вы можете хранить неповернутые копии вершин в каждом блоке? Если размеры фиксированы, возможно, вы можете сравнить их, чтобы немедленно устранить одну из возможных защитных оболочек и сохранить 3 потенциальных теста? ) но если вы не примените его к gazillions пар блоков, этот тест должен быть достаточно дешевым, как есть.
Что касается движения, вы можете зайти туда как можно глубже - посмотрите «непрерывное столкновение» и убедитесь сами. (Я особенно помню некоторые хорошие работы Стефана Редона). Я искренне верю, что ни одна игра не делает ничего подобного: если вы действительно движетесь очень быстро, вы можете разделить свой временной шаг и выполнить проверку столкновений на каждой субтерации позиции / ориентации.
(править :) Было еще одно обсуждение прямо здесь об этом, с хорошими ссылками.