В 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 для точности столкновений.
Малые объекты: viterations = 5–10,
piterations = 5–10. Достаточно для стабильной симуляции и
минимальной нагрузки.
Средние объекты:
viterations = 10–20, piterations = 8–15.
Баланс между реализмом деформаций и корректностью столкновений.
Большие или сложные сетки:
viterations = 20–40, piterations = 10–20.
Позволяет сохранить форму и предотвращает проникновение через другие
объекты, но требует оптимизации кода и возможного понижения
FPS.
Тестирование: При изменении материала или размера сетки рекомендуется постепенно увеличивать значения, наблюдая за стабильностью симуляции и нагрузкой на процессор.
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, напрямую влияя на визуальное качество и физическую
корректность симуляции.