Ammo.js — это порт популярной библиотеки Bullet Physics на JavaScript, предоставляющий мощные средства для моделирования физики в браузере. Одним из сложнейших аспектов физического моделирования являются мягкие тела. В отличие от твердых тел, они деформируются под действием сил, и их поведение зависит от внутренней структуры и параметров материала.
Мягкие тела в Ammo.js представлены классом btSoftBody.
Для их корректной работы необходимо учитывать несколько ключевых
характеристик: жёсткость, упругость,
массу, вязкость и
сопротивление растяжению.
Мягкое тело состоит из вершин (nodes) и связей между ними (links или edges). Эти элементы формируют сетку, которая определяет форму объекта:
Правильная конфигурация этих элементов критична для реалистичного поведения мягкого тела.
Ammo.js позволяет задавать параметры материала через структуру
btSoftBody::Material. Основные из них:
m_kLST) — определяет
жёсткость линейных связей. Чем выше значение, тем меньше растягиваются
или сжимаются связи при приложении силы.m_kAST) —
контролирует сопротивление изгибу. Значение влияет на то, насколько тело
склонно «складываться» в углах.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 поддерживает несколько типов мягких тел:
m_kVST).Каждый тип имеет собственные требования к параметрам: ткань может
иметь низкую массу на узел, чтобы лучше колебаться, а объемные тела
нуждаются в более высоких значениях 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 — это сочетание свойств материала, конфигурации мягкого тела и взаимодействий с окружающей средой. Глубокое понимание этих параметров позволяет создавать реалистичные ткани, резиновые объекты и динамичные объемные тела с точным контролем поведения в симуляции.