Я проверяю столкновение между многочисленными движущимися квадратами в дереве квадрантов.
Когда два квадрата сталкиваются, я инвертирую их скорость следующим образом:
for (auto pair : collisionPairs)
{
auto& square1 = static_cast<Square&>(*(pair.first));
auto& square2 = static_cast<Square&>(*(pair.second));
square1.setVelocity(-square1.getVelocity());
square2.setVelocity(-square2.getVelocity());
}
Проблема в том, что обнаружение столкновений происходит не всегда в одном кадре.
Иногда это столкновение между одинаковыми квадратами более одного кадра, потому что квадраты пересекались слишком глубоко.
Таким образом, квадраты перекрываются, и они продолжают бесконечно изменять свою скорость, что приводит к скорости 0 ( -velocity + Velocity = 0 )
Как я мог это исправить?
РЕДАКТИРОВАТЬ: я обнаружил, что проблема с глубоким пересечением была вызвана моим деревом квадрантов, я забыл проверить столкновение с объектами дочерних деревьев.
Теперь это ВСЕ ЕЩЕ происходит, но очень редко, например, 1 из 100 столкновений, раньше было ~ 20 из 100 столкновений.