Локальные и мировые системы координат

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

Локальные координаты

Локальная система координат задаётся относительно центра масс объекта. В этой системе координат:

  • Ось X направлена вдоль локального направления «вправо».
  • Ось Y направлена «вверх».
  • Ось Z направлена «вперед» (в зависимости от ориентации объекта).

Локальные координаты используются для определения внутренней геометрии объекта и для управления силами или моментами относительно его центра. Например, при приложении силы через метод applyLocalForce(force, localPoint):

const force = new CANNON.Vec3(0, 10, 0); // Сила вверх
const localPoint = new CANNON.Vec3(1, 0, 0); // Точка в локальной системе
body.applyLocalForce(force, localPoint);

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

Мировые координаты

Мировая система координат определяет положение объектов относительно глобальной сцены. Координаты объектов в мире можно получить через свойства body.position и body.quaternion. Любые взаимодействия с другими объектами часто требуют преобразования локальных координат в мировые и наоборот.

const worldPoint = new CANNON.Vec3();
body.pointToWorldFrame(localPoint, worldPoint);

Метод pointToWorldFrame преобразует точку из локальной системы координат в мировую. Обратное преобразование выполняется через pointToLocalFrame:

const localFromWorld = new CANNON.Vec3();
body.pointToLocalFrame(worldPoint, localFromWorld);

Это особенно важно при реализации столкновений и взаимодействий с внешними силами, так как физический движок рассчитывает столкновения в мировой системе координат.

Кватернионы и вращения

Ориентация тела в Cannon.js описывается кватернионом body.quaternion. Кватернионы обеспечивают:

  • Отсутствие эффекта гимбал-лок.
  • Лёгкое преобразование локальных в мировые координаты и обратно.
  • Возможность плавного интерполирования вращения.

Для преобразования локального векторного направления в мировое используется метод vectorToWorldFrame:

const localVector = new CANNON.Vec3(1, 0, 0);
const worldVector = new CANNON.Vec3();
body.vectorToWorldFrame(localVector, worldVector);

Аналогично, vectorToLocalFrame позволяет преобразовать мировую величину в локальную систему:

const localResult = new CANNON.Vec3();
body.vectorToLocalFrame(worldVector, localResult);

Использование этих методов позволяет корректно применять силы, импульсы и моменты в зависимости от текущей ориентации объекта.

Применение при взаимодействиях

При столкновениях или соединениях объектов важно учитывать обе системы координат. Например, при создании constraint (соединения) между телами необходимо указывать точки крепления либо в локальной, либо в мировой системе:

const constraint = new CANNON.PointToPointConstraint(
  bodyA,
  new CANNON.Vec3(1, 0, 0), // локальная точка A
  bodyB,
  new CANNON.Vec3(-1, 0, 0) // локальная точка B
);
world.addConstraint(constraint);

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

Сила и момент

Сила, приложенная к телу, создаёт как линейное движение, так и вращение в зависимости от точки приложения:

  • Локальная точка: вращение рассчитывается относительно локального центра масс.
  • Мировая точка: вращение учитывает положение в глобальной системе, что важно при взаимодействии с другими объектами или внешними полями.

Пример применения силы в мировой системе:

const worldForce = new CANNON.Vec3(0, 100, 0);
const worldApplicationPoint = new CANNON.Vec3(2, 0, 0);
body.applyForce(worldForce, worldApplicationPoint);

Резюме по преобразованиям

  • pointToWorldFrame(localPoint, result) — локальная точка → мировая.
  • pointToLocalFrame(worldPoint, result) — мировая точка → локальная.
  • vectorToWorldFrame(localVector, result) — локальный вектор → мировой.
  • vectorToLocalFrame(worldVector, result) — мировой вектор → локальный.

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

Визуализация и отладка

Для визуализации локальных и мировых координат можно использовать линии и стрелки, показывающие направление локальных осей относительно сцены. Это помогает настраивать силы, импульсы и соединения и избегать ошибок при трансформации между системами координат.


Понимание различий между локальными и мировыми системами координат, а также методов преобразования точек и векторов, является основой для построения реалистичной и управляемой физической симуляции в Cannon.js.