Коэффициент восстановления, или restitution, определяет, насколько упруго взаимодействуют тела при столкновении. В Cannon.js это важный параметр, влияющий на динамику физических объектов, особенно при симуляции бильярдных шаров, мячей, падающих предметов и других систем с коллизиями. Значение коэффициента восстановления варьируется от 0 до 1:
В 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 напрямую влияет на высоту и скорость отскока.
Например, мяч с restitution = 1 после падения отскакивает
на ту же высоту, с которой упал, если пренебречь трением и
сопротивлением воздуха.
Взаимодействие между объектами При столкновении
двух тел с разными коэффициентами восстановления фактический отскок
рассчитывается через контактный материал или усреднение значений
restitution материалов. Это позволяет моделировать
взаимодействие, например, резинового шара с деревянной
поверхностью.
Энергетические потери Если
restitution < 1, кинетическая энергия частично
преобразуется в тепло или деформацию (симулируется в движке), что делает
движение более реалистичным. Для симуляций спортивных игр или инженерных
моделей это критически важно.
restitution на больших шагах интеграции может вызвать
«проскакивание» коллизий или нестабильные отскоки. Рекомендуется
увеличивать частоту обновления мира для точного расчета.restitution может привести к слишком «прыгающим»
объектам, что иногда выглядит неестественно.restitution имеют общий контактный материал, значение
контакта всегда переопределяет индивидуальные настройки. Это позволяет
контролировать конкретные типы взаимодействий (например, мяч и пол, мяч
и стенка).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);
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);
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);
restitution в зависимости от типа материала и
желаемого поведения объекта.restitution и
friction для реалистичных симуляций.Коэффициент восстановления в Cannon.js — ключевой инструмент для управления динамикой тел и создания реалистичной физики в 3D-симуляциях, от игр до инженерных приложений.