Библиотека Cannon.js предоставляет мощный инструмент для симуляции физики в 3D-сценах на JavaScript. Одним из ключевых компонентов при моделировании взаимодействия объектов является ContactMaterial — объект, который определяет, как два различных материала ведут себя при столкновении. Это позволяет управлять коэффициентами трения, упругости и другими свойствами контакта, обеспечивая реалистичное поведение объектов в сцене.
ContactMaterial — это конструкция, связывающая два экземпляра Material и задающая физические параметры их взаимодействия:
Создание ContactMaterial выглядит следующим образом:
const materialA = new CANNON.Material('materialA');
const materialB = new CANNON.Material('materialB');
const contactMaterial = new CANNON.ContactMaterial(materialA, materialB, {
friction: 0.4,
restitution: 0.8,
stiffness: 1e7,
relaxation: 3
});
world.addContactMaterial(contactMaterial);
Здесь world — это экземпляр
CANNON.World, в котором происходит симуляция. Метод
addContactMaterial добавляет правило взаимодействия между
материалами в глобальную систему столкновений.
Friction определяет сопротивление скольжению между поверхностями. В Cannon.js используется Coulomb friction model, где сила трения пропорциональна нормальной силе контакта:
Важно учитывать, что friction применяется только в момент контакта и зависит от нормальной силы, действующей на точку столкновения. Для динамических объектов с большой массой и скоростью низкий коэффициент трения может привести к значительному скольжению или «проскальзыванию» при столкновении.
Restitution задает, насколько сильно объект отскакивает при ударе. В Cannon.js значение коэффициента упругости вычисляется для каждой пары материалов, используя значение, указанное в ContactMaterial.
Примеры применения:
restitution: 0 — объекты не отскакивают, создавая
эффект полностью поглощаемого удара.restitution: 1 — идеальный упругий отскок, при котором
кинетическая энергия сохраняется почти полностью.restitution > 1 — в реальности невозможно, но
библиотека допускает для эффектов «сверхотскока».Комбинирование низкого трения с высоким коэффициентом упругости может создавать динамичные и необычные взаимодействия, например, катящийся мяч на гладкой поверхности.
Stiffness отвечает за «жесткость» контакта, то есть насколько сильно физический движок пытается предотвратить проникновение объектов друг в друга. Большие значения создают более жесткий контакт, но могут вызвать численные нестабильности при высоких скоростях или малых шагах интеграции.
Relaxation задает скорость демпфирования при контакте, снижая резонансные колебания и предотвращая «прыжки» объектов после столкновения.
Настройка этих параметров необходима для реалистичной симуляции твердых тел, особенно в случаях, когда объекты имеют разные размеры и массы.
const ice = new CANNON.Material('ice');
const rubber = new CANNON.Material('rubber');
const iceRubberContact = new CANNON.ContactMaterial(ice, rubber, {
friction: 0.05,
restitution: 0.9
});
world.addContactMaterial(iceRubberContact);
Эта комбинация создаст сильный отскок и почти беспрепятственное скольжение мяча по поверхности.
const wood = new CANNON.Material('wood');
const concrete = new CANNON.Material('concrete');
const woodConcreteContact = new CANNON.ContactMaterial(wood, concrete, {
friction: 0.6,
restitution: 0.2
});
world.addContactMaterial(woodConcreteContact);
Здесь объекты будут двигаться медленно из-за высокого трения и минимального отскока при столкновении.
world.step), иначе могут появиться численные ошибки и
дрожание объектов.Использование ContactMaterial в Cannon.js позволяет детально управлять физикой столкновений, сочетая трение и упругость для создания реалистичных или стилизованных взаимодействий между объектами. Правильная настройка этих параметров является ключом к стабильной и предсказуемой симуляции.