btVector3: создание, операции, нормализация

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();
}

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

  • distance — вычисление расстояния между двумя точками в 3D:
let d = a.distance(b);
  • angle — угол между двумя векторами:
let angleRad = a.angle(b);
  • setInterpolate3 — линейная интерполяция между векторами:
let result = new Ammo.btVector3();
result.setInterpolate3(a, b, 0.5);  // половина пути от a к b
  • absolute — получение вектора с модулем каждой компоненты:
let absVec = new Ammo.btVector3();
absVec = a.absolute();  // компоненты положительные

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

  1. Физические силы и ускорения:
let force = new Ammo.btVector3(0, 10, 0);
rigidBody.applyCentralForce(force);
  1. Направление движения:
let direction = targetPosition.op_sub(currentPosition);
direction.normalize();
  1. Расчёт столкновений и нормалей поверхности:
let normal = hitPoint.op_sub(surfacePoint);
normal.normalize();
  1. Промежуточные позиции при интерполяции:
let interpolated = new Ammo.btVector3();
interpolated.setInterpolate3(start, end, 0.25);

btVector3 является универсальным и фундаментальным инструментом в Ammo.js, обеспечивая работу с пространственными величинами, их манипуляции и математические операции. Правильное создание, нормализация и использование этих объектов позволяет строить точные физические симуляции, рассчитывать силы, направления движения и реакции на столкновения.