Линейное и угловое затухание

Линейное и угловое затухание являются ключевыми параметрами при моделировании физических объектов в библиотеке Ammo.js, обеспечивая реалистичное поведение тел при движении и вращении. Они влияют на уменьшение скорости и момента инерции со временем, имитируя сопротивление среды и внутренние потери энергии.


Линейное затухание (Linear Damping)

Линейное затухание определяет снижение линейной скорости объекта со временем. В Ammo.js параметр задается методом setDamping(linear, angular) у объекта типа btRigidBody.

rigidBody.setDamping(0.1, 0.0);
  • Первый аргумент (linear) — коэффициент линейного затухания.

    • Значение 0 означает отсутствие затухания, объект будет сохранять скорость бесконечно (при отсутствии других сил).
    • Значение 1 полностью останавливает объект мгновенно, что обычно не используется.
    • Рекомендуется использовать небольшие значения от 0.01 до 0.2 для естественного замедления.
  • Принцип работы: при каждом шаге симуляции линейная скорость уменьшается пропорционально коэффициенту затухания. Формула обновления скорости упрощенно выглядит так:

[ {new} = {old} (1 - linearDamping)]

  • Пример практического применения: при моделировании шарика, катящегося по поверхности с легким трением, линейное затухание создаст постепенное замедление и остановку.

Угловое затухание (Angular Damping)

Угловое затухание отвечает за уменьшение угловой скорости объекта, то есть скорость вращения. Настраивается тем же методом setDamping.

rigidBody.setDamping(0.0, 0.05);
  • Второй аргумент (angular) — коэффициент углового затухания.

    • Значение 0 — вращение сохраняется без изменений.
    • Значения от 0.01 до 0.2 создают реалистичное постепенное снижение вращения.
    • Высокие значения мгновенно останавливают вращение.
  • Принцип работы: угловая скорость объекта уменьшается пропорционально коэффициенту, аналогично линейному затуханию:

[ {new} = {old} (1 - angularDamping)]

  • Пример практического применения: вращающийся куб на столе постепенно замедляется, имитируя сопротивление воздуха и трение о поверхность.

Связь затухания с массой и импульсами

Значения линейного и углового затухания действуют независимо от массы объекта, однако эффект на ускорение зависит от массы и инерции. Легкие объекты с небольшим затуханием замедлятся быстрее по сравнению с массивными объектами, если приложены одинаковые силы.

При столкновениях затухание не влияет на мгновенные импульсы, но контролирует восстановление скорости после удара и постепенное успокоение тела.


Настройка затухания для разных типов тел

  • Шарики и цилиндры: небольшое линейное и угловое затухание (0.05–0.1) создаёт естественное катание и вращение.
  • Плоские объекты, блоки: более высокое угловое затухание (0.1–0.2) предотвращает бесконтрольное вращение после столкновений.
  • Подвижные механизмы и роботы: часто минимальное линейное затухание (0–0.01) для точного контроля движения, угловое затухание настраивается индивидуально для сочленений.

Влияние на стабильность симуляции

Слишком низкое затухание может вызвать постоянное нарастание скорости из-за численных ошибок, особенно при сложных взаимодействиях. Слишком высокое затухание делает движения неестественно резкими и “липкими”, нарушая реализм. Рекомендуется подобрать значения экспериментально, ориентируясь на размер объектов, массу и ожидаемое поведение.


Пример комплексной настройки

// Создание rigid body
const shape = new Ammo.btBoxShape(new Ammo.btVector3(1, 1, 1));
const mass = 2;
const localInertia = new Ammo.btVector3(0, 0, 0);
shape.calculateLocalInertia(mass, localInertia);

const transform = new Ammo.btTransform();
transform.setIdentity();
transform.setOrigin(new Ammo.btVector3(0, 10, 0));

const motionState = new Ammo.btDefaultMotionState(transform);
const rbInfo = new Ammo.btRigidBodyConstructionInfo(mass, motionState, shape, localInertia);
const rigidBody = new Ammo.btRigidBody(rbInfo);

// Настройка линейного и углового затухания
rigidBody.setDamping(0.05, 0.1);

// Добавление в мир
physicsWorld.addRigidBody(rigidBody);

В этом примере линейное затухание уменьшает скорость перемещения блока, а угловое затухание предотвращает его бесконечное вращение после столкновений с другими объектами или плоскостью пола.


Линейное и угловое затухание являются основными инструментами для контроля поведения тел в Ammo.js, обеспечивая реалистичную динамику и предотвращая нестабильность симуляций. Правильная настройка этих параметров критична для точной и предсказуемой физики объектов.