Якорные точки в мировых и локальных координатах

В библиотеке Oimo.js якорные точки (anchor points) играют ключевую роль в управлении положением и ориентацией тел и соединений. Понимание различий между локальными и мировыми координатами позволяет точно моделировать физические взаимодействия между объектами, особенно при создании сложных иерархий или механизмов.

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

Локальные координаты задаются относительно центра масс тела или его локальной системы координат. В Oimo.js каждая физическая фигура (rigid body) имеет собственную локальную систему координат, привязанную к её положению и ориентации:

const box = world.add({
  type: 'box',
  size: [1, 1, 1],
  pos: [0, 2, 0],
  rot: [0, 0, 0]
});

В этом примере положение pos задаёт центр коробки в мировой системе координат, но при работе с якорными точками в локальной системе значение координат (0, 0, 0) будет соответствовать центру коробки. Любое смещение внутри тела, например при соединении с другим объектом через joint, обычно задаётся в локальной системе:

const localAnchor = [0.5, 0.5, 0];
joint.setLocalAnchorA(localAnchor);

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

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

Мировые координаты определяются относительно глобальной системы координат сцены. Они описывают положение объекта в абсолютном пространстве:

const worldAnchor = [2, 3, 0];
joint.setAnchor(worldAnchor);

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

Преобразование между системами координат

Oimo.js предоставляет методы для конвертации между локальными и мировыми координатами, что необходимо для корректного расчёта соединений и силы воздействия:

const worldPos = body.getWorldPoint(localAnchor);
const localPos = body.getLocalPoint(worldAnchor);
  • getWorldPoint(localPoint) — преобразует локальные координаты тела в мировые.
  • getLocalPoint(worldPoint) — преобразует мировые координаты в локальные относительно тела.

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

Якорные точки в соединениях (Joints)

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

const joint = world.add({
  type: 'hinge',
  bodyA: boxA,
  bodyB: boxB,
  anchorA: [0.5, 0, 0], // локальная точка на boxA
  anchorB: [0, 0.5, 0], // локальная точка на boxB
  axis: [0, 1, 0]
});

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

Влияние ориентации тела

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

const rotatedWorldAnchor = box.getWorldPoint([0.5, 0, 0]);

Эта операция возвращает фактическую мировую позицию точки после всех трансформаций тела.

Практическое применение

  1. Механизмы и роботы: для правильного соединения сегментов манипулятора используют локальные точки на каждом звене, а мировые координаты служат для фиксации всей конструкции.
  2. Фиксированные объекты: при закреплении объекта в сцене применяются мировые координаты, чтобы точка якоря оставалась постоянной.
  3. Динамические взаимодействия: при коллизиях и реакциях на силы преобразование локальных точек в мировые обеспечивает корректный расчёт импульсов.

Рекомендации

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

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