В библиотеке Oimo.js физические объекты состоят из
тел (bodies) и форм (shapes). Каждое
тело представляет собой физический объект с массой, инерцией и
динамикой, а формы определяют геометрию, коллизии и визуальное
представление тела. Стандартно форма располагается в локальной системе
координат тела так, что её центр совпадает с центром тела. Однако часто
возникает необходимость смещать форму относительно тела, создавать
асимметричные конструкции или размещать несколько форм на одном теле.
Для этого используется свойство
localTransform.
localTransformlocalTransform представляет собой
объект, содержащий два основных компонента:
position – вектор смещения формы
относительно центра тела.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.Для простых прямоугольных или цилиндрических форм часто требуется сдвинуть форму вдоль одной или нескольких осей тела:
const shape = new OIMO.BoxGeometry(1, 2, 1);
shape.localTransform.position.set(0, 1, 0); // форма смещена вверх на 1 единицу
В результате центр формы будет на единицу выше центра тела, но тело будет двигаться как единый объект.
Иногда нужно повернуть форму относительно тела без изменения ориентации всего тела:
shape.localTransform.rotation.setFromEuler(0, Math.PI / 4, 0);
Эта операция поворачивает форму на 45 градусов вокруг оси Y. Физический расчёт остаётся корректным, так как Oimo.js учитывает локальное вращение при вычислении столкновений и инерции.
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 влияет на несколько
аспектов симуляции:
Пример синхронизации визуального объекта в 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
расширяет возможности моделирования и позволяет строить разнообразные
динамические системы с высокой точностью.