Создание мягкого тела из сетки: btSoftBodyHelpers

Библиотека 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

  1. Подушки и ткани — генерация квадратной сетки с равномерным распределением вершин и треугольников, настройка линейной и угловой упругости для реалистичного поведения.
  2. Моделирование жидкости в меше — создание гибких оболочек, которые повторяют движение жидкости или геля, с низкой упругостью и высокой вязкостью.
  3. Объекты с коллизией — мягкие тела могут взаимодействовать с твердыми объектами сцены, что позволяет создавать сцены с падением и столкновениями мягких предметов.

Оптимизация мягких тел

Для стабильной работы следует учитывать:

  • Слишком большое количество итераций (viterations и piterations) повышает точность, но снижает производительность.
  • Большие сетки требуют больше вычислительных ресурсов и могут замедлять обновление рендеринга.
  • Настройка массы и коэффициентов упругости должна соответствовать масштабу сцены.

Использование btSoftBodyHelpers позволяет быстро создавать сложные мягкие объекты, управлять их физическими свойствами и интегрировать в симуляцию Ammo.js, обеспечивая реалистичное поведение тканей, подушек и гибких оболочек.