Создание объёмного мягкого тела: CreateFromTriMesh

В Ammo.js мягкие тела (soft bodies) представляют собой физические объекты с деформируемой структурой, способные реагировать на силы и столкновения реалистично. Метод CreateFromTriMesh позволяет создавать объёмные мягкие тела на основе треугольной сетки, что делает его ключевым инструментом для моделирования тканей, мешков, подушек и других деформируемых объектов.


Принципы работы CreateFromTriMesh

Метод CreateFromTriMesh строит мягкое тело на основе:

  1. Вершин (vertices) – массив координат точек сетки, обычно представлен в виде [x0, y0, z0, x1, y1, z1, ...].
  2. Индексов треугольников (indices) – массив индексов вершин, формирующих треугольники сетки.
  3. Массы точек и физических параметров, задаваемых при инициализации тела.

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


Создание треугольной сетки

Для корректного создания мягкого тела необходимо подготовить массивы вершин и индексов:

const vertices = [
    -1, 1, -1,
    1, 1, -1,
    1, 1, 1,
    -1, 1, 1,
    -1, -1, -1,
    1, -1, -1,
    1, -1, 1,
    -1, -1, 1
];

const indices = [
    0, 1, 2, 0, 2, 3, // верхняя грань
    4, 5, 6, 4, 6, 7, // нижняя грань
    0, 1, 5, 0, 5, 4, // передняя грань
    1, 2, 6, 1, 6, 5, // правая грань
    2, 3, 7, 2, 7, 6, // задняя грань
    3, 0, 4, 3, 4, 7  // левая грань
];

Эта структура задаёт куб, каждая грань которого разбита на два треугольника. Количество вершин и треугольников может быть произвольным, но для стабильной симуляции мягкого тела рекомендуется избегать слишком мелких или слишком крупных треугольников.


Инициализация мягкого тела

Создание мягкого тела через CreateFromTriMesh выполняется следующим образом:

const softBodyHelpers = new Ammo.btSoftBodyHelpers();
const softBody = softBodyHelpers.CreateFromTriMesh(
    physicsWorld.getWorldInfo(),
    vertices,
    indices,
    indices.length / 3,
    true // флаг для фиксирования вершин на гранях
);

Параметры метода:

  • getWorldInfo() – объект btSoftBodyWorldInfo, содержащий параметры мировой симуляции (гравитацию, шаг интеграции и т.д.).
  • vertices – массив координат вершин.
  • indices – массив индексов треугольников.
  • triangles – количество треугольников (indices.length / 3).
  • randomizeConstraints – булев флаг, указывающий, нужно ли слегка смещать точки для устойчивости симуляции.

Настройка физических свойств

После создания мягкого тела важно задать физические параметры:

softBody.get_m_cfg().set_viterations(40); // количество вершинных итераций
softBody.get_m_cfg().set_piterations(40); // количество итераций для каркаса
softBody.get_m_cfg().set_kDF(0.5);        // демпфирование движений
softBody.get_m_cfg().set_kDP(0.01);       // демпфирование давления
softBody.get_m_materials().at(0).set_m_kLST(0.9); // жёсткость рёбер
softBody.setTotalMass(1, false);          // общая масса мягкого тела

Основные параметры конфигурации:

  • viterations – количество итераций для вершинных ограничений, повышает точность движения вершин.
  • piterations – количество итераций для каркаса, влияет на стабильность формы.
  • kDF – демпфирование линейного движения (0–1).
  • kDP – демпфирование давления внутри тела.
  • m_kLST – локальная жёсткость рёбер (чем выше, тем меньше деформации).

Привязка к мировой физике

После настройки физики мягкое тело необходимо добавить в мир Ammo.js:

physicsWorld.addSoftBody(softBody, 1, -1);

Параметры метода:

  • 1 – коллизия с объектами динамического типа.
  • -1 – коллизия с объектами статического типа.

Таким образом, мягкое тело начинает взаимодействовать с другими объектами, реагируя на столкновения и гравитацию.


Фиксация вершин и ограничений

Для имитации закреплённых участков можно закрепить вершины:

softBody.appendAnchor(0, rigidBody, false, 1.0); // закрепление первой вершины к твёрдому объекту
  • appendAnchor(vertexIndex, rigidBody, disableCollision, influence) – привязывает вершину к жёсткому телу.
  • disableCollision – отключает коллизию между вершиной и твёрдым телом.
  • influence – сила привязки (1.0 – полное закрепление).

Закрепление позволяет создавать сцены с натянутыми тканями, подвешенными объектами и моделировать сложные механизмы.


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

При работе с большими мягкими телами следует учитывать:

  1. Разделение сетки на треугольники равного размера – повышает стабильность интеграции.
  2. Умеренное количество итераций – слишком большое число итераций замедляет симуляцию, слишком маленькое – приводит к нестабильности.
  3. Использование randomizeConstraints – уменьшает артефакты и «склеивание» рёбер.
  4. Контроль массы и жёсткости – чрезмерно лёгкие или мягкие тела могут вести себя нестабильно.

Практические применения

Метод CreateFromTriMesh широко используется для:

  • Моделирования тканей и одежды в 3D-играх и симуляторах.
  • Создания подушек, мешков и мягких объектов в интерактивных сценах.
  • Физического взаимодействия с жидкостями и твёрдыми объектами, где необходима деформация.

Использование треугольной сетки даёт полный контроль над геометрией и обеспечивает реалистичное поведение мягкого тела в любых сценариях.


Если требуется, могу подготовить подробный пример сцены с визуализацией мягкого тела, включая взаимодействие с твёрдыми объектами и закрепление вершин.