В библиотеке Oimo.js коэффициент смягчения ограничений (CFM, Constraint Force Mixing) играет ключевую роль в управлении стабильностью физических симуляций. CFM используется в ограничениях соединений (joints) и контактных взаимодействиях для того, чтобы смягчать жесткость системы и предотвращать численные раскачивания при интеграции.
CFM выражается как числовой параметр, обычно в диапазоне от 0 до 1, где 0 соответствует полностью жесткому ограничению, а значения, близкие к 1, делают ограничение максимально мягким. Это означает, что при увеличении CFM система допускает небольшие отклонения от строго заданных ограничений, что повышает стабильность симуляции при высокой нагрузке или сложных взаимодействиях.
CFM используется совместно с параметром ERP (Error Reduction Parameter), который определяет скорость исправления ошибок ограничения. Совместное использование ERP и CFM позволяет балансировать жесткость и устойчивость:
В Oimo.js эти параметры задаются для каждого ограничения при его создании, например, для hinge joint:
var hinge = new OIMO.HingeJoint(body1, body2, {
pivot: [0, 1, 0],
axis: [0, 1, 0],
limit: [-Math.PI/4, Math.PI/4],
cfm: 1e-5,
erp: 0.8
});
В данном примере cfm = 1e-5 означает почти жесткое ограничение, которое при этом позволяет избежать «дрожания» при численной интеграции.
1e-6–1e-4.1e-4–1e-3.1e-4–1e-2.CFM можно рассматривать как инструмент «подушки» между жесткостью модели и численной стабильностью. Недостаточное смягчение приводит к раскачке и «взрывам» симуляции, избыточное — к растягиванию ограничений и нереалистичной физике.
Помимо соединений, CFM применяется и к контактным ограничениям тел. В Oimo.js каждый контакт генерирует constraint, для которого можно задать отдельный CFM. Это позволяет контролировать мягкость взаимодействия между телами:
world.broadphase.contactMaterial.cfm = 1e-4;
Совместное управление CFM для ограничений и контактов обеспечивает тонкую настройку поведения системы и предотвращает численные артефакты.
Oimo.js использует semi-implicit Euler или вариации интеграторов для обновления состояния тел. При высоких жесткостях ограничений численные ошибки интеграции накапливаются быстрее, вызывая раскачку или неконтролируемые силы. CFM действует как регуляризатор системы уравнений, добавляя небольшую «смягчающую» величину в матрицу ограничений, что делает ее обратимой и устойчивой.
Математически для каждого ограничения CFM добавляется в диагональ матрицы системы:
[ M^{-1} + CFM = b]
где ( ) — силы ограничения, ( M^{-1} ) — обратная матрица масс, ( b ) — вектор ошибок ограничения.
Это позволяет решателю находить приближенное решение даже при почти сингулярных конфигурациях.
В больших механизмах или симуляциях с множеством соединений рекомендуется:
1e-5–1e-3 обычно обеспечивает баланс
стабильности и реалистичности.mass) и ERP, так как все эти параметры
влияют на динамику.CFM в Oimo.js является важнейшим инструментом контроля стабильности. Его правильное использование позволяет сочетать точность механических ограничений с устойчивостью симуляции, особенно при больших количествах соединений и контактов, обеспечивая плавное и реалистичное поведение физических тел в 3D-сценах.