Параметры подвески: stiffness, restLength, damping

В библиотеке Cannon.js физика объектов строится на взаимодействии тел через силы и ограничения. Одним из ключевых компонентов является подвеска (spring) — механизм, соединяющий два тела и моделирующий упругую связь между ними. Подвеска задается объектом CANNON.Spring, который принимает в качестве параметров жесткость, длину покоя и демпфирование: stiffness, restLength, damping. Каждое из этих свойств влияет на поведение системы, создавая реалистичные эффекты упругости и колебаний.


stiffness — жесткость подвески

stiffness определяет силу упругости пружины. В Cannon.js сила, действующая на объекты, вычисляется по закону Гука:

[ F = -k (x - x_0)]

где:

    1. — stiffness,
    1. — текущая длина подвески,
  • (x_0) — restLength (длина покоя).

Особенности использования stiffness:

  • Высокое значение создаёт жесткую связь: тело почти не растягивается, колебания быстрые и резкие.
  • Низкое значение даёт мягкую связь: тело может растягиваться, колебания медленные и аморфные.
  • Оптимальное значение выбирается исходя из массы тел и желаемого эффекта упругости.

Пример создания пружины с заданной жесткостью:

const spring = new CANNON.Spring(bodyA, bodyB, {
    localAnchorA: new CANNON.Vec3(0, 0, 0),
    localAnchorB: new CANNON.Vec3(0, 1, 0),
    stiffness: 100,
    restLength: 2,
    damping: 1
});

restLength — длина покоя

restLength задаёт естественную длину подвески, при которой сила пружины равна нулю. Если расстояние между точками крепления равно restLength, пружина не создаёт ни растягивающей, ни сжимающей силы.

Применение и нюансы:

  • Увеличение restLength позволяет телам отдаляться друг от друга без сопротивления.
  • Уменьшение restLength создаёт постоянное сжатие между телами.
  • restLength используется в расчетах силы для вычисления отклонения от покоя: чем больше отклонение, тем сильнее сила, пропорциональная stiffness.

Пример:

spring.restLength = 3; // Пружина будет стремиться к длине 3 единицы

damping — демпфирование колебаний

damping отвечает за затухание колебаний. Без демпфирования пружины будут бесконечно колебаться при растяжении и сжатии, создавая нестабильную систему. Формула силы демпфирования в Cannon.js:

[ F_d = -d v_{rel}]

где:

    1. — damping,
  • (v_{rel}) — относительная скорость тел по линии соединения.

Ключевые моменты:

  • Малое значение (например, 0.1) создаёт лёгкое затухание, колебания продолжаются долго.
  • Среднее значение (0.5–1) обеспечивает стабильные колебания с постепенным успокоением.
  • Высокое значение (>1) резко гасит колебания, пружина ведёт себя как гидравлический амортизатор.

Пример настройки демпфирования:

spring.damping = 0.7; // Умеренное затухание

Взаимодействие параметров

Эффект пружины зависит от комбинации всех трёх параметров:

  • stiffness определяет силу реакции на растяжение.
  • restLength задаёт исходное положение и направление силы.
  • damping контролирует продолжительность колебаний и стабильность системы.

Рекомендации при настройке:

  1. Сначала определить желаемую длину подвески (restLength) исходя из расстояния между объектами.
  2. Подобрать stiffness, учитывая массу объектов и желаемую упругость.
  3. Добавить damping для предотвращения неконтролируемых колебаний.

Часто для визуально реалистичных симуляций применяют умеренно высокую stiffness и среднее damping, чтобы объекты быстро реагировали, но не «дрожали» бесконечно.


Практическое использование

Cannon.js позволяет подключать пружины к симуляции через метод world.addEventListener("postStep", ...), где вычисляется и применяется сила:

world.addEventListener("postStep", function() {
    spring.applyForce();
});
  • Метод applyForce() учитывает текущее положение тел, длину покоя, жесткость и демпфирование.
  • Использование postStep гарантирует корректное применение силы после всех остальных обновлений физики.

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


Итоговые принципы

  • stiffness — сила упругости, чем выше — тем жестче пружина.
  • restLength — естественная длина, при которой пружина бездействует.
  • damping — гашение колебаний, предотвращение нестабильности.

Комплексная настройка этих трёх параметров обеспечивает реалистичную физику и контроль над динамикой системы в Cannon.js.