В физическом движке Oimo.js столкновения между телами обрабатываются с учётом не только упругости и массы объектов, но и коэффициентов трения. При взаимодействии двух объектов с различными коэффициентами трения возникает необходимость корректного вычисления результирующего трения, чтобы симуляция оставалась реалистичной и стабильной.
Каждое тело в Oimo.js может иметь два основных параметра трения:
Значение friction задаётся числом от 0 до 1, где 0 соответствует полному отсутствию трения, а 1 – максимально возможному сопротивлению.
При столкновении двух тел с коэффициентами трения μ₁ и
μ₂ результирующий коэффициент трения
μ_combined обычно рассчитывается через одну из стандартных
формул:
Минимум коэффициентов трения: [ μ_{combined} = (μ₁, μ₂)] Эта формула используется для симуляций, где трение ограничено самым «скользким» материалом, что предотвращает чрезмерное сопротивление скольжению.
Среднее арифметическое: [ μ_{combined} = ] Применяется для более сбалансированного поведения, особенно когда оба материала имеют схожие свойства.
Произведение коэффициентов трения: [ μ_{combined} = μ₁ × μ₂] Используется реже, обычно для моделирования взаимодействия специфических покрытий с нелинейными эффектами трения.
В Oimo.js по умолчанию применяется метод уменьшения трения до меньшего коэффициента, что обеспечивает более предсказуемую и стабильную физику.
Пример настройки столкновения двух тел с учётом комбинированного трения:
// Создание тел
let box1 = new OIMO.Body({
type: 'box',
size: [1,1,1],
friction: 0.6
});
let box2 = new OIMO.Body({
type: 'box',
size: [1,1,1],
friction: 0.3
});
// Расчёт комбинированного трения
function combinedFriction(bodyA, bodyB) {
return Math.min(bodyA.friction, bodyB.friction);
}
let μ_combined = combinedFriction(box1, box2);
console.log('Комбинированное трение:', μ_combined);
В этом примере результирующее трение при контакте box1 и
box2 будет равно 0.3. При необходимости можно заменить
Math.min на Math.max или среднее
арифметическое, чтобы изменить физическое поведение сцены.
Oimo.js хранит информацию о контактах через объект Contact, который содержит ссылки на тела и контактные точки. При расчёте силы трения используется формула:
[ F_{friction} = μ_{combined} × F_{normal}]
где F_normal – сила нормального давления между телами,
вычисляемая движком на основе массы, ускорения и упругости.
Трение применяется как сила, противодействующая относительному скольжению. Если скорость скольжения мала, движок может использовать статическое трение для предотвращения дрожания или «проваливания» тел.
Важно учитывать, что трение неразрывно связано с коэффициентом упругости (restitution). Высокая упругость увеличивает скорость отскока, что может преодолеть трение и привести к нестабильной симуляции. При проектировании сцены необходимо:
Oimo.js позволяет динамически изменять коэффициенты трения во время симуляции. Это используется для:
// Изменение трения во время симуляции
box1.friction = 0.1; // имитация мокрой поверхности
Такой подход позволяет точно моделировать физику столкновений и получать реалистичное поведение объектов независимо от их массы и формы.
Комбинирование трения двух тел является ключевым аспектом при проектировании реалистичных сцен в Oimo.js, влияя на устойчивость симуляции, скорость скольжения и общую динамику взаимодействия объектов.