Класс Material

Класс 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.3
  • restitution = 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.

Особенности работы трения

  • Cannon.js использует модель Coulomb friction, где сила трения пропорциональна нормальной силе контакта.
  • Большие значения трения могут вызывать “залипание” объектов при симуляции.
  • Для плавного скольжения рекомендуется использовать умеренные значения friction (0.0–1.0).

Упругость и реалистичные столкновения

  • Коэффициент restitution определяет, насколько объект “отскакивает” при ударе.
  • Для реалистичных симуляций лучше подбирать значения между 0.2 и 0.8, избегая крайностей, чтобы объекты не уходили в бесконечные колебания.
  • Упругость взаимодействия зависит сразу от двух материалов. Если один материал имеет restitution = 0.9, а другой 0.1, итоговое поведение определяется средним эффектом, рассчитанным Cannon.js.

Резюме ключевых моментов

  • Material задает идентификатор и тип поверхности тела.
  • Свойства трения и упругости задаются через ContactMaterial между парами материалов.
  • Материал присваивается телу через свойство material объекта Body.
  • Динамическое изменение материала позволяет моделировать смену поверхностей.
  • Трение и упругость зависят от взаимодействия пары материалов, не от одного материала в отдельности.

Правильное использование Material и ContactMaterial позволяет создавать сложные физические симуляции с реалистичными контактами и взаимодействиями объектов.