Класс Material в библиотеке Cannon.js
отвечает за определение физических свойств поверхности тела, таких как
трение и упругость при взаимодействии с другими объектами.
Material не хранит данные о конкретном теле напрямую, а
служит для определения того, как объекты будут взаимодействовать между
собой при контакте.
Создание материала осуществляется с помощью конструктора:
const material = new CANNON.Material(name);
name — необязательный параметр, строка
для идентификации материала. Каждый материал уникален и может быть
использован для множества тел.Материал сам по себе не содержит значения трения или упругости. Эти
параметры задаются при помощи
ContactMaterial — объекта, который
описывает взаимодействие двух материалов.
const groundMaterial = new CANNON.Material('ground');
const ballMaterial = new CANNON.Material('ball');
const contactMaterial = new CANNON.ContactMaterial(
groundMaterial,
ballMaterial,
{
friction: 0.4,
restitution: 0.7
}
);
world.addContactMaterial(contactMaterial);
friction — коэффициент трения между
двумя материалами. Чем выше значение, тем сильнее сопротивление
скольжению.restitution — коэффициент упругости
(bounce). Значение от 0 (полностью неупруго) до 1 (идеально
упруго).Важно понимать, что трение и упругость всегда зависят от пары материалов, а не от одного материала в отдельности.
Материал присваивается телу через свойство
material объекта Body:
const sphereBody = new CANNON.Body({
mass: 5,
shape: new CANNON.Sphere(1),
material: ballMaterial
});
После присвоения материала физический движок использует его при расчете взаимодействий с другими телами. При отсутствии материала для тела будет использован материал по умолчанию с нулевыми свойствами трения и упругости.
ContactMaterialПри столкновении двух тел Cannon.js ищет соответствующий
ContactMaterial для их материалов. Если
ContactMaterial не найден, используются стандартные
значения:
friction = 0.3restitution = 0.3Создание нескольких ContactMaterial позволяет детально
управлять взаимодействием различных типов поверхностей. Например:
const iceMaterial = new CANNON.Material('ice');
const rubberMaterial = new CANNON.Material('rubber');
const iceRubberContact = new CANNON.ContactMaterial(
iceMaterial,
rubberMaterial,
{
friction: 0.05,
restitution: 0.9
}
);
world.addContactMaterial(iceRubberContact);
Такой подход позволяет моделировать скольжение по льду или сильный отскок резинового шара.
Материал тела можно менять в процессе симуляции. Это полезно для сценариев с изменяющимися условиями поверхности:
sphereBody.material = iceMaterial;
После изменения материала тело будет взаимодействовать с другими
объектами согласно новым параметрам ContactMaterial.
friction (0.0–1.0).restitution определяет,
насколько объект “отскакивает” при ударе.restitution = 0.9, а другой
0.1, итоговое поведение определяется средним эффектом,
рассчитанным Cannon.js.Material задает идентификатор и тип поверхности
тела.ContactMaterial между парами материалов.material
объекта Body.Правильное использование Material и
ContactMaterial позволяет создавать сложные физические
симуляции с реалистичными контактами и взаимодействиями объектов.