Смещение и поворот формы относительно тела

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

Добавление формы с локальным смещением

По умолчанию форма добавляется к телу с центром в начале координат тела. Для создания формы с смещением используется объект Vec3:

const shape = new CANNON.Box(new CANNON.Vec3(1, 1, 1));
const offset = new CANNON.Vec3(0, 2, 0);
body.addShape(shape, offset);
  • shape — экземпляр формы (Box, Sphere, Cylinder и др.).
  • offset — вектор смещения формы относительно позиции тела.

Смещение важно, когда необходимо разместить форму не в центре тела, например, верхнюю часть объекта или выступающую деталь. Cannon.js учитывает смещение при вычислении инерции тела автоматически.

Вращение формы относительно тела

Форма может быть повернута относительно тела с помощью кватерниона (Quaternion):

const shape = new CANNON.Box(new CANNON.Vec3(1, 1, 1));
const offset = new CANNON.Vec3(0, 2, 0);
const orientation = new CANNON.Quaternion();
orientation.setFromEuler(Math.PI / 4, 0, 0, 'XYZ');
body.addShape(shape, offset, orientation);
  • orientation задаёт локальный поворот формы.
  • setFromEuler позволяет использовать привычные углы Эйлера.

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

Массив форм в одном теле

Одно тело может содержать несколько форм с различными смещениями и ориентациями:

const body = new CANNON.Body({ mass: 5 });

const bottom = new CANNON.Box(new CANNON.Vec3(2, 0.5, 2));
body.addShape(bottom, new CANNON.Vec3(0, -0.5, 0));

const top = new CANNON.Sphere(1);
body.addShape(top, new CANNON.Vec3(0, 1.5, 0));
  • bottom и top имеют разные смещения.
  • Cannon.js автоматически суммирует вклад всех форм в вычисление инерции и центра масс тела.

Влияние смещения на центр масс и инерцию

Смещение формы изменяет центр масс тела. При добавлении формы с ненулевым смещением библиотека пересчитывает инерцию, что влияет на вращение и динамику. Для статических тел (mass = 0) смещение влияет только на столкновения, а для динамических тел — на кинематику и момент инерции.

Пример динамического пересчёта:

const body = new CANNON.Body({ mass: 2 });
const box = new CANNON.Box(new CANNON.Vec3(1, 1, 1));
body.addShape(box, new CANNON.Vec3(0, 1, 0));

// Инерция тела обновлена с учётом смещения формы
console.log(body.invInertia); 

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

Совмещение нескольких форм с разной ориентацией

Для сложных объектов удобно комбинировать формы с индивидуальными смещениями и кватернионами:

const body = new CANNON.Body({ mass: 10 });

const base = new CANNON.Box(new CANNON.Vec3(2, 0.5, 2));
body.addShape(base);

const pillar = new CANNON.Cylinder(0.2, 0.2, 3, 16);
const pillarOffset = new CANNON.Vec3(1, 1.5, 0);
const pillarQuat = new CANNON.Quaternion();
pillarQuat.setFromEuler(0, 0, Math.PI / 2, 'XYZ');
body.addShape(pillar, pillarOffset, pillarQuat);
  • Поворот цилиндра позволяет разместить его горизонтально.
  • Смещение и поворот формируют точную конструкцию с сохранением корректной физики.

Работа с трансформациями формы после добавления

После добавления формы её локальная трансформация фиксируется. Для изменения смещения или ориентации требуется удалить и заново добавить форму:

body.removeShape(shape);
body.addShape(shape, new CANNON.Vec3(0, 3, 0), new CANNON.Quaternion());

Прямое редактирование смещения или кватерниона формы не поддерживается, так как это нарушает согласованность инерции и столкновений.

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

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

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