Векторы и операции над ними: Vec3

В Cannon.js ключевым строительным блоком для работы с физикой является объект Vec3, представляющий трёхмерный вектор. Он используется для описания положений, скоростей, сил и направлений. Глубокое понимание Vec3 позволяет эффективно управлять объектами и рассчитывать физические взаимодействия в симуляции.


Создание и базовые свойства

Создать вектор можно с помощью конструктора:

const v = new CANNON.Vec3(x, y, z);
  • x, y, z — числовые компоненты вектора.
  • По умолчанию, если параметры не заданы, все компоненты равны 0.

Пример:

const v = new CANNON.Vec3(1, 2, 3);
console.log(v.x, v.y, v.z); // 1 2 3

Основные методы Vec3

  1. Копирование и клонирование
const v1 = new CANNON.Vec3(1, 2, 3);
const v2 = v1.clone();    // Создаёт новый объект с теми же компонентами
v2.copy(v1);              // Копирует значения из другого вектора

clone() возвращает новый объект, copy() перезаписывает текущий.

  1. Сложение и вычитание
v1.vadd(v2, v1);  // v1 = v1 + v2
v1.vsub(v2, v1);  // v1 = v1 - v2

Методы принимают два аргумента: вектор для операции и вектор, куда будет записан результат. Это позволяет избежать лишних аллокаций памяти.

  1. Масштабирование и инверсия
v1.scale(2, v1);  // Умножение на скаляр
v1.negate(v1);    // Инверсия (умножение на -1)

Эти операции особенно полезны для расчёта сил или импульсов.


Векторные операции

  1. Длина вектора и нормализация
const length = v1.length(); // Евклидова длина √(x² + y² + z²)
v1.normalize();              // Делает вектор единичным

Нормализация сохраняет направление, но устанавливает длину равной 1, что необходимо при работе с направлениями силы или движения.

  1. Скалярное и векторное произведение
const dot = v1.dot(v2);     // Скалярное произведение
v1.cross(v2, v1);           // Векторное произведение, результат записывается в v1
  • Скалярное произведение полезно для проверки углов между векторами.
  • Векторное произведение даёт перпендикулярный вектор, который часто используется при вычислении моментов силы.
  1. Проекция и линейная интерполяция
v1.projectOnVector(v2, v1);   // Проекция v1 на v2
v1.lerp(v2, 0.5, v1);         // Линейная интерполяция между v1 и v2

Проекция помогает разложить силы или скорости по направлениям. Lerp применяется для сглаживания движения объектов.


Практическое использование в Cannon.js

  1. Силы и ускорения
const force = new CANNON.Vec3(10, 0, 0);
body.applyForce(force, body.position);

Vec3 задаёт направление и величину силы. Метод applyForce рассчитывает влияние на объект с учётом его массы и положения.

  1. Скорость и движение
const velocity = new CANNON.Vec3(0, 5, 0);
body.velocity.copy(velocity);

Vec3 используется для прямого управления скоростью объекта или её модификации в ходе симуляции.

  1. Столкновения и импульсы

При столкновениях Vec3 хранит нормали контакта, точки приложения силы и импульсы:

const contactNormal = new CANNON.Vec3();
contact.getContactNormal(contactNormal);

Использование метода vsub или vadd позволяет корректно рассчитывать отражения и реакцию объектов на удар.


Производительность и оптимизация

  • Избегать создания новых объектов внутри циклов симуляции. Использовать методы, которые записывают результат в существующий вектор (vadd, vsub, scale).
  • Использовать предварительно созданные векторы для временных вычислений, чтобы снизить нагрузку на сборщик мусора.
const tmp = new CANNON.Vec3();
tmp.vsub(a, tmp);
  • Нормализация перед операциями с силами гарантирует предсказуемое поведение физики.

Дополнительные полезные методы

  • almostEquals(v, precision) — проверяет близость векторов с заданной точностью.
  • isZero() — проверка на нулевой вектор.
  • set(x, y, z) — удобная установка всех компонент вектора.

Vec3 является фундаментом для всех физических расчётов в Cannon.js. Знание его методов и особенностей работы с памятью позволяет создавать реалистичные и производительные симуляции трёхмерных объектов.


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