Библиотека Ammo.js предоставляет возможность моделирования мягких тел
с использованием механизма физики Bullet Physics, перенесённого в среду
JavaScript через WebAssembly. Для создания сложных мягких объектов
используется класс btSoftBodyHelpers, который позволяет
генерировать мягкие тела из сеток вершин, линий и треугольников.
Мягкое тело — это объект, который деформируется под воздействием сил,
сохраняя физические свойства материала, такие как упругость, вязкость и
масса. В Ammo.js мягкие тела управляются через объект
btSoftBody, а их генерация упрощается с помощью
вспомогательных функций btSoftBodyHelpers.
btSoftBodyHelpers предоставляет метод
CreateFromTriMesh, который позволяет создавать мягкое тело
на основе треугольной сетки. Основной синтаксис:
let softBody = Ammo.btSoftBodyHelpers.CreateFromTriMesh(
physicsWorld.getWorldInfo(),
vertices,
indices,
numTriangles,
true
);
Параметры:
physicsWorld.getWorldInfo() — структура, содержащая
параметры физического мира, включая гравитацию и информацию о
коллизиях.vertices — массив координат вершин в формате
[x1, y1, z1, x2, y2, z2, ...].indices — массив индексов треугольников в формате
[i1, i2, i3, i4, i5, i6, ...].numTriangles — количество треугольников в сетке.true/false — флаг сглаживания нормалей
(true создаёт сглаженные нормали, улучшая визуализацию
деформации).После создания мягкого тела необходимо настроить его физические свойства:
softBody.get_m_cfg().set_viterations(40); // количество итераций по вершинам
softBody.get_m_cfg().set_piterations(40); // количество итераций по треугольникам
softBody.get_m_materials().at(0).set_m_kLST(0.9); // линейная упругость
softBody.get_m_materials().at(0).set_m_kAST(0.9); // угловая упругость
softBody.setTotalMass(1, false); // общая масса тела
Ключевые параметры материала:
m_kLST — линейная упругость (Linear Stiffness),
контролирует сопротивление растяжению.m_kAST — угловая упругость (Angular Stiffness),
контролирует сопротивление скручиванию.m_kVST — вязкость (Volume Stiffness), управляет
сопротивлением сжатию объема.После создания мягкого тела необходимо добавить его в физический мир:
physicsWorld.addSoftBody(softBody, 1, -1);
Параметры метода addSoftBody:
softBody — объект мягкого тела.1 — коллизионная группа (обычно 1 для всех
объектов).-1 — маска коллизий (по умолчанию взаимодействует со
всеми объектами).Для динамики мягкого тела важны гравитация и сцепление с другими объектами:
softBody.setGravity(new Ammo.btVector3(0, -9.8, 0));
softBody.get_m_cfg().set_collisions(0x11); // столкновения с триангулярными и твердыми телами
Мягкие тела создаются из вершин, каждая из которых может перемещаться под воздействием сил. Для синхронизации с визуальным представлением необходимо обновлять позиции вершин в рендере:
let nodes = softBody.get_m_nodes();
for (let i = 0; i < nodes.size(); i++) {
let node = nodes.at(i);
let pos = node.get_m_x();
mesh.geometry.attributes.position.setXYZ(i, pos.x(), pos.y(), pos.z());
}
mesh.geometry.attributes.position.needsUpdate = true;
Особенности визуализации:
position.needsUpdate = true обязательно
для обновления геометрии.btSoftBodyHelpersДля стабильной работы следует учитывать:
viterations и
piterations) повышает точность, но снижает
производительность.Использование btSoftBodyHelpers позволяет быстро
создавать сложные мягкие объекты, управлять их физическими свойствами и
интегрировать в симуляцию Ammo.js, обеспечивая реалистичное поведение
тканей, подушек и гибких оболочек.