ConvexHullGeometry — это специализированный тип геометрии в Oimo.js, предназначенный для создания выпуклых физических тел на основе набора вершин. Используется в основном для симуляции сложных объектов с произвольной формой, где стандартные примитивы (куб, сфера, цилиндр) не подходят. Выпуклый многогранник гарантирует корректное поведение при столкновениях и стабильную физическую симуляцию.
[x, y, z]. Эти вершины
формируют выпуклую оболочку, которая и используется движком для расчёта
столкновений.0.01).import * as OIMO from 'oimo';
const vertices = [
[-1, -1, -1],
[1, -1, -1],
[1, 1, -1],
[-1, 1, -1],
[-1, -1, 1],
[1, -1, 1],
[1, 1, 1],
[-1, 1, 1]
];
const convexGeometry = new OIMO.ConvexHullGeometry(vertices, 0.01);
Для того чтобы объект начал участвовать в физической симуляции,
необходимо обернуть ConvexHullGeometry в
RigidBody и добавить в мир:
const bodyConfig = new OIMO.RigidBodyConfig();
bodyConfig.type = OIMO.RigidBodyType.DYNAMIC;
const body = new OIMO.RigidBody(bodyConfig);
body.addShape(new OIMO.Shape(convexGeometry));
world.addRigidBody(body);
Ключевые моменты:
DYNAMIC, STATIC,
KINEMATIC) определяет, как объект будет реагировать на силы
и столкновения.ConvexHullGeometry предполагает
динамические тела, так как статические объекты проще моделировать
примитивами.Вершины можно генерировать из трёхмерной модели или вручную. Основное требование — все точки должны образовывать выпуклую оболочку, иначе движок сам построит минимальную выпуклую оболочку.
Пример генерации вершин для произвольного многогранника:
function generateRandomVertices(count, radius) {
const vertices = [];
for (let i = 0; i < count; i++) {
const theta = Math.random() * 2 * Math.PI;
const phi = Math.random() * Math.PI;
const x = radius * Math.sin(phi) * Math.cos(theta);
const y = radius * Math.sin(phi) * Math.sin(theta);
const z = radius * Math.cos(phi);
vertices.push([x, y, z]);
}
return vertices;
}
const randomVertices = generateRandomVertices(20, 1);
const randomConvex = new OIMO.ConvexHullGeometry(randomVertices, 0.02);
0 — абсолютно неупругое, 1 — идеально
упругое.const shape = new OIMO.Shape(convexGeometry);
shape.friction = 0.5;
shape.restitution = 0.3;
body.addShape(shape);
body.linearDamping = 0.1;
body.angularDamping = 0.1;
const mesh = new THREE.Mesh(geometry, material);
mesh.position.copy(body.getPosition());
mesh.quaternion.copy(body.getQuaternion());
Такое взаимодействие позволяет создавать динамичные сцены с реальной физикой для сложных форм.
vertices.ConvexHullGeometry предоставляет мощный инструмент для симуляции сложных объектов с произвольными формами, сохраняя стабильность столкновений и управляемость физики, что делает его неотъемлемым элементом продвинутых проектов на Oimo.js.