btVector3 является базовым классом в Ammo.js для работы
с векторами в трёхмерном пространстве. Он используется для описания
позиций, скоростей, сил, направлений и многих других физических величин.
Объекты создаются через конструктор:
let v = new Ammo.btVector3(x, y, z);
Где x, y и z — числовые
значения компонент вектора. Можно создавать векторы с нулевыми
компонентами:
let zeroVector = new Ammo.btVector3(0, 0, 0);
Важно помнить, что btVector3 — это C++ объект,
доступный через WebAssembly, поэтому после использования его
рекомендуется освобождать вручную, чтобы избежать утечек памяти:
Ammo.destroy(v);
btVector3 предоставляет набор методов для выполнения
стандартных векторных операций.
v.setX(1.0);
v.setY(2.0);
v.setZ(3.0);
let x = v.x();
let y = v.y();
let z = v.z();
Компоненты можно изменять напрямую с помощью
setValue:
v.setValue(4, 5, 6);
let a = new Ammo.btVector3(1, 2, 3);
let b = new Ammo.btVector3(4, 5, 6);
let sum = new Ammo.btVector3();
sum.op_add(a, b); // sum = a + b
let diff = new Ammo.btVector3();
diff.op_sub(a, b); // diff = a - b
let scaled = new Ammo.btVector3();
scaled.op_mul(a, 2); // scaled = a * 2
scaled.op_div(a, 2); // scaled = a / 2
let neg = new Ammo.btVector3();
neg.op_mul(a, -1); // neg = -a
Скалярное произведение (dot product) возвращает число, равное проекции одного вектора на другой:
let dot = a.dot(b); // число
Это часто используется для вычисления углов между векторами или проекции силы на направление движения.
let cross = new Ammo.btVector3();
cross = a.cross(b); // cross = a × b
Результат — новый вектор, перпендикулярный к обоим исходным.
Нормализация приводит вектор к единичной длине, сохраняя его направление. Это критично при работе с направлениями движения, силами и ориентацией объектов.
let v = new Ammo.btVector3(3, 4, 0);
v.normalize(); // длина вектора становится 1
Проверка длины:
let length = v.length(); // sqrt(x^2 + y^2 + z^2)
let squaredLength = v.length2(); // x^2 + y^2 + z^2
Нормализация безопасна при длине ≠ 0, иначе возникает деление на ноль. Для защиты используют проверку:
if (v.length() > 0) {
v.normalize();
}
let d = a.distance(b);
let angleRad = a.angle(b);
let result = new Ammo.btVector3();
result.setInterpolate3(a, b, 0.5); // половина пути от a к b
let absVec = new Ammo.btVector3();
absVec = a.absolute(); // компоненты положительные
let force = new Ammo.btVector3(0, 10, 0);
rigidBody.applyCentralForce(force);
let direction = targetPosition.op_sub(currentPosition);
direction.normalize();
let normal = hitPoint.op_sub(surfacePoint);
normal.normalize();
let interpolated = new Ammo.btVector3();
interpolated.setInterpolate3(start, end, 0.25);
btVector3 является универсальным и фундаментальным
инструментом в Ammo.js, обеспечивая работу с пространственными
величинами, их манипуляции и математические операции. Правильное
создание, нормализация и использование этих объектов позволяет строить
точные физические симуляции, рассчитывать силы, направления движения и
реакции на столкновения.