Глава 2 • Силы Упругости и Связи

Пружины, Мягкие Тела и Ткань

От простой пружинки подвески автомобиля до реалистичной тряпичной куклы (ragdoll) и развевающегося плаща. Узнайте, как закон Гука и ограничения Верле творят чудеса в 2D играх.

🎯 Эксперимент 1: Закон Гука и График Колебаний

Потяните груз мышкой вниз и отпустите. Наблюдайте за фазовым графиком смещения x(t) в реальном времени.

🖱️ Хватайте синий груз мышкой и оттягивайте его в любую сторону
Характеристики пружины
Жёсткость (k) 15.0 N/m
Демпфирование / Затухание (c) 0.15
Масса груза (m) 1.5 кг

Закон Гука и Демпфер

Идеальная пружина стремится восстановить длину покоя $L_0$. Сила возврата прямо пропорциональна деформации $\Delta x$:

F = -k · (|x| - L_0) · n - c · (v · n) · n

Без демпфера (c = 0): пружина будет вечно осциллировать без потери энергии (синусоида на графике).
С демпфером (c > 0): энергия механического движения рассеивается в тепло, амплитуда экспоненциально затухает.

Три режима колебаний

В зависимости от коэффициента затухания $\zeta = \frac{c}{2\sqrt{km}}$ система ведет себя по-разному:

  • $\zeta < 1$ (Underdamped): затухающие колебания вокруг центра покоя (пружинит, как матрас).
  • $\zeta = 1$ (Critically damped): самое быстрое возвращение в покой без перелетания (идеально для плавной камеры игрока!).
  • $\zeta > 1$ (Overdamped): медленное вялое возвращение, как в густом мёде.

🪢 Эксперимент 2: Физика Верёвки (Метод Якобсена)

Лёгкая, нерастяжимая и стабильная верёвка. Потяните за звенья левой кнопкой мыши или разрежьте правой кнопкой!

🖱️ Левая кнопка: тянуть верёвку | Правая кнопка: разрезать звенья как ножницами
Параметры верёвки
Количество звеньев 16
Гравитация 450

Почему пружины плохи для верёвок?

Если соединить звенья верёвки обычными пружинами Гука, она начнет растягиваться, как резина. Чтобы сделать верёвку жесткой, придется задрать коэффициент жесткости $k$, но тогда при нормальном $dt$ физика взорвется!

Решение Томаса Якобсена (Jakobsen Method): вместо расчета сил используются геометрические ограничения расстояния (Distance Constraints) в связке с интегратором Верле.

Формула проекции связей

Мы просто силой смещаем точки навстречу друг другу, чтобы их длина всегда оставалась $L$:

solve_constraint.js
const delta = p2.pos.sub(p1.pos);
const dist = delta.mag();
const error = (targetLength - dist) / dist;
// сдвигаем каждую точку на 50% ошибки
p1.pos.sub(delta.mult(0.5 * error));
p2.pos.add(delta.mult(0.5 * error));

🍮 Эксперимент 3: Желейные Тела и Ткань

Симуляция объемных упругих тел и полотна ткани. Хватайте углы, роняйте на пол, рвите сетку правой кнопкой мыши.

🖱️ Левая кнопка: хватать и швырять | Правая кнопка: рвать ткань
Тип симуляции
Итераций жесткости связей 8 ит.

Секрет объема: диагональные связи

Если соединить 4 точки квадрата связями только по периметру, квадрат схлопнется в плоский ромб. Чтобы желе сохраняло объем и сопротивлялось скручиванию (shear deformation), добавляются диагональные перекрестные связи.

Итерации релаксации (Relaxation Iterations): Чем больше раз мы прогоняем цикл разрешения связей за один кадр (от 5 до 12), тем тверже и жестче материал.

Разрезы и разрушение (Tearable Cloth)

В играх полотно ткани или паутину легко сделать рвущейся: если расстояние между двумя точками превышает критический порог (например, растяжение > 130%), или если курсор/пуля пересекает отрезок связи — связь просто помечается неактивной (active = false) и удаляется из расчётов!

← Назад: Основы и Интегрирование Далее: Столкновения и Импульсы →