Как отделить сталкивающиеся объекты, не создавая больше столкновений

11

Предположим, я использую простую дискретную систему обнаружения столкновений, в которой я перемещаю все объекты, а затем проверяю наличие столкновений. Я хочу, чтобы любые сталкивающиеся объекты были отделены (конечно) и назначены соответствующие скорости реакции (отскок, скольжение, остановка и т. Д.).

Когда у меня есть пару сталкивающихся объектов, как я их разделить, не разрывая с одного или обоих из них сталкиваясь с другими объектами?

AJM
источник

Ответы:

8

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

Эрин Катто дала приятное объяснение последовательного решения импульсов на нескольких предыдущих GDC, их можно загрузить со страницы загрузки Box2D , см., Например, GDC 2009.

Найл
источник
Мне интересно об этом. Учитывая то, как общая потребность для обнаружения столкновений и разрешения я предполагал , что есть по крайней мере , упрощенный алгоритм разрешения подходит для аркадных и экшен.
AJM
2
На самом деле, нет. В старые времена (SNES и т.д.), они получили круглые вопросы , как это с игрой конструктивных изменений или компромиссов. Например. В Super Mario, когда игрок получил удар, Марио будет непобедимым в течение нескольких секунд , чтобы обойти вторые коллизии. В Double Dragon столкновения для игрока игнорируются, пока не закончится анимация падения назад.
yaustar
@yaustar На самом деле Марио вообще не сталкивается с врагами. Он просто получает урон, когда его хитбокс перекрывает их.
Зима
3

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

Если не происходит проникновение вам не придется сбросить ни одной позиции, и, таким образом, вы не будете запускать любые вторичные проходки.

Лорен Печтель
источник
2

Я обычно делаю следующее:

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

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