В Cannon.js гравитация задаётся как вектор, который влияет на все
объекты в мире физики. Она определяет направление силы
притяжения и её величину, действующую на тела.
Для её задания используется свойство gravity объекта
World, которое представляет собой экземпляр
CANNON.Vec3.
const world = new CANNON.World();
world.gravity.set(0, -9.82, 0); // стандартная гравитация Земли по оси Y
Здесь:
x, y, z — компоненты вектора
гравитации.y направляет объекты
вниз.x или z позволяет
создавать наклонные или горизонтальные гравитационные эффекты.Cannon.js использует метры, килограммы и секунды как
базовые единицы. Значение -9.82 по оси y
соответствует ускорению свободного падения на поверхности Земли в м/с².
При работе с меньшими сценами или масштабированными моделями гравитацию
можно корректировать:
world.gravity.set(0, -20, 0); // более сильное притяжение
Важно учитывать, что величина гравитации влияет на:
По умолчанию все тела наследуют глобальную гравитацию мира, но можно
задавать индивидуальные силы, используя метод applyForce
или изменяя mass и velocity. Прямой способ
задать “локальную гравитацию” через отдельный вектор отсутствует,
поэтому используется комбинирование массы и дополнительных сил:
const sphere = new CANNON.Body({
mass: 5,
shape: new CANNON.Sphere(1)
});
world.addBody(sphere);
// Добавление индивидуальной силы гравитации
const gravityForce = new CANNON.Vec3(0, -50, 0);
sphere.applyForce(gravityForce, sphere.position);
Таким образом, можно создавать эффекты планет с различной силой притяжения или антигравитационные зоны.
Гравитация тесно связана с параметрами mass,
friction и restitution тел. Большая сила
гравитации увеличивает давление на контактные поверхности, что влияет на
скольжение и отскок. Примеры:
const groundMaterial = new CANNON.Material("ground");
const sphereMaterial = new CANNON.Material("sphere");
const contactMaterial = new CANNON.ContactMaterial(
groundMaterial,
sphereMaterial,
{ friction: 0.4, restitution: 0.6 }
);
world.addContactMaterial(contactMaterial);
Сильная гравитация делает объекты более склонными к скольжению и уменьшает высоту отскока при столкновении с поверхностями.
Направление вектора гравитации задаёт траекторию падения объектов. Можно создавать любые направления:
// Падение по диагонали
world.gravity.set(5, -9.82, 2);
Такое изменение позволяет моделировать наклонные плоскости, притяжение к центру планеты или искусственные эффекты в играх.
При нулевом векторе гравитации объекты движутся только под действием приложенных сил или столкновений:
world.gravity.set(0, 0, 0);
Это используется для космических симуляций, где движение тел полностью определяется силами взаимодействия и импульсами.
Для создания сложных физических эффектов можно комбинировать глобальную гравитацию с дополнительными силами на отдельных телах. Например, гравитационные поля разной интенсивности или центры притяжения:
function applyCustomGravity(body, center, strength) {
const direction = center.vsub(body.position); // вектор к центру
direction.normalize();
direction.scale(strength, direction);
body.applyForce(direction, body.position);
}
Это позволяет имитировать гравитацию планет, черных дыр или локальные притяжения в игровых сценах.
Сильные или постоянно меняющиеся векторы гравитации могут увеличить нагрузку на физический движок, так как каждая итерация расчёта учитывает все силы. Оптимизация достигается через: