Линейное и угловое затухание являются ключевыми параметрами при моделировании физических объектов в библиотеке Ammo.js, обеспечивая реалистичное поведение тел при движении и вращении. Они влияют на уменьшение скорости и момента инерции со временем, имитируя сопротивление среды и внутренние потери энергии.
Линейное затухание определяет снижение линейной скорости
объекта со временем. В Ammo.js параметр
задается методом setDamping(linear, angular) у объекта типа
btRigidBody.
rigidBody.setDamping(0.1, 0.0);
Первый аргумент (linear) —
коэффициент линейного затухания.
0 означает отсутствие затухания, объект будет
сохранять скорость бесконечно (при отсутствии других сил).1 полностью останавливает объект мгновенно,
что обычно не используется.0.01
до 0.2 для естественного замедления.Принцип работы: при каждом шаге симуляции линейная скорость уменьшается пропорционально коэффициенту затухания. Формула обновления скорости упрощенно выглядит так:
[ {new} = {old} (1 - linearDamping)]
Угловое затухание отвечает за уменьшение угловой скорости
объекта, то есть скорость вращения. Настраивается тем же
методом 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, обеспечивая реалистичную динамику и предотвращая нестабильность симуляций. Правильная настройка этих параметров критична для точной и предсказуемой физики объектов.