Смещение формы относительно тела: localTransform

В библиотеке Oimo.js физические объекты состоят из тел (bodies) и форм (shapes). Каждое тело представляет собой физический объект с массой, инерцией и динамикой, а формы определяют геометрию, коллизии и визуальное представление тела. Стандартно форма располагается в локальной системе координат тела так, что её центр совпадает с центром тела. Однако часто возникает необходимость смещать форму относительно тела, создавать асимметричные конструкции или размещать несколько форм на одном теле. Для этого используется свойство localTransform.


Структура localTransform

localTransform представляет собой объект, содержащий два основных компонента:

  1. position – вектор смещения формы относительно центра тела.
  2. rotation – вращение формы относительно локальной системы координат тела.

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

Пример структуры:

shape.localTransform.position.set(x, y, z);
shape.localTransform.rotation.setFromEuler(rx, ry, rz);
  • position.set(x, y, z) задаёт смещение формы.
  • rotation.setFromEuler(rx, ry, rz) задаёт вращение формы в радианах по осям X, Y, Z.

Применение смещения

1. Смещение формы вдоль осей

Для простых прямоугольных или цилиндрических форм часто требуется сдвинуть форму вдоль одной или нескольких осей тела:

const shape = new OIMO.BoxGeometry(1, 2, 1);
shape.localTransform.position.set(0, 1, 0); // форма смещена вверх на 1 единицу

В результате центр формы будет на единицу выше центра тела, но тело будет двигаться как единый объект.

2. Вращение формы

Иногда нужно повернуть форму относительно тела без изменения ориентации всего тела:

shape.localTransform.rotation.setFromEuler(0, Math.PI / 4, 0); 

Эта операция поворачивает форму на 45 градусов вокруг оси Y. Физический расчёт остаётся корректным, так как Oimo.js учитывает локальное вращение при вычислении столкновений и инерции.

3. Несколько форм на одном теле

localTransform позволяет создавать сложные тела из нескольких форм:

const body = new OIMO.Body({
  type: "dynamic",
  position: new OIMO.Vec3(0, 5, 0)
});

const shape1 = new OIMO.BoxGeometry(2, 1, 1);
shape1.localTransform.position.set(-1, 0, 0);

const shape2 = new OIMO.BoxGeometry(2, 1, 1);
shape2.localTransform.position.set(1, 0, 0);

body.addShape(shape1);
body.addShape(shape2);

Две формы смещены в стороны относительно центра тела, создавая единый физический объект с более сложной геометрией.


Влияние на физику

localTransform влияет на несколько аспектов симуляции:

  1. Центр масс – смещение формы изменяет распределение массы тела. Oimo.js автоматически пересчитывает центр масс и тензор инерции.
  2. Коллизии – столкновения рассчитываются относительно локальных координат формы. Смещённая форма корректно взаимодействует с другими объектами.
  3. Визуализация – при использовании смещения важно синхронизировать графику с локальным преобразованием формы, иначе визуальная модель и физика будут различаться.

Пример синхронизации визуального объекта в three.js с формой Oimo.js:

mesh.position.copy(body.getPosition());
mesh.quaternion.copy(body.getQuaternion());

const localPos = shape.localTransform.position;
const localQuat = shape.localTransform.rotation.toQuaternion();

mesh.position.add(localPos.applyQuaternion(body.getQuaternion()));
mesh.quaternion.multiply(localQuat);

Ограничения и особенности

  • Динамические изменения: localTransform можно менять в процессе симуляции, но резкое смещение формы может вызвать некорректное поведение коллизий, поэтому рекомендуется плавно обновлять смещения.
  • Комплексные тела: при большом количестве форм на одном теле производительность может снижаться, так как пересчёт инерции и столкновений усложняется.
  • Использование с фиксированными телами: для статических тел смещения влияют только на коллизии, физическое поведение не изменяется.

Советы по применению

  • Для симметричных тел смещения лучше минимизировать, чтобы не усложнять расчёт инерции.
  • Смещения вдоль осей и небольшие вращения хорошо подходят для создания составных объектов, таких как транспортные средства или роботизированные структуры.
  • Всегда проверять визуальное соответствие формы и тела при рендеринге, особенно если используется несколько форм с разными смещениями и вращениями.

Итоговое понимание

localTransform — мощный инструмент Oimo.js, позволяющий создавать сложные физические объекты с формами, смещёнными относительно центра тела. Он обеспечивает контроль над локальной позицией и ориентацией формы, учитывается при расчёте массы, инерции и коллизий. Правильное использование localTransform расширяет возможности моделирования и позволяет строить разнообразные динамические системы с высокой точностью.