Параметры решателя мягких тел: viterations, piterations

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


viterations — вертикальные итерации

Параметр viterations отвечает за количество итераций для внутренних сил мягкого тела, которые воздействуют на отдельные вершины сетки и обеспечивают их взаимное упругое взаимодействие. В основе лежит вычисление векторных сил между узлами, которые стремятся вернуть тело к исходной форме после деформации.

  • Повышение viterations: Увеличивает точность расчёта деформаций. Сетка мягкого тела ведет себя более естественно, уменьшается вероятность «пробивания» другими объектами или самопроникающей деформации.
  • Снижение viterations: Снижает нагрузку на процессор, ускоряет симуляцию, но может привести к неустойчивым и нереалистичным деформациям.

viterations рекомендуется подбирать в зависимости от размера сетки и жёсткости материала. Для больших мягких тел с плотной сеткой значение может достигать 20–40, для небольших объектов достаточно 5–10.

Пример создания мягкого тела с заданным числом вертикальных итераций:

let softBody = softBodyHelpers.CreateFromTriMesh(
    physicsWorld.getWorldInfo(),
    vertices,
    indices,
    indices.length / 3,
    true
);
softBody.get_m_cfg().set_viterations(20); // вертикальные итерации

piterations — позиционные итерации

Параметр piterations определяет количество итераций для позиционных ограничений, связанных с связями между вершинами и граничными условиями (например, фиксацией точек или столкновениями с твердыми объектами). Этот параметр регулирует конечную позицию вершин после применения всех сил и корректирует возможные смещения сетки.

  • Повышение piterations: Уменьшает вероятность проникновения мягкого тела в другие объекты. Улучшается соблюдение ограничений, таких как закрепленные вершины или столкновения с препятствиями.
  • Снижение piterations: Ускоряет симуляцию, но может вызвать «проваливание» тела через твердые объекты или разрыв сетки при сильных столкновениях.

Пример задания позиционных итераций:

softBody.get_m_cfg().set_piterations(10); // позиционные итерации

Взаимосвязь viterations и piterations

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

Параметр Основная задача Результат при увеличении
viterations Расчёт внутренних сил и упругости Более реалистичные деформации
piterations Обеспечение корректности позиционных ограничений Снижение проникновения сквозь объекты

Баланс параметров критически важен: слишком высокие значения обоих параметров увеличивают нагрузку на CPU и могут замедлить кадры до неприемлемого уровня, особенно при множестве мягких тел. Обычно рекомендуется увеличивать viterations для улучшения формы мягкого тела, а piterations для точности столкновений.


Практические рекомендации

  1. Малые объекты: viterations = 5–10, piterations = 5–10. Достаточно для стабильной симуляции и минимальной нагрузки.

  2. Средние объекты: viterations = 10–20, piterations = 8–15. Баланс между реализмом деформаций и корректностью столкновений.

  3. Большие или сложные сетки: viterations = 20–40, piterations = 10–20. Позволяет сохранить форму и предотвращает проникновение через другие объекты, но требует оптимизации кода и возможного понижения FPS.

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


Пример комплексной настройки мягкого тела

let softBody = softBodyHelpers.CreateFromTriMesh(
    physicsWorld.getWorldInfo(),
    vertices,
    indices,
    indices.length / 3,
    true
);

let sbConfig = softBody.get_m_cfg();
sbConfig.set_viterations(25); // точность внутренних сил
sbConfig.set_piterations(15); // точность ограничений
sbConfig.set_kDF(0.5);        // демпфирование
sbConfig.set_kPR(250);        // жёсткость пружин

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

Особенности симуляции при высоких итерациях

  • Стабильность: увеличенные итерации снижают вероятность самопроникающих деформаций.
  • Производительность: высокие значения могут замедлять симуляцию, особенно на больших сценах.
  • Реализм: оптимальные значения создают естественные колебания и упругость мягких тел без «скачков» вершин.

Настройка viterations и piterations является одним из ключевых шагов при работе с мягкими телами в Ammo.js, напрямую влияя на визуальное качество и физическую корректность симуляции.