В библиотеке 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 вычисляет импульс столкновения, изменяя скорость и направление сферы в соответствии с законами физики. Параметры, влияющие на это:
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;
Плоскость часто используется вместе с другими телами для создания сложных конструкций:
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 позволяет создавать
реалистичные физические сцены с минимальными затратами ресурсов,
обеспечивая стабильность и точность расчета столкновений.