🎯 Эксперимент 1: Лаборатория Столкновения Двух Тел
Настройте массы и упругость. Проверьте закон сохранения суммарного импульса и кинетической энергии.
Формула импульса $J$
Когда два тела сталкиваются, возникает мгновенный скачок скорости вдоль контактной нормали $\hat{n}$. Величина скачка (скалярный импульс $J$) выражается формулой:
После нахождения $J$ новые скорости объектов рассчитываются в один шаг:
v₁ -= (J / m₁) * n
v₂ += (J / m₂) * n
Позиционная депенетрация (De-penetration)
Если ограничиться только изменением скоростей, из-за дискретности шага по времени тела на следующем кадре могут остаться перекрывающимися. Движок начнет повторно применять импульс, и шары "слипнутся" или "застрянут".
🎱 Эксперимент 2: Бильярдная Арена со Множеством Тел
Итеративное разрешение одновременных столкновений десятков тел. Включите гравитацию или хватайте шары курсором!
Сложность $O(N^2)$ и Broad-Phase
Для наивной проверки всех пар из $N$ объектов требуется $N(N-1)/2$ проверок. При 15 объектах это всего 105 проверок в кадр. Но для сотен объектов в играх применяют Broad-Phase фильтрацию:
- Spatial Hashing (Пространственная сетка): экран делится на ячейки; проверяются только шары в соседних ячейках.
- QuadTree / BVH (Деревья объемов): иерархическая группировка габаритных рамок AABB.
Итеративный релаксационный решатель (Iterative Solver)
В ситуации, когда три или более шара зажаты вместе в угол, однократное разрешение столкновения не может удовлетворить все условия сразу. Поэтому игровые движки (Box2D, PhysX) прогоняют разрешение пар циклом по 3-8 итераций подряд за один шаг физики.