Фрикция и отскок: setFriction, setRestitution

В Ammo.js физика столкновений и взаимодействия объектов задаётся через параметры трения (friction) и коэффициента отскока (restitution). Эти свойства определяют, как объекты ведут себя при контакте: скользят, прилипают, отскакивают или тормозят. Управление ими осуществляется через методы setFriction() и setRestitution() объектов типа btCollisionObject или его наследников, таких как btRigidBody.

Метод setFriction

Метод setFriction(value) задаёт коэффициент трения поверхности объекта.

  • Синтаксис:
rigidBody.setFriction(value);
  • Параметр value — число с плавающей точкой, обычно в диапазоне 0–1, где:

    • 0 — объект полностью скользкий, трения нет;
    • 1 — высокое трение, объект почти не скользит;
    • Значения выше 1 допустимы для усиленного сопротивления движению.
  • Применение: Трение влияет на удержание объекта на наклонной плоскости, сопротивление скольжению при столкновении и динамику движения тел по поверхностям с разной шероховатостью.

  • Пример:

const shape = new Ammo.btBoxShape(new Ammo.btVector3(1, 1, 1));
const mass = 1;
const localInertia = new Ammo.btVector3(0, 0, 0);
shape.calculateLocalInertia(mass, localInertia);

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

rigidBody.setFriction(0.5);  // среднее трение
  • Особенности взаимодействия:

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

Метод setRestitution

Метод setRestitution(value) задаёт коэффициент упругости объекта, определяющий, насколько сильно он отскакивает после столкновения.

  • Синтаксис:
rigidBody.setRestitution(value);
  • Параметр value — число с плавающей точкой:

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

  • Пример:

rigidBody.setRestitution(0.8);  // сильный отскок
  • Особенности взаимодействия:

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

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

  1. Совместное использование:

    • Трение и отскок вместе создают реалистичное поведение. Например, мяч с высоким коэффициентом отскока и низким трением будет прыгать и скользить, а с высоким трением будет подниматься и замедляться.
  2. Динамическая корректировка:

    • Методы setFriction() и setRestitution() можно вызывать в процессе симуляции для изменения физики объекта на лету.
  3. Тестирование и балансировка:

    • Значения коэффициентов сильно влияют на устойчивость симуляции. Рекомендуется тестировать сцены с разными комбинациями трения и отскока, чтобы избежать «летящих» объектов или застреваний.
  4. Взаимодействие с другими настройками:

    • Масса объекта, тип столкновений (collisionFlags) и шаг симуляции (timeStep) влияют на итоговое поведение трения и отскока. Высокая масса при низком трении может привести к чрезмерному скольжению.

Примеры сочетаний

Трение Отскок Поведение объекта
0.0 1.0 Скользит и сильно отскакивает
0.5 0.5 Умеренное скольжение и отскок
1.0 0.0 Почти не скользит, отскок минимальный
0.2 0.8 Легко скользит, но сильно отскакивает

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

Интеграция с другими объектами

При работе с Ammo.js важно помнить, что трение и отскок применяются на уровне RigidBody. Для сложных сцен с несколькими объектами или составными телами можно:

  • Применять разные коэффициенты к разным частям составного объекта.
  • Использовать пользовательские материалы (btCollisionShape) с индивидуальными свойствами.
  • Комбинировать с setDamping() для контроля затухания движения, что вместе с трением и отскоком создаёт более реалистичную динамику.

Эффективное использование setFriction() и setRestitution() позволяет достичь высокого уровня контроля над физическим поведением объектов, делая симуляции Ammo.js более выразительными и предсказуемыми.