Жёсткость, затухание и натуральная длина

В Cannon.js взаимодействие между объектами через связи (constraints) и пружины (springs) управляется параметрами жёсткости, затухания и натуральной длины. Эти параметры критически важны для реалистичной физики и стабильного поведения симуляции.


Жёсткость (Stiffness)

Жёсткость определяет силу, с которой система возвращается к исходной позиции при деформации. В Cannon.js этот параметр задаётся в числовом виде и обычно обозначается свойством stiffness:

var spring = new CANNON.Spring(bodyA, bodyB, {
    localAnchorA: new CANNON.Vec3(0, 1, 0),
    localAnchorB: new CANNON.Vec3(0, -1, 0),
    stiffness: 100
});
  • Высокое значение жёсткости делает пружину «твёрдой»: тело почти мгновенно возвращается к исходной длине, но при этом повышается риск нестабильности интеграции.
  • Низкое значение делает систему мягкой: тело медленно возвращается к позиции, поведение кажется более «пластичным».

Cannon.js использует жёсткость в контексте численного интегрирования, поэтому слишком высокая жёсткость может вызвать дрожание или расслоение системы. Практически, жёсткость выбирается экспериментально, исходя из массы объектов и частоты обновления (step).


Затухание (Damping)

Затухание отвечает за рассеивание энергии и предотвращает бесконечные колебания. В Cannon.js оно задаётся через параметр damping:

spring.damping = 0.5;
  • Значение 0 означает отсутствие затухания, колебания будут продолжаться бесконечно.
  • Значение 1 практически мгновенно останавливает движение, убивая динамику.
  • Оптимальное затухание обычно находится в диапазоне 0.1–0.5 для естественных колебаний.

Затухание особенно важно при моделировании мягких тел или систем с несколькими соединёнными объектами, где энергию необходимо постепенно рассеивать для предотвращения нестабильности.


Натуральная длина (Rest Length)

Натуральная длина (restLength) определяет исходное расстояние между точками соединения:

spring.restLength = 2.0;
  • Пружина стремится поддерживать это расстояние между телами.
  • Изменение натуральной длины во время симуляции позволяет создавать эффекты растяжения и сжатия, например, для мягких тканей или резиновых элементов.

В сочетании с жёсткостью и затуханием натуральная длина определяет динамику колебаний и устойчивость системы.


Применение в Constraints

Cannon.js использует жёсткость, затухание и натуральную длину не только для CANNON.Spring, но и для некоторых видов constraints, таких как DistanceConstraint и LockConstraint. Для DistanceConstraint эти параметры задаются через опции:

var constraint = new CANNON.DistanceConstraint(bodyA, bodyB, 2, 1000);
  • Последний аргумент 1000 здесь выступает аналогом жёсткости.
  • Для реализации затухания необходимо комбинировать с кастомным Spring, так как стандартный DistanceConstraint не имеет встроенного damping.

Практические рекомендации

  1. Балансировка параметров: Слишком высокая жёсткость без достаточного затухания приводит к вибрациям.
  2. Единицы измерения: Cannon.js работает в условных единицах, обычно килограммы, метры, секунды. Жёсткость и damping подбираются исходя из масштаба симуляции.
  3. Частота обновления: Шаг интеграции (world.step(dt)) влияет на стабильность. Чем меньше шаг, тем безопаснее использовать высокую жёсткость.
  4. Динамическая настройка: Изменение restLength и damping во время симуляции позволяет моделировать расширение или сжатие объектов, например, при анимации мягких тел.

Связь параметров с физикой

  • Жёсткость – коэффициент упругости ( k ), который определяет силу ( F = -k x ), где ( x ) – отклонение от натуральной длины.
  • Затухание – коэффициент сопротивления скорости ( c ), сила ( F_{damping} = -c v ).
  • Натуральная длина – точка равновесия системы, вокруг которой происходят колебания.

Пример комплексного использования

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

// Применение силы на каждом шаге
world.addEventListener("postStep", function() {
    spring.applyForce();
});

Этот подход позволяет создавать реалистичное взаимодействие объектов, включая мягкие соединения, цепи и амортизаторы.