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