В физическом моделировании столкновений объектов ключевую роль играет
коэффициент упругости (restitution). Он определяет,
насколько энергия сохраняется при ударе и насколько объекты отскакивают
друг от друга после столкновения. В Oimo.js этот параметр задаётся для
каждого тела и каждой формы через свойство restitution.
restitution принимает числовое значение в диапазоне от
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) Тела при ударе практически не отскакивают. Энергия ударного взаимодействия быстро преобразуется в другие формы (в основном внутренняя энергия и трение). Применяется для имитации мягких или липких материалов, таких как глина, резина с сильным демпфированием, пластик с низкой упругостью.
Жёсткие столкновения (высокий restitution) При значении около 1 тела ведут себя как идеально упругие твердые объекты — например, металлические шары, бильярдные шары, камни. Энергия почти полностью сохраняется, и объекты сохраняют скорость после столкновения.
Промежуточные значения Позволяют создавать
реалистичное поведение материалов с частичной упругостью: резина,
пенопласт, мягкий металл. Важно учитывать, что restitution работает
совместно с другими физическими параметрами — массой, силой трения
(friction) и скоростью столкновения.
В 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 — идеальный отскок.В реальных сценариях для большинства материалов restitution выбирается в пределах 0.2–0.9, чтобы обеспечить реалистичное поведение без чрезмерных отскоков и «неестественного» движения.
mass) — влияет на импульс при
столкновении, но не на сам коэффициент restitution.friction) — при высоком
коэффициенте трения отскок может быть уменьшен за счёт диссипации
энергии параллельно поверхности.timeStep) — слишком
крупный шаг интеграции может привести к неточным расчетам отскока при
высоком restitution.Для корректного моделирования столкновений:
Эффективное использование коэффициента упругости позволяет создавать реалистичные симуляции столкновений и управлять динамикой движения объектов в Oimo.js, задавая желаемый уровень отскока и амортизации.