В библиотеке Ammo.js модуль для мягких тел
предоставляет возможность моделировать ткани, сетки и гибкие объекты с
помощью функции CreatePatch. Она позволяет создавать сетку
из точек (nodes), соединённых упругими связями, которая реагирует на
силы и столкновения в физическом мире. Эта функция особенно полезна для
имитации флагов, одежд, мягких поверхностей и других динамических
объектов с большим числом степеней свободы.
Функция CreatePatch имеет следующий базовый вид:
softBody = softBodyHelpers.CreatePatch(
worldInfo,
corner00, corner01, corner10, corner11,
resX, resY,
fixedCorners,
gendiags
);
softBodyWorldInfo).btVector3) четырёх углов сетки. Они задают геометрию
прямоугольного участка ткани.1 фиксирует первый угол, 3 —
три угла.const softBodyHelpers = new Ammo.btSoftBodyHelpers();
const corner00 = new Ammo.btVector3(-5, 5, 0);
const corner01 = new Ammo.btVector3(5, 5, 0);
const corner10 = new Ammo.btVector3(-5, -5, 0);
const corner11 = new Ammo.btVector3(5, -5, 0);
const resX = 31;
const resY = 31;
const fixedCorners = 3;
const gendiags = true;
const patch = softBodyHelpers.CreatePatch(
physicsWorld.getWorldInfo(),
corner00, corner01, corner10, corner11,
resX, resY,
fixedCorners,
gendiags
);
patch.get_m_materials().at(0).set_m_kLST(0.9); // линейная упругость
patch.get_m_cfg().set_kDP(0.01); // демпфирование воздуха
patch.setTotalMass(1, true);
physicsWorld.addSoftBody(patch);
В этом примере создаётся сетка 31×31 узел с фиксированными тремя углами и диагональными связями. kLST отвечает за упругость материала, а kDP — за демпфирование, предотвращающее чрезмерные колебания.
Мягкие тела в Ammo.js обладают множеством параметров, влияющих на поведение ткани:
Упругость и растяжение
kLST — линейная упругость, сопротивление растяжению
вдоль связей.kAST — упругость при изгибе.kVST — упругость объёмных деформаций.Демпфирование
kDP — демпфирование воздушного сопротивления, уменьшает
скорость колебаний.kDG — демпфирование изгибов и растяжений в связях.Масса и распределение
setTotalMass(mass, fromFaces) — устанавливает общую
массу ткани. Параметр fromFaces указывает, распределять ли
массу пропорционально поверхностям.Фрикция и столкновения
setFriction(friction) — коэффициент трения при
контактах с другими объектами.get_m_cfg().set_kCHR(value) — коэффициент столкновений
с твердыми телами.Закрепление углов или отдельных узлов позволяет создать эффекты подвешенной ткани:
patch.setMass(0, 0); // первый узел фиксирован
patch.setMass(31, 0); // второй узел фиксирован
Фиксированные узлы имеют нулевую массу, что предотвращает их движение под действием силы гравитации.
Включение gendiags создаёт диагональные связи между соседними узлами сетки. Это критично для:
Без диагоналей сетка может «растекаться» по диагонали и вести себя нестабильно при высокой скорости симуляции.
Ткани, созданные через CreatePatch, полностью
интегрируются в мир Ammo.js:
btRigidBody).Применение CreatePatch совместно с параметрами
демпфирования, упругости и фиксированных узлов
позволяет точно настраивать динамику ткани, создавая стабильные и
визуально правдоподобные симуляции в реальном времени.
Модель ткани, созданная через CreatePatch, представляет
собой сетку узлов, соединённых упругими связями.
Основные компоненты:
Такое сочетание позволяет создавать ткани с широким спектром поведения: от мягких и гибких до плотных и почти жёстких.