В физическом движке Oimo.js трение играет ключевую роль при моделировании взаимодействия тел. Физика трения делится на два основных типа: статическое и динамическое. Их корректная настройка позволяет создавать реалистичные сцены с взаимодействием объектов, предотвращая скольжение и обеспечивая устойчивость.
Физически, сила трения рассчитывается по формуле:
[ F_{} = N]
где ( ) — коэффициент трения (статический или динамический), а ( N ) — нормальная сила, действующая на объект.
В 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 задает общий коэффициент,
который используется движком как базовое значение для расчета как
статического, так и динамического трения. При необходимости можно
детализировать поведение через внутренние параметры движка.
Статическое трение предотвращает сдвиг
неподвижного объекта при малых силах. В Oimo.js оно автоматически
вычисляется на основе заданного friction и силы контакта.
Если внешняя сила превышает это сопротивление, объект начинает
двигаться.
Динамическое трение применяется к движущимся объектам. После начала движения движок уменьшает трение до динамического уровня, обеспечивая реалистичный скольжение.
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 // эффект льда
});
Для сложных комбинаций можно задавать разные коэффициенты трения для каждой формы тела. Это полезно для симуляции взаимодействия объектов с разной текстурой:
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 обеспечивает точное моделирование физических взаимодействий, позволяя достичь реалистичной динамики объектов и предсказуемого поведения при столкновениях и скольжении.