Обработка столкновений между сегментами окружности и линии

StackOverflow https://stackoverflow.com/questions/1858240

Вопрос

Я реализую небольшую игру, и у меня возникли проблемы с правильной работой физики.В этой игре есть один шарик (круг, который перемещается от кадра к кадру и может менять радиус) и несколько стен (отрезки линий, которые также меняются и перемещаются от кадра к кадру).Я могу правильно распознавать столкновения, и заставить мяч отскочить в правильном направлении не составит труда.

Трудности возникают в ситуациях, когда мяч пересекает линию в одном кадре, а затем снова пересекает ее в следующем кадре, вызывая двойной отскок.Я мог бы переместить мяч обратно по нормали к линии, пока он не займет правильное положение, но это вызывает действительно странное поведение, когда рассматриваемая линия ударяется вдоль ее оси (представьте, что мяч для пинг-понга падает на вертикальную зубочистку и внезапно смещаясь в сторону так, что оказывается на одной стороне зубочистки...).Есть также несколько проблем, когда мяч пересекает более одной линии в данном кадре (представьте, что четыре линии вместе образуют прямоугольник, а мяч пересекает угол этого прямоугольника) — в каком направлении он должен отскочить?В каком направлении оно должно смещаться?

На самом деле у меня нет конкретного вопроса, но я ищу советы или полезные руководства.Все 2D, которые мне удалось найти до сих пор, охватывают только пересечения прямоугольников.

Я использую XNA, если это имеет какое-то значение.

Спасибо,
Кэмерон

Это было полезно?

Решение

Это универсальная проблема большинства физических библиотек.Если вы погуглите «глубину проникновения» (я предлагаю вместе с «физикой», или вы можете найти что-то совершенно другое :D), вы обнаружите, что даже эти библиотеки используют трюки, подобные вашему.

Есть два решения этой проблемы:

Дешевый вариант — увеличить частоту обновлений.Перемещайте объекты за 10 меньших шагов вместо одного большого, и у вас будет меньше проникновения, поэтому исправление путем смещения мяча от стены будет менее заметным.

Дорогостоящим является непрерывное обнаружение столкновений.Существуют алгоритмы, которые могут сказать вам, если задан движущийся и неподвижный объект, в какой момент времени оба объекта пересекутся.Погуглите «пересечение прямоугольника сферы с перевернутой сферой», чтобы найти некоторые из них.

Затем вы можете обновить следующим образом:мяч должен переместиться на 1,0 единицы.Проверьте на столкновение.Столкновение происходит через 0,25 единицы, поэтому переместите мяч на 0,25 единицы, вычислите вектор отражения (чтобы мяч отскочил от стены), повторите проверку столкновения с оставшимися 0,75 единицами (пока вы не узнаете конечное положение мяча).Это полностью исключает проникновения, и даже если ваш мяч движется так быстро, что обычно перелетает через стену за одно обновление, столкновение будет обнаружено.

Другие советы

Принято считать, что из-за временного интервала ваши коллизии будут пересекаться за допустимую точку между обновлениями.

По сути, вам нужно выполнить интерполяцию обратно к точке между последним и текущим кадром, где действительно произошло столкновение, переместить объект обратно в эту точку, а затем рассчитать силы и т. д.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top