Создание ткани: CreatePatch

В библиотеке Ammo.js модуль для мягких тел предоставляет возможность моделировать ткани, сетки и гибкие объекты с помощью функции CreatePatch. Она позволяет создавать сетку из точек (nodes), соединённых упругими связями, которая реагирует на силы и столкновения в физическом мире. Эта функция особенно полезна для имитации флагов, одежд, мягких поверхностей и других динамических объектов с большим числом степеней свободы.


Синтаксис и параметры CreatePatch

Функция CreatePatch имеет следующий базовый вид:

softBody = softBodyHelpers.CreatePatch(
    worldInfo,
    corner00, corner01, corner10, corner11,
    resX, resY,
    fixedCorners,
    gendiags
);
  • worldInfo — объект физического мира Ammo.js, содержащий информацию о гравитации и настройках мягких тел (softBodyWorldInfo).
  • corner00, corner01, corner10, corner11 — вектора (btVector3) четырёх углов сетки. Они задают геометрию прямоугольного участка ткани.
  • resX, resY — количество сегментов по горизонтали и вертикали. Чем больше значения, тем более детализированной и гибкой будет ткань.
  • fixedCorners — целое число, определяющее, какие углы остаются фиксированными. Используется для имитации закрепления ткани. Например, 1 фиксирует первый угол, 3 — три угла.
  • gendiags — булевый параметр, определяющий, будут ли автоматически созданы диагональные связи (диагонали) между узлами. Диагонали повышают стабильность симуляции и предотвращают чрезмерное растяжение.

Пример создания мягкой ткани

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, представляет собой сетку узлов, соединённых упругими связями. Основные компоненты:

  1. Узлы (nodes) — точки с массой, координатами и скоростью.
  2. Связи (links) — пружины между узлами, определяющие растяжимость.
  3. Материалы (materials) — свойства упругости, демпфирования и коллизий.
  4. Фиксированные узлы — точки, закреплённые для управления положением ткани.
  5. Диагонали — дополнительные связи для повышения стабильности сетки.

Такое сочетание позволяет создавать ткани с широким спектром поведения: от мягких и гибких до плотных и почти жёстких.