CFM: коэффициент смягчения ограничений

В библиотеке Oimo.js коэффициент смягчения ограничений (CFM, Constraint Force Mixing) играет ключевую роль в управлении стабильностью физических симуляций. CFM используется в ограничениях соединений (joints) и контактных взаимодействиях для того, чтобы смягчать жесткость системы и предотвращать численные раскачивания при интеграции.

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


Влияние CFM на физические ограничения

CFM используется совместно с параметром ERP (Error Reduction Parameter), который определяет скорость исправления ошибок ограничения. Совместное использование ERP и CFM позволяет балансировать жесткость и устойчивость:

  • Низкий CFM + высокий ERP — ограничение очень жесткое, ошибки быстро исправляются, но возможны численные нестабильности.
  • Высокий CFM + низкий ERP — ограничения мягкие, симуляция стабильнее, но ограничения могут «растягиваться».

В 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 означает почти жесткое ограничение, которое при этом позволяет избежать «дрожания» при численной интеграции.


Практические рекомендации по выбору CFM

  1. Жесткие соединения (например, шестерни или механизмы) требуют низких значений CFM: 1e-61e-4.
  2. Контакты тел с большой массой могут вызвать нестабильность при слишком жестких ограничениях, поэтому рекомендуется повышать CFM: 1e-41e-3.
  3. Симуляции с высоким числом ограничений (цепи, краны, сложные конструкции) выигрывают от умеренного CFM: 1e-41e-2.

CFM можно рассматривать как инструмент «подушки» между жесткостью модели и численной стабильностью. Недостаточное смягчение приводит к раскачке и «взрывам» симуляции, избыточное — к растягиванию ограничений и нереалистичной физике.


CFM в контактных взаимодействиях

Помимо соединений, CFM применяется и к контактным ограничениям тел. В Oimo.js каждый контакт генерирует constraint, для которого можно задать отдельный CFM. Это позволяет контролировать мягкость взаимодействия между телами:

world.broadphase.contactMaterial.cfm = 1e-4;
  • Низкие CFM для контактов создают жесткие столкновения с минимальной деформацией, что подходит для твердых тел.
  • Высокие CFM для контактов смягчают столкновения, уменьшая «вибрации» при столкновениях, полезно для мелких объектов или цепочек.

Совместное управление CFM для ограничений и контактов обеспечивает тонкую настройку поведения системы и предотвращает численные артефакты.


Влияние CFM на интеграцию

Oimo.js использует semi-implicit Euler или вариации интеграторов для обновления состояния тел. При высоких жесткостях ограничений численные ошибки интеграции накапливаются быстрее, вызывая раскачку или неконтролируемые силы. CFM действует как регуляризатор системы уравнений, добавляя небольшую «смягчающую» величину в матрицу ограничений, что делает ее обратимой и устойчивой.

Математически для каждого ограничения CFM добавляется в диагональ матрицы системы:

[ M^{-1} + CFM = b]

где ( ) — силы ограничения, ( M^{-1} ) — обратная матрица масс, ( b ) — вектор ошибок ограничения.

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


Настройка CFM для сложных систем

В больших механизмах или симуляциях с множеством соединений рекомендуется:

  • Использовать меньшие CFM для ключевых механических соединений, где точность критична.
  • Использовать большие CFM для вспомогательных соединений или контактов, чтобы снизить «шум» численной интеграции.
  • Экспериментировать с порядком величин: CFM 1e-51e-3 обычно обеспечивает баланс стабильности и реалистичности.
  • Объединять настройку CFM с массовыми коэффициентами (mass) и ERP, так как все эти параметры влияют на динамику.

CFM в Oimo.js является важнейшим инструментом контроля стабильности. Его правильное использование позволяет сочетать точность механических ограничений с устойчивостью симуляции, особенно при больших количествах соединений и контактов, обеспечивая плавное и реалистичное поведение физических тел в 3D-сценах.