В Cannon.js каждая физическая сущность обладает своей локальной системой координат, которая задаёт положение и ориентацию объекта относительно его собственного центра. Мировая система координат описывает положение объекта в глобальном пространстве сцены. Понимание различий между этими системами критично для точного управления движением, столкновениями и прикладными эффектами.
Локальная система координат задаётся относительно центра масс объекта. В этой системе координат:
Локальные координаты используются для определения внутренней
геометрии объекта и для управления силами или моментами относительно его
центра. Например, при приложении силы через метод
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.