ConvexPolyhedron — это одна из ключевых форм в физическом движке Cannon.js, предназначенная для представления выпуклых многогранников. Она позволяет моделировать объекты сложной формы, сохраняя высокую производительность при столкновениях. Использование этой формы особенно полезно, когда стандартные геометрии (Box, Sphere, Cylinder) не подходят для точного физического представления объекта.
Для создания ConvexPolyhedron необходимы три базовые
структуры:
CANNON.Vec3, где каждая вершина задаёт координаты
точки в локальной системе объекта. Пример структуры:const vertices = [
new CANNON.Vec3(1, 1, 1),
new CANNON.Vec3(-1, 1, 1),
new CANNON.Vec3(-1, -1, 1),
new CANNON.Vec3(1, -1, 1),
new CANNON.Vec3(1, 1, -1),
new CANNON.Vec3(-1, 1, -1),
new CANNON.Vec3(-1, -1, -1),
new CANNON.Vec3(1, -1, -1)
];
const faces = [
[0, 1, 2, 3],
[4, 5, 6, 7],
[0, 3, 7, 4],
[1, 2, 6, 5],
[0, 1, 5, 4],
[3, 2, 6, 7]
];
CANNON.Vec3, направленных наружу:const normals = [
new CANNON.Vec3(0, 0, 1),
new CANNON.Vec3(0, 0, -1),
new CANNON.Vec3(-1, 0, 0),
new CANNON.Vec3(1, 0, 0),
new CANNON.Vec3(0, 1, 0),
new CANNON.Vec3(0, -1, 0)
];
Для инициализации объекта используется конструктор
CANNON.ConvexPolyhedron, принимающий вершины, грани и
необязательные нормали:
const convexShape = new CANNON.ConvexPolyhedron({
vertices: vertices,
faces: faces,
normals: normals
});
Особенности и требования:
Созданную форму можно добавить в тело CANNON.Body для
включения в симуляцию:
const body = new CANNON.Body({
mass: 5,
position: new CANNON.Vec3(0, 10, 0)
});
body.addShape(convexShape);
world.addBody(body);
Рекомендации по массе и физическим свойствам:
ConvexPolyhedron.ConvexPolyhedron позволяет преобразовать произвольные трехмерные модели, например экспортированные из Blender или Three.js, в физические объекты:
const geometry = new THREE.BoxGeometry(2, 2, 2);
const vertices = geometry.attributes.position.array;
const faces = [];
for (let i = 0; i < geometry.index.count; i += 3) {
faces.push([
geometry.index.array[i],
geometry.index.array[i + 1],
geometry.index.array[i + 2]
]);
}
const cannonVertices = [];
for (let i = 0; i < vertices.length; i += 3) {
cannonVertices.push(new CANNON.Vec3(vertices[i], vertices[i + 1], vertices[i + 2]));
}
const convexShape = new CANNON.ConvexPolyhedron({
vertices: cannonVertices,
faces: faces
});
Этот метод позволяет динамически создавать физические формы для моделей любой сложности, обеспечивая точное взаимодействие с другими телами в мире Cannon.js.
ConvexPolyhedron поддерживает
updateNormals() и computeEdges(), что
позволяет корректно пересчитывать параметры при изменении вершин на
лету.ConvexPolyhedron открывает широкие возможности для точного моделирования физики объектов любой формы, объединяя гибкость произвольной геометрии с высокой производительностью движка Cannon.js. Его интеграция с динамическими телами и возможность создавать формы из внешних 3D-моделей делают его незаменимым инструментом для продвинутой физической симуляции.