В Oimo.js гравитация задается в глобальных параметрах мира (world).
Она представляет собой трёхмерный вектор, определяющий
направление и величину силы притяжения, действующей на все физические
объекты сцены. По умолчанию гравитация направлена вниз по оси Y с
величиной -9.8, что соответствует стандартному земному
ускорению.
const world = new OIMO.World({
gravity: [0, -9.8, 0]
});
Здесь [0, -9.8, 0] — массив, где первый элемент — ось X,
второй — ось Y, третий — ось Z. Изменение этих значений позволяет
моделировать нестандартные физические условия: наклонные поверхности,
антигравитацию или гравитацию в горизонтальном направлении.
Гравитацию можно изменять во время работы симуляции, что открывает возможности для создания интерактивных эффектов и нестандартной физики.
// Установка новой гравитации
world.gravity = new OIMO.Vec3(0, -20, 0);
Особенности динамического изменения:
applyForce), что позволяет создавать сложные физические
сценарии.Для нестандартных эффектов полезно использовать векторные операции, задавая гравитацию под углом:
const angle = Math.PI / 4; // 45 градусов
const g = 9.8;
world.gravity = new OIMO.Vec3(g * Math.sin(angle), -g * Math.cos(angle), 0);
Такой подход позволяет моделировать гравитацию на наклонной плоскости или смещённые центры притяжения, что расширяет возможности игрового и симуляционного движка.
Для плавного изменения силы притяжения часто используют интерполяцию между текущим и целевым вектором:
function updateGravity(target, alpha) {
world.gravity.x += (target.x - world.gravity.x) * alpha;
world.gravity.y += (target.y - world.gravity.y) * alpha;
world.gravity.z += (target.z - world.gravity.z) * alpha;
}
// В цикле обновления сцены
updateGravity(new OIMO.Vec3(0, -15, 0), 0.05);
target — целевой вектор гравитации.alpha — коэффициент сглаживания (0.0–1.0).Это позволяет создавать эффекты постепенного увеличения или уменьшения силы тяжести, имитацию зон с разной плотностью или антигравитационных полей.
Oimo.js позволяет использовать локальные силы, которые добавляются к глобальной гравитации. Это особенно полезно для симуляции сильных ветров, магнетизма или нестандартной физики объектов:
const body = world.getBodyByName('box');
const localForce = new OIMO.Vec3(0, 50, 0);
body.applyForce(localForce);
Здесь applyForce действует независимо от глобальной
гравитации, но суммируется с ней в расчётах движения тела.
Изменение гравитации напрямую влияет на:
velocity)
объектовjoint)Например, при резком увеличении гравитации объекты, соединённые пружинами, будут растягиваться сильнее, а при уменьшении гравитации — плавно подниматься.
OIMO.Vec3, а не
простыми массивами.world.step) — динамическая гравитация корректно
работает при постоянном обновлении мира, иначе расчёты могут быть
неточными.Эти подходы позволяют гибко управлять гравитацией в Oimo.js, моделировать нестандартные физические среды и создавать динамичные эффекты для игровых и симуляционных проектов.