btConvexHullShape — это класс в библиотеке Ammo.js, предназначенный для создания выпуклых коллизий на основе произвольного набора точек. Он реализует структуру данных, которая автоматически формирует минимальную выпуклую оболочку вокруг заданного множества вершин, позволяя использовать сложные формы для физического моделирования без необходимости вручную задавать полигоны.
Конструктор принимает массив координат точек в формате
Float32Array или обычного массива чисел. Каждая точка
задается тройкой координат [x, y, z]. Для добавления точек
можно использовать методы addPoint или передавать массив
сразу при инициализации:
const points = [
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 hullShape = new Ammo.btConvexHullShape();
for (let i = 0; i < points.length; i += 3) {
const point = new Ammo.btVector3(points[i], points[i + 1], points[i + 2]);
hullShape.addPoint(point, true); // true — пересчитывать локальный AABB после добавления
}
recalcLocalAabb
контролирует пересчет локальной оси ограничивающего блока (AABB). Если
добавляется много точек, рекомендуется сначала добавить все точки с
false, а затем вызвать recalcLocalAabb один
раз для оптимизации.hullShape.setMargin(0.05);
hullShape.setLocalScaling(new Ammo.btVector3(2, 1, 1));
btConvexHullShape автоматически строит выпуклую
оболочку, но при большом количестве точек важно оптимизировать
процесс:
recalcLocalAabb=false, а затем вызвать
recalcLocalAabb() один раз.setLocalScaling дешевле, чем пересоздание
оболочки.Выпуклые оболочки особенно эффективны для сложных, но все еще выпуклых объектов:
const mass = 1;
const localInertia = new Ammo.btVector3(0, 0, 0);
hullShape.calculateLocalInertia(mass, localInertia);
const transform = new Ammo.btTransform();
transform.setIdentity();
transform.setOrigin(new Ammo.btVector3(0, 5, 0));
const motionState = new Ammo.btDefaultMotionState(transform);
const rbInfo = new Ammo.btRigidBodyConstructionInfo(mass, motionState, hullShape, localInertia);
const body = new Ammo.btRigidBody(rbInfo);
physicsWorld.addRigidBody(body);
btDiscreteDynamicsWorld.btBvhTriangleMeshShape), так как
btConvexHullShape не поддерживает вогнутости.i в виде btVector3.btConvexHullShape для динамических
объектов, так как он обеспечивает стабильное столкновение.btConvexHullShape является мощным инструментом для
физического моделирования сложных объектов с минимальными усилиями по
построению геометрии и обеспечивает баланс между точностью и
производительностью при использовании в Ammo.js.