Внедрение quaternion.
Кватернионы используются в Verge3D для представления вращений.
const quaternion = new v3d.Quaternion();
quaternion.setFromAxisAngle(new v3d.Vector3(0, 1, 0), Math.PI / 2);
const vector = new v3d.Vector3(1, 0, 0);
vector.applyQuaternion(quaternion);
x — x coordinate
y — y coordinate
z — z coordinate
w — w coordinate
Возвращает угол между этим кватернионом и кватернионом q в радианах.
Создает новый кватернион со свойствами x, y, z и w, идентичными данному.
Возвращает вращательную конъюгату данного кватерниона. Сопряженный кватернион представляет собой одно и то же вращение в противоположном направлении вокруг оси вращения.
Копирует свойства x, y, z и w из q в данный кватернион.
v — Кватернион, с которым будет сравниваться данный кватернион.
Сравнивает свойства x, y, z и w v с эквивалентными свойствами этого кватерниона, чтобы определить, представляют ли они одно и то же вращение.
Вычисляет скалярное произведение кватернионов v и данного.
array — массив формата (x, y, z, w), используемого для построения кватерниона.
offset — (необязательно) смещение в массиве.
Устанавливает свойства x, y, z и w этого кватерниона из массива.
Устанавливает этот кватернион в кватернион тождества; то есть в кватернион, который представляет "отсутствие вращения".
Инвертирует данный кватернион - вычисляет conjugate. Предполагается, что кватернион имеет единичную длину.
Вычисляет Евклидову метрику (длину прямой линии) данного кватерниона, рассматриваемого как 4-мерный вектор.
Вычисляет квадрат Евклидова расстояния (длины прямой) данного кватерниона, рассматриваемого как 4-мерный вектор. Это может быть полезно, если вы сравниваете длины двух кватернионов, так как это немного более эффективное вычисление, чем length().
Нормализует этот кватернион - то есть вычисляет кватернион, который выполняет то же вращение, что и этот, но имеет length равный 1.
Умножает данный кватернион на q.
Устанавливает этот кватернион в a x b.
Адаптировано из метода, изложенного здесь.
Предварительно умножает этот кватернион на q.
q — Целевой кватернион.
step — Угловой шаг в радианах.
Поворачивает данный кватернион на заданный угловой шаг к определенному кватерниону q. Метод гарантирует, что конечный кватернион не будет превышать q.
qb — Другое кватернионное вращение
t — коэффициент интерполяции в замкнутом интервале [0, 1].
Обрабатывает сферическую линейную интерполяцию между кватернионами. t представляет собой величину поворота между данным кватернионом (где t равно 0) и qb (где t равно 1). Этот кватернион устанавливается в результат. Также смотрите статическую версию slerp ниже.
// повернуть меш в направлении целевого кватерниона
mesh.quaternion.slerp(endQuaternion, 0.01);
Задает x, y, z, w свойства этого кватерниона.
Устанавливает этот кватернион из вращения, заданного axis и angle.
Адаптировано из следующего метода.
Axis(ось) предполагается нормализованной, angle(угол) - в радианах.
Устанавливает этот кватернион от вращения, заданного углом Euler.
m — a Matrix4 Matrix4, из которых верхняя 3x3 матрица является чистой
матрицей вращение (т.е. немасштабированной).
Устанавливает этот кватернион из компонента вращения m.
Адаптировано из следующего метода.
Применяет к данному кватерниону вращение, необходимое для поворота вектора направления vFrom к вектору направления vTo.
Адаптировано из следующего метода.
Предполагается, что vFrom и vTo нормализованы.
array — Необязательный массив для хранения кватерниона. Если он не указан, будет создан новый массив.
offset — (необязательно) если указан, результат будет скопирован в этот Array..
Возвращает числовые элементы данного кватерниона в массиве формата [x, y, z, w].
attribute — атрибут источника.
index — индекс в атрибуте.
Устанавливает x, y, z, w свойства этого кватерниона из атрибута BufferAttribute.
Статические методы (в отличие от методов экземпляра) предназначены для вызова непосредственно из класса, а не из конкретного экземпляра. Поэтому, чтобы использовать статическую версию, вызовите ее так:
v3d.Quaternion.slerp(qStart, qEnd, qTarget, t);
Напротив, чтобы вызвать "обычный" или инстантный метод slerp, вы должны сделать следующее:
//instantiate a quaternion with default values
const q = new v3d.Quaternion();
//call the instanced slerp method
q.slerp(qb, t)
qStart — Начальный кватернион (где t равен 0)
qEnd — Конечный кватернион (где t равно 1)
qTarget — Целевой кватернион, который устанавливается с результатом
t — коэффициент интерполяции в замкнутом интервале [0, 1].
В отличие от обычного метода, статическая версия slerp устанавливает целевой кватернион на результат операции slerp.
// Code setup
const startQuaternion = new v3d.Quaternion().set(0, 0, 0, 1).normalize();
const endQuaternion = new v3d.Quaternion().set(1, 1, 1, 1).normalize();
let t = 0;
// Update a mesh's rotation in the loop
t = (t + 0.01) % 1; // constant angular momentum
v3d.Quaternion.slerp(startQuaternion, endQuaternion, mesh.quaternion, t);
dst — Выходной массив.
dstOffset — Смещение в выходном массиве.
src0 — Исходный массив начального кватерниона.
srcOffset0 — Смещение в массиве src0.
src1 — Исходный массив целевого кватнериона.
srcOffset1 — Смещение в массиве src1..
t — Нормированный коэффициент интерполяции (от 0 до 1).
Подобен статическому методу slerp выше, но работает непосредственно с плоскими массивами чисел.
О том как получить исходный код этого модуля читайте тут.