Коэффициент трения: статическое и динамическое трение

В физическом движке Oimo.js трение играет ключевую роль при моделировании взаимодействия тел. Физика трения делится на два основных типа: статическое и динамическое. Их корректная настройка позволяет создавать реалистичные сцены с взаимодействием объектов, предотвращая скольжение и обеспечивая устойчивость.


Основные понятия

  • Статическое трение (staticFriction) – сопротивление, возникающее при попытке сдвинуть неподвижный объект. Определяет минимальную силу, необходимую для начала движения. В Oimo.js выражается как числовой коэффициент, обычно от 0 до 1, где 0 — отсутствие трения, а 1 — максимальное сопротивление.
  • Динамическое трение (dynamicFriction) – сопротивление, возникающее при движении объекта по поверхности. Этот коэффициент обычно меньше статического, так как движущаяся поверхность встречает меньше сопротивления.

Физически, сила трения рассчитывается по формуле:

[ F_{} = N]

где ( ) — коэффициент трения (статический или динамический), а ( N ) — нормальная сила, действующая на объект.


Настройка трения в Oimo.js

В Oimo.js трение задаётся при создании формы (Shape), которая привязана к твердому телу (RigidBody).

const shapeConfig = {
    friction: 0.5,       // коэффициент трения (основной)
    restitution: 0.2,    // упругость
    density: 1.0
};

const boxShape = new OIMO.Shape(new OIMO.BoxGeometry(1,1,1), shapeConfig);

const body = new OIMO.RigidBody({
    type: 'dynamic',
    position: [0,5,0],
    shapes: [boxShape]
});

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


Отличия статического и динамического трения в реализации

  1. Статическое трение предотвращает сдвиг неподвижного объекта при малых силах. В Oimo.js оно автоматически вычисляется на основе заданного friction и силы контакта. Если внешняя сила превышает это сопротивление, объект начинает двигаться.

  2. Динамическое трение применяется к движущимся объектам. После начала движения движок уменьшает трение до динамического уровня, обеспечивая реалистичный скольжение.

body.sleep(); // тело неподвижно, действует статическое трение
body.applyForce([10,0,0]); // если сила превышает threshold, тело начинает движение
// динамическое трение активируется во время движения

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

  • Для имитации шероховатых поверхностей коэффициент трения должен быть высоким (0.6–1.0).
  • Для гладких поверхностей достаточно значения 0.1–0.3.
  • Разница между статическим и динамическим трением помогает избежать «прыгающих» тел: статическое трение обычно немного выше динамического, что предотвращает самопроизвольное движение.
const roughSurface = new OIMO.Shape(new OIMO.BoxGeometry(10,1,10), {
    friction: 0.8 // создаёт эффект шероховатой поверхности
});

const iceSurface = new OIMO.Shape(new OIMO.BoxGeometry(10,1,10), {
    friction: 0.05 // эффект льда
});

Взаимодействие с другими параметрами физики

  • Масса тела напрямую влияет на силу трения, так как трение зависит от нормальной силы (N = m g).
  • Скорость контакта определяет переход от статического к динамическому трению. Oimo.js учитывает малые колебания для предотвращения «залипания» объектов.
  • Реституция влияет на поведение после столкновения, но трение определяет, будет ли объект скользить или оставаться на месте.

Моделирование сложных поверхностей

Для сложных комбинаций можно задавать разные коэффициенты трения для каждой формы тела. Это полезно для симуляции взаимодействия объектов с разной текстурой:

const wheel = new OIMO.Shape(new OIMO.CylinderGeometry(0.5, 0.5, 0.2), { friction: 0.9 });
const chassis = new OIMO.Shape(new OIMO.BoxGeometry(2,0.5,1), { friction: 0.3 });

Таким образом, колеса будут обладать высоким сцеплением, а корпус автомобиля — низким сопротивлением.


Важные моменты реализации

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

Структурированная настройка трения в Oimo.js обеспечивает точное моделирование физических взаимодействий, позволяя достичь реалистичной динамики объектов и предсказуемого поведения при столкновениях и скольжении.