Обработка столкновений между отрезками круга и линии - PullRequest
2 голосов
/ 07 декабря 2009

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

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

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

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

Спасибо
Cameron

Ответы [ 2 ]

2 голосов
/ 10 декабря 2009

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

Для этого есть два решения:

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

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

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

1 голос
/ 09 декабря 2009

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

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

...