Я пытаюсь реализовать теорему о разделяющей оси в C #. У меня есть функция, которая может рассчитать минимальный вектор перевода между двумя полигонами. Тем не менее, я не могу создать функцию, которая вычисляет минимальный вектор перевода между одним полигоном и несколькими другими полигонами. Честно говоря, я работал над этим в течение нескольких месяцев, и я не приблизился к решению и не смог найти решение в Интернете. Всегда есть несколько крайних случаев, которые не возвращают правильный результат, что приводит к ошибкам с высоким приоритетом в моей игре.
Вот общие крайние случаи, которые не работают правильно:
Есть ли известное решение этой проблемы? Все, что я могу найти, это люди, говорящие «просто выполнить SAT на каждом полигоне», но это редко дает минимальный вектор перевода.
Любая помощь будет высоко ценится.
Ответы:
В идеале вы не должны строить свою среду из полигонов. Вы строите это из ребер (которые, возможно, вы рассчитываете из набора полигонов). Например, в вашем первом примере есть одно диагональное ребро; в последнем примере окно покоится на одном горизонтальном ребре.
Тот факт, что ваш редактор или инструменты используют меньшие отдельные фигуры для построения уровня, не должен влиять на время выполнения.
Немного более простой подход - просто удалить «внутренние» края базовых фигур. Для вашего последнего примера между полами "floor" есть два ребра; игнорируйте их во время обнаружения столкновений.
Вы можете найти лучшие рисунки и некоторые идеи реализации, прочитав раздел 4.5 (ребра и цепочки ребер) в документации Box2D .
источник