btBvhTriangleMeshShape — это специализированный класс в
Ammo.js, предназначенный для создания коллизий на
основе статических треугольных сеток. В отличие от простых примитивов,
таких как btBoxShape или btSphereShape, данная
структура позволяет моделировать сложные геометрии, сохраняя высокую
точность для статических объектов сцены. Она не предназначена для
динамических тел, так как использование динамических треугольных мешей
может привести к падению производительности и нестабильной физике.
btConvexHullShape или
btCompoundShape.Примечание: BVH строится один раз при создании меша и не обновляется динамически, что делает эту форму эффективной для сложных сцен с большим количеством статических объектов.
Для построения точной коллизии требуется сначала собрать геометрию с
помощью btTriangleMesh. Пример последовательности
действий:
// Создание контейнера для треугольников
let triangleMesh = new Ammo.btTriangleMesh();
// Добавление треугольников
triangleMesh.addTriangle(
new Ammo.btVector3(0, 0, 0),
new Ammo.btVector3(1, 0, 0),
new Ammo.btVector3(0, 1, 0),
true
);
// Создание точной сеточной формы
let useQuantizedAabbCompression = true; // оптимизация памяти и скорости
let meshShape = new Ammo.btBvhTriangleMeshShape(triangleMesh, useQuantizedAabbCompression);
Ключевые моменты при создании:
addTriangle(v0, v1, v2, removeDuplicateVertices) —
добавляет треугольник, параметр removeDuplicateVertices
помогает экономить память, объединяя одинаковые вершины.useQuantizedAabbCompression — сжатие AABB ускоряет
столкновения и уменьшает расход памяти, рекомендуется включать для
больших мешей.btBvhTriangleMeshShape работает с
btRigidBody, но только как статическое тело. Для этого
используется btRigidBodyConstructionInfo с нулевой
массой:
let mass = 0; // статическое тело
let localInertia = new Ammo.btVector3(0, 0, 0);
let rbInfo = new Ammo.btRigidBodyConstructionInfo(mass, new Ammo.btDefaultMotionState(), meshShape, localInertia);
let body = new Ammo.btRigidBody(rbInfo);
physicsWorld.addRigidBody(body);
Особенности:
btBvhTriangleMeshShape не
требует вычисления инерции.setWorldTransform), но физический расчет столкновений с
динамическими телами будет корректен только для текущей позиции.btBvhTriangleMeshShape, чтобы избежать долгого построения
BVH и ускорить рендеринг.Для корректного взаимодействия с динамическими телами необходимо учитывать:
let transform = new Ammo.btTransform();
transform.setIdentity();
transform.setOrigin(new Ammo.btVector3(10, 0, -5));
body.setWorldTransform(transform);
setIdentity() сбрасывает предыдущую трансформацию.setOrigin() перемещает тело в заданное положение.setRotation(quaternion),
где quaternion — btQuaternion.Динамические объекты будут корректно реагировать на столкновения с этим телом без необходимости пересчитывать BVH, так как BVH рассчитан для статичных объектов.
btGImpactMeshShape.btCompoundShape для комбинирования
нескольких статических мешей.btBvhTriangleMeshShape — основной инструмент для
создания высокоточных статических коллизий в Ammo.js. Его правильное
использование обеспечивает реалистичные взаимодействия динамических тел
с статической сценой без потери производительности на больших мешах.