В библиотеке Cannon.js симуляция тел, взаимодействующих с неровными поверхностями, строится на расчёте сил, столкновений и реакций тел с учётом геометрии объектов. Физический движок использует rigid body dynamics (динамику твёрдых тел), что позволяет моделировать как простые, так и сложные формы рельефа.
Ключевым элементом является определение контактных точек между объектом и поверхностью. Для неровной поверхности это означает, что движок рассчитывает множество точек контакта одновременно, определяя нормаль поверхности и силы реакции в каждой точке. Эти данные используются для:
Cannon.js предлагает несколько типов коллайдеров:
Использование Heightfield для неровной поверхности обеспечивает точный контроль над рельефом. При создании Heightfield каждая вершина задаёт высоту, а движок автоматически рассчитывает нормали и векторы силы для каждой ячейки. Это особенно важно для моделирования тел, которые должны корректно катиться или скользить по склону.
const matrix = [
[0, 0, 0],
[1, 0.5, 0],
[0, 1, 0],
];
const hfShape = new CANNON.Heightfield(matrix, { elementSize: 1 });
const hfBody = new CANNON.Body({ mass: 0 });
hfBody.addShape(hfShape);
world.addBody(hfBody);
Для реального поведения на неровной поверхности важно правильно задавать коэффициенты трения:
material.friction — сопротивление скольжению;material.restitution — упругость отскока.Cannon.js использует концепцию контактных материалов, которые определяют взаимодействие между двумя объектами. Например, сцепление колеса с неровной дорогой или шарика с каменистой поверхностью зависит от комбинации материалов.
const groundMaterial = new CANNON.Material("ground");
const wheelMaterial = new CANNON.Material("wheel");
const contactMaterial = new CANNON.ContactMaterial(groundMaterial, wheelMaterial, {
friction: 0.6,
restitution: 0.1,
});
world.addContactMaterial(contactMaterial);
При движении по склону объект испытывает несколько видов сил:
Cannon.js автоматически рассчитывает все эти силы на основе массы, нормалей поверхности и коэффициентов трения. Для управления поведением объектов на неровных поверхностях часто используется модификация damping и angularDamping, чтобы предотвратить слишком резкие перевороты или скольжения.
body.linearDamping = 0.1;
body.angularDamping = 0.2;
Реалистичное поведение на неровной поверхности зависит от точного расчёта столкновений. Для этого Cannon.js применяет шаговую интеграцию и постпроцессинг контактов, что позволяет:
Для сложного рельефа часто комбинируют ConvexPolyhedron с Heightfield, чтобы управлять как крупными формами поверхности, так и деталями.
Шарики и колёса демонстрируют уникальное поведение на неровных поверхностях:
restitution материала.Использование Sphere коллайдера упрощает физический расчёт, так как точка контакта всегда известна и нормаль легко вычисляется.
Неровные поверхности могут сильно нагружать движок из-за большого числа контактных точек. Основные методы оптимизации:
const fixedTimeStep = 1.0 / 60.0;
const maxSubSteps = 3;
world.step(fixedTimeStep, deltaTime, maxSubSteps);
Для предотвращения нежелательных переворотов на неровной поверхности применяются:
angularDamping для гашения вращательных
колебаний;Эти методы особенно полезны при моделировании транспорта или механических конструкций, взаимодействующих с неровной местностью.