Гравитация: направление и величина

В 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);
}

Это позволяет имитировать гравитацию планет, черных дыр или локальные притяжения в игровых сценах.

Рекомендации по производительности

Сильные или постоянно меняющиеся векторы гравитации могут увеличить нагрузку на физический движок, так как каждая итерация расчёта учитывает все силы. Оптимизация достигается через:

  • Ограничение количества тел с кастомными силами.
  • Применение векторов гравитации раз в шаг, если они не меняются часто.
  • Использование лёгких тел с меньшей массой для эффектов, не влияющих критически на взаимодействие крупных объектов.