В Ammo.js мягкие тела (soft bodies) представляют
собой физические объекты с деформируемой структурой, способные
реагировать на силы и столкновения реалистично. Метод
CreateFromTriMesh позволяет создавать объёмные мягкие тела
на основе треугольной сетки, что делает его ключевым инструментом для
моделирования тканей, мешков, подушек и других деформируемых
объектов.
CreateFromTriMeshМетод CreateFromTriMesh строит мягкое тело на
основе:
vertices) – массив координат
точек сетки, обычно представлен в виде
[x0, y0, z0, x1, y1, z1, ...].indices) –
массив индексов вершин, формирующих треугольники сетки.Каждый треугольник в сетке становится частью физической структуры: вершины соединяются рёбрами, рёбра образуют каркас, а каркас подчиняется законам мягкого тела. Это обеспечивает реалистичное поведение под нагрузкой.
Для корректного создания мягкого тела необходимо подготовить массивы вершин и индексов:
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 indices = [
0, 1, 2, 0, 2, 3, // верхняя грань
4, 5, 6, 4, 6, 7, // нижняя грань
0, 1, 5, 0, 5, 4, // передняя грань
1, 2, 6, 1, 6, 5, // правая грань
2, 3, 7, 2, 7, 6, // задняя грань
3, 0, 4, 3, 4, 7 // левая грань
];
Эта структура задаёт куб, каждая грань которого разбита на два треугольника. Количество вершин и треугольников может быть произвольным, но для стабильной симуляции мягкого тела рекомендуется избегать слишком мелких или слишком крупных треугольников.
Создание мягкого тела через CreateFromTriMesh
выполняется следующим образом:
const softBodyHelpers = new Ammo.btSoftBodyHelpers();
const softBody = softBodyHelpers.CreateFromTriMesh(
physicsWorld.getWorldInfo(),
vertices,
indices,
indices.length / 3,
true // флаг для фиксирования вершин на гранях
);
Параметры метода:
getWorldInfo() – объект
btSoftBodyWorldInfo, содержащий параметры мировой симуляции
(гравитацию, шаг интеграции и т.д.).vertices – массив координат вершин.indices – массив индексов треугольников.triangles – количество треугольников
(indices.length / 3).randomizeConstraints – булев флаг, указывающий, нужно
ли слегка смещать точки для устойчивости симуляции.После создания мягкого тела важно задать физические параметры:
softBody.get_m_cfg().set_viterations(40); // количество вершинных итераций
softBody.get_m_cfg().set_piterations(40); // количество итераций для каркаса
softBody.get_m_cfg().set_kDF(0.5); // демпфирование движений
softBody.get_m_cfg().set_kDP(0.01); // демпфирование давления
softBody.get_m_materials().at(0).set_m_kLST(0.9); // жёсткость рёбер
softBody.setTotalMass(1, false); // общая масса мягкого тела
Основные параметры конфигурации:
После настройки физики мягкое тело необходимо добавить в мир Ammo.js:
physicsWorld.addSoftBody(softBody, 1, -1);
Параметры метода:
Таким образом, мягкое тело начинает взаимодействовать с другими объектами, реагируя на столкновения и гравитацию.
Для имитации закреплённых участков можно закрепить вершины:
softBody.appendAnchor(0, rigidBody, false, 1.0); // закрепление первой вершины к твёрдому объекту
appendAnchor(vertexIndex, rigidBody, disableCollision, influence)
– привязывает вершину к жёсткому телу.disableCollision – отключает коллизию между вершиной и
твёрдым телом.influence – сила привязки (1.0 – полное
закрепление).Закрепление позволяет создавать сцены с натянутыми тканями, подвешенными объектами и моделировать сложные механизмы.
При работе с большими мягкими телами следует учитывать:
randomizeConstraints –
уменьшает артефакты и «склеивание» рёбер.Метод CreateFromTriMesh широко используется для:
Использование треугольной сетки даёт полный контроль над геометрией и обеспечивает реалистичное поведение мягкого тела в любых сценариях.
Если требуется, могу подготовить подробный пример сцены с визуализацией мягкого тела, включая взаимодействие с твёрдыми объектами и закрепление вершин.