Материалы мягкого тела: жёсткость, упругость

Ammo.js — это порт популярной библиотеки Bullet Physics на JavaScript, предоставляющий мощные средства для моделирования физики в браузере. Одним из сложнейших аспектов физического моделирования являются мягкие тела. В отличие от твердых тел, они деформируются под действием сил, и их поведение зависит от внутренней структуры и параметров материала.

Мягкие тела в Ammo.js представлены классом btSoftBody. Для их корректной работы необходимо учитывать несколько ключевых характеристик: жёсткость, упругость, массу, вязкость и сопротивление растяжению.


Структура мягкого тела

Мягкое тело состоит из вершин (nodes) и связей между ними (links или edges). Эти элементы формируют сетку, которая определяет форму объекта:

  • Nodes (узлы) — точки с массой, подчиняющиеся законам физики. Каждая вершина имеет позицию, скорость и массу.
  • Links (связи) — эластичные соединения между узлами. Они определяют, как тело сопротивляется растяжению и сжатию.
  • Faces (поверхности) — треугольные или квадратные поверхности, которые помогают визуализировать объект и влияют на столкновения.

Правильная конфигурация этих элементов критична для реалистичного поведения мягкого тела.


Параметры материала

Ammo.js позволяет задавать параметры материала через структуру btSoftBody::Material. Основные из них:

  • Linear Stiffness (m_kLST) — определяет жёсткость линейных связей. Чем выше значение, тем меньше растягиваются или сжимаются связи при приложении силы.
  • Angular Stiffness (m_kAST) — контролирует сопротивление изгибу. Значение влияет на то, насколько тело склонно «складываться» в углах.
  • Volume Stiffness (m_kVST) — сопротивление изменению объема. Важен для поддержания плотности мягкого тела при деформациях.

Пример настройки материала:

const softBodyMaterial = softBody.get_m_materials().at(0);
softBodyMaterial.set_m_kLST(0.9); // высокая жёсткость растяжения
softBodyMaterial.set_m_kAST(0.5); // среднее сопротивление изгибу
softBodyMaterial.set_m_kVST(0.7); // сопротивление изменению объема

Эти параметры напрямую влияют на упругость и реалистичность поведения объекта.


Настройка жёсткости и упругости

Жёсткость в контексте Ammo.js определяется сопротивлением связей растяжению и сжатию. Для мягких тел она настраивается не только через материал, но и через свойства самого объекта:

  • btSoftBody.setTotalMass(mass, fromFaces) — распределяет массу по узлам. Масса влияет на инерцию и динамику деформаций.
  • btSoftBody.generateBendingConstraints(angularStiffness) — добавляет изгибные связи между узлами, повышая сопротивление сгибанию.
  • btSoftBody.appendAnchor(nodeIndex, rigidBody, disableCollision) — фиксирует узел к твердому объекту для создания жестких точек.

Упругость задаётся коэффициентами m_kLST и m_kAST, а также коэффициентом демпфирования:

softBody.get_m_cfg().set_viterations(10); // количество итераций для вершин
softBody.get_m_cfg().set_piterations(10); // итерации для связей
softBody.get_m_cfg().set_kDF(0.3);       // демпфирование (0 — нет демпфирования, 1 — сильное)

Высокая жёсткость и низкое демпфирование создают упругое, но жесткое тело. Низкая жёсткость с умеренным демпфированием дает мягкое, плавно деформируемое тело.


Типы мягких тел и их применение

Ammo.js поддерживает несколько типов мягких тел:

  • Куски ткани (cloth) — плоские сетки, имитирующие одежду или флаги. Требуют высокой линейной и умеренной угловой жесткости для сохранения формы.
  • Меши с объемом (volume) — замкнутые объемные тела, подходящие для моделирования резиновых объектов или желе. Здесь критично сопротивление объему (m_kVST).
  • Нити и цепи (rope, chain) — длинные линейные тела. Жёсткость линейных связей контролирует изгиб и растяжение.

Каждый тип имеет собственные требования к параметрам: ткань может иметь низкую массу на узел, чтобы лучше колебаться, а объемные тела нуждаются в более высоких значениях m_kVST, чтобы сохранять форму.


Примеры конфигурации мягкого тела

Ткань с высокой упругостью:

const cloth = Ammo.btSoftBodyHelpers.CreatePatch(
    world.getWorldInfo(),
    new Ammo.btVector3(-5, 5, 0),
    new Ammo.btVector3(5, 5, 0),
    new Ammo.btVector3(-5, -5, 0),
    new Ammo.btVector3(5, -5, 0),
    31, 31, // сетка 31x31
    0, true
);

cloth.get_m_materials().at(0).set_m_kLST(0.8);
cloth.get_m_materials().at(0).set_m_kAST(0.5);
cloth.get_m_cfg().set_kDF(0.2); 
world.addSoftBody(cloth);

Объемный резиновый объект:

const volume = Ammo.btSoftBodyHelpers.CreateEllipsoid(
    world.getWorldInfo(),
    new Ammo.btVector3(0, 10, 0),
    new Ammo.btVector3(2, 2, 2),
    512
);

volume.get_m_materials().at(0).set_m_kLST(0.9);
volume.get_m_materials().at(0).set_m_kAST(0.7);
volume.get_m_materials().at(0).set_m_kVST(0.8);
volume.get_m_cfg().set_kDF(0.1);
world.addSoftBody(volume);

Эти примеры показывают, как параметры материала и конфигурации напрямую определяют поведение мягкого тела при столкновениях и деформациях.


Взаимодействие с твердыми телами

Мягкие тела могут сталкиваться и взаимодействовать с твердыми телами (btRigidBody). Для корректного взаимодействия важно:

  • Использовать setCollisionFlags с флагом CF_CHARACTER_OBJECT для мягкого тела, чтобы избежать чрезмерного проникновения в твердые объекты.
  • Настраивать коэффициенты трения и упругости для обеих сторон.
  • При необходимости фиксировать узлы к твердому телу через appendAnchor, чтобы симулировать привязанные ткани или ремни.

Оптимизация производительности

Мягкие тела могут быть ресурсоемкими. Основные способы оптимизации:

  • Уменьшение количества узлов и связей — снижает вычислительную нагрузку, особенно для больших объектов.
  • Сокращение количества итераций (viterations, piterations) — уменьшает точность, но ускоряет симуляцию.
  • Использование setTotalMass вместо индивидуальной массы узлов — упрощает расчёты.

Баланс между реалистичностью и производительностью достигается экспериментальным подбором параметров материала и сетки.


Жёсткость и упругость в Ammo.js — это сочетание свойств материала, конфигурации мягкого тела и взаимодействий с окружающей средой. Глубокое понимание этих параметров позволяет создавать реалистичные ткани, резиновые объекты и динамичные объемные тела с точным контролем поведения в симуляции.