Plane

В библиотеке Cannon.js объект Plane представляет собой бесконечную плоскость, которая может использоваться для моделирования пола, стен или любых ограничивающих поверхностей. Plane — это особый тип формы (Shape), который отличается тем, что не имеет размера, но может взаимодействовать с другими телами в физическом мире.

const planeShape = new CANNON.Plane();

После создания формы её необходимо прикрепить к телу (Body), обычно статическому, поскольку бесконечная плоскость не предназначена для динамического движения.

const planeBody = new CANNON.Body({
    mass: 0, // статическое тело
    shape: planeShape
});
world.addBody(planeBody);

Ориентация плоскости

По умолчанию плоскость располагается горизонтально, перпендикулярно оси Y. Вектор нормали направлен вверх (0, 1, 0). Для задания наклона или поворота используют кватернионы или метод quaternion.setFromEuler:

planeBody.quaternion.setFromEuler(-Math.PI / 2, 0, 0); // вертикальная плоскость

Использование кватернионов позволяет точно контролировать ориентацию плоскости в пространстве и корректно рассчитывать столкновения с телами.

Взаимодействие с динамическими телами

Бесконечная плоскость идеально подходит для столкновений с твердыми телами (Box, Sphere, Cylinder и т. д.). При столкновении используется вектор нормали плоскости для вычисления отражения, трения и отскока.

const sphereBody = new CANNON.Body({
    mass: 5,
    shape: new CANNON.Sphere(1),
    position: new CANNON.Vec3(0, 5, 0)
});
world.addBody(sphereBody);

Когда сфера падает на плоскость, Cannon.js вычисляет импульс столкновения, изменяя скорость и направление сферы в соответствии с законами физики. Параметры, влияющие на это:

  • restitution — коэффициент упругости;
  • friction — коэффициент трения;
  • material — физический материал, влияющий на взаимодействие разных тел.
const groundMaterial = new CANNON.Material('ground');
const sphereMaterial = new CANNON.Material('sphere');

const contactMaterial = new CANNON.ContactMaterial(groundMaterial, sphereMaterial, {
    friction: 0.4,
    restitution: 0.6
});
world.addContactMaterial(contactMaterial);

planeBody.material = groundMaterial;
sphereBody.material = sphereMaterial;

Особенности коллизий и оптимизация

  1. Бесконечная природа — плоскость не имеет границ, поэтому для больших сцен нет необходимости создавать массивы объектов для пола. Это снижает нагрузку на движок.
  2. Статическое тело — масса плоскости обычно равна нулю. Статические тела не участвуют в динамических расчетах инерции, что ускоряет симуляцию.
  3. Точные столкновения — Cannon.js использует алгоритмы расчета импульса на основе нормали плоскости, что позволяет моделировать как упругое, так и неупругое столкновение.

Комбинирование с другими формами

Плоскость часто используется вместе с другими телами для создания сложных конструкций:

const wallShape = new CANNON.Plane();
const wallBody = new CANNON.Body({ mass: 0 });
wallBody.addShape(wallShape);
wallBody.quaternion.setFromEuler(0, Math.PI / 2, 0); // стена по оси X
world.addBody(wallBody);

Так можно создавать стены, наклонные поверхности или рампы, комбинируя несколько плоскостей.

Взаимодействие с гравитацией

Плоскость служит идеальным ограничителем для тел под действием гравитации:

world.gravity.set(0, -9.82, 0); // стандартная гравитация

Все динамические тела падают на плоскость, а последующие столкновения корректно моделируются с учетом массы, трения и упругости.

Практические советы

  • Для пола и стен плоскость предпочтительнее объемных форм (Box) из-за оптимизации.
  • Повороты плоскости лучше задавать кватернионами, чтобы избежать проблем с вычислением столкновений при вращении.
  • Для скользких или липких поверхностей корректно настраивать ContactMaterial, комбинируя коэффициенты трения и упругости.
  • Статические плоскости не должны участвовать в расчетах силы или импульса — это снижает нагрузку на симуляцию.

Использование Plane в Cannon.js позволяет создавать реалистичные физические сцены с минимальными затратами ресурсов, обеспечивая стабильность и точность расчета столкновений.