Коэффициент упругости (restitution) и его диапазон

В физическом моделировании столкновений объектов ключевую роль играет коэффициент упругости (restitution). Он определяет, насколько энергия сохраняется при ударе и насколько объекты отскакивают друг от друга после столкновения. В Oimo.js этот параметр задаётся для каждого тела и каждой формы через свойство restitution.

Основное значение restitution

restitution принимает числовое значение в диапазоне от 0 до 1:

  • 0 — абсолютно неупругое столкновение. Объекты после удара не отскакивают, энергия кинетического движения полностью рассеивается в момент столкновения.
  • 1 — абсолютно упругое столкновение. Энергия сохраняется полностью, объекты отскакивают без потерь скорости.

Значения, выходящие за пределы 0–1, могут быть интерпретированы движком непредсказуемо, поэтому их следует избегать.

// Пример создания тела с заданным коэффициентом упругости
const box = new OIMO.Body({
    type: "box",
    size: [1, 1, 1],
    pos: [0, 5, 0],
    move: true,
    restitution: 0.8 // высокий отскок при столкновении
});
world.addBody(box);

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

  1. Мягкие столкновения (низкий restitution) Тела при ударе практически не отскакивают. Энергия ударного взаимодействия быстро преобразуется в другие формы (в основном внутренняя энергия и трение). Применяется для имитации мягких или липких материалов, таких как глина, резина с сильным демпфированием, пластик с низкой упругостью.

  2. Жёсткие столкновения (высокий restitution) При значении около 1 тела ведут себя как идеально упругие твердые объекты — например, металлические шары, бильярдные шары, камни. Энергия почти полностью сохраняется, и объекты сохраняют скорость после столкновения.

  3. Промежуточные значения Позволяют создавать реалистичное поведение материалов с частичной упругостью: резина, пенопласт, мягкий металл. Важно учитывать, что restitution работает совместно с другими физическими параметрами — массой, силой трения (friction) и скоростью столкновения.

Реализация restitution в Oimo.js

В Oimo.js restitution задаётся на уровне формы тела или тела целиком. Для тела с несколькими формами можно задать разные коэффициенты для каждой из них, что позволяет детализировать взаимодействие частей объекта с миром.

const sphere = new OIMO.Body({
    type: "sphere",
    size: [1],
    pos: [0, 10, 0],
    move: true,
    restitution: 0.5
});
world.addBody(sphere);

Также restitution влияет на взаимодействие между двумя объектами. Oimo.js рассчитывает эффективный коэффициент при столкновении, используя формулу:

[ restitution_{} = (restitution_1, restitution_2)]

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

Диапазон и ограничения

  • Минимальное значение: 0 — полностью поглощённый удар.
  • Максимальное значение: 1 — идеальный отскок.
  • Значения <0 или >1 не гарантируют физическую корректность и могут привести к нестабильности симуляции.

В реальных сценариях для большинства материалов restitution выбирается в пределах 0.2–0.9, чтобы обеспечить реалистичное поведение без чрезмерных отскоков и «неестественного» движения.

Взаимодействие с другими физическими параметрами

  • Масса (mass) — влияет на импульс при столкновении, но не на сам коэффициент restitution.
  • Сила трения (friction) — при высоком коэффициенте трения отскок может быть уменьшен за счёт диссипации энергии параллельно поверхности.
  • Время симуляции (timeStep) — слишком крупный шаг интеграции может привести к неточным расчетам отскока при высоком restitution.

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

Для корректного моделирования столкновений:

  1. Выбирать значение restitution, соответствующее типу материала.
  2. Совместно регулировать friction и mass, чтобы избежать чрезмерных или слабых отскоков.
  3. Проверять стабильность симуляции при высоких значениях restitution, особенно при малых массе и больших скоростях.

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