Cannon.js — это мощная физическая библиотека для JavaScript, позволяющая реализовать динамику твёрдых тел, столкновения, трение и гравитацию в браузере. Для построения реалистичных игровых сцен ключевое значение имеет правильная организация материалов и их взаимодействий, так как от этого зависит поведение объектов при столкновениях и скольжении.
В Cannon.js материалы описываются объектом
CANNON.Material. Каждый материал содержит физические
свойства, влияющие на поведение объектов при контакте:
Пример создания материала:
const woodMaterial = new CANNON.Material('wood');
const metalMaterial = new CANNON.Material('metal');
Для того чтобы Cannon.js знал, как взаимодействуют разные материалы,
используется объект CANNON.ContactMaterial. Он задаёт
свойства взаимодействия между двумя материалами:
Пример создания контактного материала между деревом и металлом:
const woodMetalContact = new CANNON.ContactMaterial(
woodMaterial,
metalMaterial,
{
friction: 0.4,
restitution: 0.2
}
);
world.addContactMaterial(woodMetalContact);
Добавление контактного материала в мир
(world.addContactMaterial) позволяет симулятору
использовать заданные физические свойства при взаимодействии объектов с
соответствующими материалами.
В реальных игровых сценах часто используются стандартные группы материалов, чтобы обеспечить предсказуемое и реалистичное поведение объектов:
Дерево и дерево
Металл и металл
Дерево и металл
Резина и любой материал
Земля / грунт и различные объекты
Для больших игровых сцен целесообразно использовать централизованное
хранение материалов и контактных материалов. Обычно создаётся отдельный
модуль materials.js, в котором:
Пример структуры:
// materials.js
export const materials = {
wood: new CANNON.Material('wood'),
metal: new CANNON.Material('metal'),
rubber: new CANNON.Material('rubber'),
ground: new CANNON.Material('ground')
};
export function setupContacts(world) {
world.addContactMaterial(new CANNON.ContactMaterial(materials.wood, materials.wood, { friction: 0.5, restitution: 0.3 }));
world.addContactMaterial(new CANNON.ContactMaterial(materials.metal, materials.metal, { friction: 0.2, restitution: 0.6 }));
world.addContactMaterial(new CANNON.ContactMaterial(materials.wood, materials.metal, { friction: 0.4, restitution: 0.2 }));
world.addContactMaterial(new CANNON.ContactMaterial(materials.rubber, materials.ground, { friction: 1.0, restitution: 0.9 }));
}
Такой подход упрощает поддержку и модификацию физических свойств объектов, а также позволяет создавать сцены с большим количеством взаимодействующих тел без дублирования кода.
Cannon.js рассчитывает физику всех столкновений. Использование правильно организованных контактных материалов позволяет:
Для этого часто применяют маски столкновений и группы:
const ballBody = new CANNON.Body({ mass: 1, material: materials.rubber });
ballBody.collisionFilterGroup = 1;
ballBody.collisionFilterMask = 1 | 2; // будет сталкиваться только с объектами из групп 1 и 2
Использование типовых наборов материалов, централизованное управление контактами и тщательная настройка коэффициентов трения и упругости обеспечивают реалистичную физику и стабильность игровых сцен в Cannon.js.