2009-12-07 10 views
2

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

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

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

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

Спасибо,
Cameron

+0

Вы проверили физический двигатель Farseer? http://www.codeplex.com/FarseerPhysics – Martin

+0

На самом деле, я просто скачал его вскоре после того, как задал свой вопрос. Я собираюсь попробовать это - он выглядит хорошо до сих пор (я читал документацию)! – Cameron

+0

В конце концов, я не мог заставить движок делать то, что я хотел, и документации не хватало, поэтому я вернулся к своему пользовательскому физическому движку и улучшил его, используя некоторые из предложений ниже – Cameron

ответ

2

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

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

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

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

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

+1

Спасибо за ответ! Я буду определенно Google, что вы предложили, когда у меня будет больше времени. Мне удалось выработать большинство изломов в моей физике, интерполируя позиции всего от последнего кадра до текущего на очень небольшой процент (ровно столько, чтобы мяч перемещался на один пиксель), пока не обнаружилось столкновение (эффективность была вторичная цель). – Cameron

1

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

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

+0

. Я думаю, что большинство проблем, которые Я могу быть разрешен путем поиска начального столкновения, вместо того чтобы заставить мяч сталкиваться с каждым объектом, с которым он пересекается в данном фрейме. – Cameron