Особенности поведения на неровных поверхностях

В библиотеке Cannon.js симуляция тел, взаимодействующих с неровными поверхностями, строится на расчёте сил, столкновений и реакций тел с учётом геометрии объектов. Физический движок использует rigid body dynamics (динамику твёрдых тел), что позволяет моделировать как простые, так и сложные формы рельефа.

Ключевым элементом является определение контактных точек между объектом и поверхностью. Для неровной поверхности это означает, что движок рассчитывает множество точек контакта одновременно, определяя нормаль поверхности и силы реакции в каждой точке. Эти данные используются для:

  • вычисления сцепления и трения;
  • расчёта момента силы, возникающего при наклоне тела;
  • корректного отскока при столкновении с выступами и углублениями.

Коллайдеры и геометрия поверхности

Cannon.js предлагает несколько типов коллайдеров:

  • Box — простой кубический объект;
  • Sphere — сферический объект, идеален для роликов и шариков;
  • ConvexPolyhedron — выпуклый многогранник, наиболее точный для сложных форм;
  • Heightfield — матрица высот, идеальна для моделирования земли, склонов, холмов.

Использование 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 применяет шаговую интеграцию и постпроцессинг контактов, что позволяет:

  • корректно передавать момент силы при контакте с выступами;
  • предотвращать проскакивание коллайдеров через поверхность (tunneling);
  • моделировать небольшие вибрации и подпрыгивания при неровностях.

Для сложного рельефа часто комбинируют ConvexPolyhedron с Heightfield, чтобы управлять как крупными формами поверхности, так и деталями.

Особенности движения сферических объектов

Шарики и колёса демонстрируют уникальное поведение на неровных поверхностях:

  • катание зависит от радиуса и распределения массы;
  • перекатывание через углы Heightfield формирует небольшие моменты силы, вызывающие вращение;
  • отскок от выступов зависит от restitution материала.

Использование Sphere коллайдера упрощает физический расчёт, так как точка контакта всегда известна и нормаль легко вычисляется.

Оптимизация производительности

Неровные поверхности могут сильно нагружать движок из-за большого числа контактных точек. Основные методы оптимизации:

  • уменьшение количества ячеек в Heightfield без потери визуальной достоверности;
  • использование Bounding Sphere или Bounding Box для предварительной проверки столкновений;
  • ограничение частоты шагов симуляции (step frequency), чтобы сохранить стабильность и точность.
const fixedTimeStep = 1.0 / 60.0;
const maxSubSteps = 3;
world.step(fixedTimeStep, deltaTime, maxSubSteps);

Управление наклоном и переворотом объектов

Для предотвращения нежелательных переворотов на неровной поверхности применяются:

  • увеличение массы и инерции, чтобы объект был устойчивее;
  • настройка angularDamping для гашения вращательных колебаний;
  • программная стабилизация через внешние силы или ограничения вращения.

Эти методы особенно полезны при моделировании транспорта или механических конструкций, взаимодействующих с неровной местностью.