Коэффициент восстановления (restitution)

Коэффициент восстановления, или restitution, определяет, насколько упруго взаимодействуют тела при столкновении. В Cannon.js это важный параметр, влияющий на динамику физических объектов, особенно при симуляции бильярдных шаров, мячей, падающих предметов и других систем с коллизиями. Значение коэффициента восстановления варьируется от 0 до 1:

  • 0 — абсолютно неупругое столкновение (тело «липнет» к поверхности, кинетическая энергия не сохраняется).
  • 1 — идеально упругое столкновение (энергия почти полностью сохраняется, тело отскакивает без потерь скорости).
  • 0 < restitution < 1 — частично упругое столкновение, характерное для большинства реальных объектов.

Настройка restitution для тела

В Cannon.js параметр restitution задается через материал (Material), который затем назначается телу (Body). Прямое изменение свойства тела не применяется: restitution определяется взаимодействием материалов, а не тела напрямую.

Пример создания материала с коэффициентом восстановления:

const ballMaterial = new CANNON.Material("ballMaterial");
ballMaterial.restitution = 0.9; // высокоупругое столкновение

const groundMaterial = new CANNON.Material("groundMaterial");
groundMaterial.restitution = 0.2; // малоупругое столкновение

Чтобы материал начал влиять на столкновения, необходимо создать контактный материал (ContactMaterial), который определяет правила взаимодействия двух материалов:

const contactMaterial = new CANNON.ContactMaterial(
    ballMaterial,   // материал первого тела
    groundMaterial, // материал второго тела
    {
        friction: 0.4,       // коэффициент трения
        restitution: 0.7     // коэффициент восстановления для контакта
    }
);

world.addContactMaterial(contactMaterial);

Контактный материал имеет приоритет над свойствами отдельных материалов при столкновении. Если restitution задан только у материалов, Cannon.js использует среднее значение между ними, если контактный материал не создан.

Влияние restitution на поведение объектов

  1. Отскок от поверхности Значение restitution напрямую влияет на высоту и скорость отскока. Например, мяч с restitution = 1 после падения отскакивает на ту же высоту, с которой упал, если пренебречь трением и сопротивлением воздуха.

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

  3. Энергетические потери Если restitution < 1, кинетическая энергия частично преобразуется в тепло или деформацию (симулируется в движке), что делает движение более реалистичным. Для симуляций спортивных игр или инженерных моделей это критически важно.

Тонкости работы с restitution

  • Влияние времени шагов симуляции: очень высокий restitution на больших шагах интеграции может вызвать «проскакивание» коллизий или нестабильные отскоки. Рекомендуется увеличивать частоту обновления мира для точного расчета.
  • Связь с трением: низкий коэффициент трения с высоким restitution может привести к слишком «прыгающим» объектам, что иногда выглядит неестественно.
  • Комбинация материалов: если два объекта с разными restitution имеют общий контактный материал, значение контакта всегда переопределяет индивидуальные настройки. Это позволяет контролировать конкретные типы взаимодействий (например, мяч и пол, мяч и стенка).

Примеры практического применения

  1. Бильярдные шары:
const ballMat = new CANNON.Material("ball");
ballMat.restitution = 0.95;

const tableMat = new CANNON.Material("table");
tableMat.restitution = 0.8;

const ballTableContact = new CANNON.ContactMaterial(ballMat, tableMat, {
    restitution: 0.9,
    friction: 0.2
});
world.addContactMaterial(ballTableContact);
  1. Падающий мяч на бетон:
const ballMaterial = new CANNON.Material();
const floorMaterial = new CANNON.Material();

const ballFloorContact = new CANNON.ContactMaterial(ballMaterial, floorMaterial, {
    restitution: 0.3, // низкий отскок
    friction: 0.5
});
world.addContactMaterial(ballFloorContact);
  1. Симуляция резиновой поверхности:
const rubberMaterial = new CANNON.Material("rubber");
rubberMaterial.restitution = 0.95;

const rubberContact = new CANNON.ContactMaterial(rubberMaterial, rubberMaterial, {
    restitution: 0.95,
    friction: 0.1
});
world.addContactMaterial(rubberContact);

Итоговые рекомендации

  • Использовать ContactMaterial для точного контроля столкновений.
  • Подбирать restitution в зависимости от типа материала и желаемого поведения объекта.
  • Следить за совместимостью restitution и friction для реалистичных симуляций.
  • Тестировать разные значения с учетом времени шага симуляции, чтобы избежать нестабильных отскоков.

Коэффициент восстановления в Cannon.js — ключевой инструмент для управления динамикой тел и создания реалистичной физики в 3D-симуляциях, от игр до инженерных приложений.