10. Sequential Impulses

Этот метод – естественное развитие разрешения ограничений на уровне скоростей. Он был популяризован Erin Catto. При простом изолированном способе разрешения ограничений с помощью скоростей мы получали странный результат.

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

Теперь давайте попробуем реализовать наше любимое ограничение на дистанцию.

Пусть это будет ограничения на дистанцию точки от подвеса.

$$ C(x) = |x - x_0|^2 - r^2 = 0 $$

Если продифференцировать это ограничение по времени, то получим скорость точки в направлении ограничения.

$$ \dot{C}(x) = 2(x - x_0) \cdot \dot{x} = 0 $$

Для нас это означает, что проекция скорости точки на вектор от точки до подвеса должна быть равна нулю.

$$ v_{\parallel} = (x - x_0) \cdot \dot{x} = 0 $$

Или, что скорость точки должна быть перпендикулярна вектору от точки до подвеса.

Если скорость всегда будет перпендикулярна вектору от точки до подвеса, то ограничение на дистанцию будет удовлетворено.

Симулируем…

И ничего не получилось. Это происхожит потому что мы не можем изменять скорость непрерывно. Мы делаем это дискретно, появляется ошибка и она накапливается.

 Baumgarte Stabilization

У нас появилась дополнительная задача – помимо удовлетворения ограничения, нам нужно еще и следить за тем, чтобы ошибка не накапливалась. Для этого мы можем использовать метод Баумгартена. Если изначально мы пытались удовлетворить производной ограничения $$\dot{C}(x) = 0$$, то теперь мы будем пытаться удовлетворить ограничение с некоторым запасом чтобы убирать накопившуюся ошибку.

$$ \dot{C}(x) + \lambda \cdot C(x) = 0 $$

Где $\lambda$ – это некоторый коэффициент, который мы можем менять. Чем больше $\lambda$, тем быстрее ошибка будет сходить на нет.

Давайте сразу просимулируем двойной маятник.

Если $\lambda$ слишком большой, то при большой ошибке, мы можем получить слишком большую скорость. Это особенно хорошо заметно в симуляциях с коллизиями, когда один объект глубоко проникает в другой. То он вылетает с большой скоростью.

Такой подход использовался в старой версии Box2D, но потом его убрали.

В Движке ODE это называется ERP (ERP - Error Reduction Parameter) Пуньк

NGS