В Cannon.js ключевым строительным блоком для работы с физикой
является объект Vec3, представляющий
трёхмерный вектор. Он используется для описания положений, скоростей,
сил и направлений. Глубокое понимание Vec3 позволяет
эффективно управлять объектами и рассчитывать физические взаимодействия
в симуляции.
Создать вектор можно с помощью конструктора:
const v = new CANNON.Vec3(x, y, z);
Пример:
const v = new CANNON.Vec3(1, 2, 3);
console.log(v.x, v.y, v.z); // 1 2 3
Vec3const v1 = new CANNON.Vec3(1, 2, 3);
const v2 = v1.clone(); // Создаёт новый объект с теми же компонентами
v2.copy(v1); // Копирует значения из другого вектора
clone() возвращает новый объект, copy()
перезаписывает текущий.
v1.vadd(v2, v1); // v1 = v1 + v2
v1.vsub(v2, v1); // v1 = v1 - v2
Методы принимают два аргумента: вектор для операции и вектор, куда будет записан результат. Это позволяет избежать лишних аллокаций памяти.
v1.scale(2, v1); // Умножение на скаляр
v1.negate(v1); // Инверсия (умножение на -1)
Эти операции особенно полезны для расчёта сил или импульсов.
const length = v1.length(); // Евклидова длина √(x² + y² + z²)
v1.normalize(); // Делает вектор единичным
Нормализация сохраняет направление, но устанавливает длину равной 1, что необходимо при работе с направлениями силы или движения.
const dot = v1.dot(v2); // Скалярное произведение
v1.cross(v2, v1); // Векторное произведение, результат записывается в v1
v1.projectOnVector(v2, v1); // Проекция v1 на v2
v1.lerp(v2, 0.5, v1); // Линейная интерполяция между v1 и v2
Проекция помогает разложить силы или скорости по направлениям. Lerp применяется для сглаживания движения объектов.
const force = new CANNON.Vec3(10, 0, 0);
body.applyForce(force, body.position);
Vec3 задаёт направление и величину силы. Метод
applyForce рассчитывает влияние на объект с учётом его
массы и положения.
const velocity = new CANNON.Vec3(0, 5, 0);
body.velocity.copy(velocity);
Vec3 используется для прямого управления скоростью
объекта или её модификации в ходе симуляции.
При столкновениях 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 для сложных физических эффектов, таких как вращение тел или расчёт столкновений с трением.