Если это круги, точка столкновения (если она существует) будет лежать на линии, соединяющей их центры, и импульс каждому будет действовать в направлении от этой точки к центру круга.
Предполагая центры (x1, y1)
и (x2, y2)
и радиусы r1
и r2
, круги сталкиваются, когда
(x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) = (r1 + r2) * (r1 + r2)
Это просто ваша основная теорема Пифагора .
В большинстве случаев - несомненно, в том числе и у вас - обнаружение столкновений является скорее приблизительным, чем аналитическим делом. То есть вы перемещаете свои объекты небольшими шагами и проверяете на совпадение, а не решаете уравнения движения для точного момента контакта. Поэтому вместо того, чтобы искать приведенный выше случай, вы будете использовать неравенство , например:
(x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) <= (r1 + r2) * (r1 + r2)
Когда это оценивается как истина, столкновение в основном уже произошло , и у вас есть два варианта: вы можете работать в обратном направлении, чтобы точно рассчитать, когда и где это произошло, или вы можете предположить, что ваши временные шаги Достаточно мал, чтобы время, когда вы заметили перекрытие, было достаточно близко к моменту контакта, чтобы служить разумной заменой. Опять же, очень вероятно, что это именно то, что вы хотите сделать, но имейте в виду, что это совершенно неточно: если ваши объекты движутся быстро относительно их размера, то это может выглядеть совершенно неправильно, или даже пропустить столкновения вообще (иногда с юмором как "квантовое туннелирование").
Поскольку круги, вероятно, немного перекрываются, вам необходимо определить точку контакта прокси - назовем ее (xp, yp)
. Поскольку это приблизительное значение, существует несколько способов его расчета, но разумным выбором может быть:
xp = x1 + (x2 - x1) * r1 / (r1 + r2)
yp = y1 + (y2 - y1) * r1 / (r1 + r2)
То есть на линии между центрами на расстоянии, пропорциональном радиусам. Если перекрытие небольшое, это должно быть довольно близко к реальной точке столкновения. Если он большой, у вас все равно проблемы.
Игнорируя любое вращение, каждый круговой объект будет испытывать толчок от этой точки столкновения к своему центру. Например, толчок объекта 1 будет действовать в направлении (x1 - xp, y1 - yp)
.
Чтобы понять, каким будет эффект - то есть, как объекты будут двигаться после этого - вам нужно учитывать массу каждого объекта и применять закон сохранения импульса. Читайте о упругих столкновениях и, возможно, если вы хотите смоделировать столкновения, которые не идеально упругие, коэффициент восстановления .
В особом случае, когда объекты имеют одинаковый размер и массу, а столкновение является совершенно упругим - что редко случается в реальной жизни, но немного чаще в играх - вы можете разбить скорость каждого объекта на составляющие параллельно и перпендикулярно линии между центрами, а затем просто поменяйте местами параллельные компоненты между двумя объектами.