Quaternion

Внедрение 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);

Конструктор

Quaternion(x : Float, y : Float, z : Float, w : Float)

x — x coordinate
y — y coordinate
z — z coordinate
w — w coordinate

Свойства

.x : Float

.y : Float

.z : Float

.w : Float

Методы

.angleTo(q : Quaternion) → Float

Возвращает угол между этим кватернионом и кватернионом q в радианах.

.clone() → Quaternion

Создает новый кватернион со свойствами x, y, z и w, идентичными данному.

.conjugate() → Quaternion

Возвращает вращательную конъюгату данного кватерниона. Сопряженный кватернион представляет собой одно и то же вращение в противоположном направлении вокруг оси вращения.

.copy(q : Quaternion) → Quaternion

Копирует свойства x, y, z и w из q в данный кватернион.

.equals(v : Quaternion) → Boolean

v — Кватернион, с которым будет сравниваться данный кватернион.

Сравнивает свойства x, y, z и w v с эквивалентными свойствами этого кватерниона, чтобы определить, представляют ли они одно и то же вращение.

.dot(v : Quaternion) → Float

Вычисляет скалярное произведение кватернионов v и данного.

.fromArray(array : Array, offset : Integer) → Quaternion

array — массив формата (x, y, z, w), используемого для построения кватерниона.
offset — (необязательно) смещение в массиве.

Устанавливает свойства x, y, z и w этого кватерниона из массива.

.identity() → Quaternion

Устанавливает этот кватернион в кватернион тождества; то есть в кватернион, который представляет "отсутствие вращения".

.invert() → Quaternion

Инвертирует данный кватернион - вычисляет conjugate. Предполагается, что кватернион имеет единичную длину.

.length() → Float

Вычисляет Евклидову метрику (длину прямой линии) данного кватерниона, рассматриваемого как 4-мерный вектор.

.lengthSq() → Float

Вычисляет квадрат Евклидова расстояния (длины прямой) данного кватерниона, рассматриваемого как 4-мерный вектор. Это может быть полезно, если вы сравниваете длины двух кватернионов, так как это немного более эффективное вычисление, чем length().

.normalize() → Quaternion

Нормализует этот кватернион - то есть вычисляет кватернион, который выполняет то же вращение, что и этот, но имеет length равный 1.

.multiply(q : Quaternion) → Quaternion

Умножает данный кватернион на q.

.multiplyQuaternions(a : Quaternion, b : Quaternion) → Quaternion

Устанавливает этот кватернион в a x b.
Адаптировано из метода, изложенного здесь.

.premultiply(q : Quaternion) → Quaternion

Предварительно умножает этот кватернион на q.

.rotateTowards(q : Quaternion, step : Float) → Quaternion

q — Целевой кватернион.
step — Угловой шаг в радианах.

Поворачивает данный кватернион на заданный угловой шаг к определенному кватерниону q. Метод гарантирует, что конечный кватернион не будет превышать q.

.slerp(qb : Quaternion, t : Float) → Quaternion

qb — Другое кватернионное вращение
t — коэффициент интерполяции в замкнутом интервале [0, 1].

Обрабатывает сферическую линейную интерполяцию между кватернионами. t представляет собой величину поворота между данным кватернионом (где t равно 0) и qb (где t равно 1). Этот кватернион устанавливается в результат. Также смотрите статическую версию slerp ниже. // повернуть меш в направлении целевого кватерниона mesh.quaternion.slerp(endQuaternion, 0.01);

.set(x : Float, y : Float, z : Float, w : Float) → Quaternion

Задает x, y, z, w свойства этого кватерниона.

.setFromAxisAngle(axis : Vector3, angle : Float) → Quaternion

Устанавливает этот кватернион из вращения, заданного axis и angle.
Адаптировано из следующего метода.
Axis(ось) предполагается нормализованной, angle(угол) - в радианах.

.setFromEuler(euler : Euler) → Quaternion

Устанавливает этот кватернион от вращения, заданного углом Euler.

.setFromRotationMatrix(m : Matrix4) → Quaternion

m — a Matrix4 Matrix4, из которых верхняя 3x3 матрица является чистой матрицей вращение (т.е. немасштабированной).
Устанавливает этот кватернион из компонента вращения m.
Адаптировано из следующего метода.

.setFromUnitVectors(vFrom : Vector3, vTo : Vector3) → Quaternion

Применяет к данному кватерниону вращение, необходимое для поворота вектора направления vFrom к вектору направления vTo.
Адаптировано из следующего метода.
Предполагается, что vFrom и vTo нормализованы.

.toArray(array : Array, offset : Integer) → Array

array — Необязательный массив для хранения кватерниона. Если он не указан, будет создан новый массив.
offset — (необязательно) если указан, результат будет скопирован в этот Array..

Возвращает числовые элементы данного кватерниона в массиве формата [x, y, z, w].

.fromBufferAttribute(attribute : BufferAttribute, index : Integer) → this

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)

.slerp(qStart : Quaternion, qEnd : Quaternion, qTarget : Quaternion, t : Float) → Quaternion

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

.slerpFlat(dst : Array, dstOffset : Integer, src0 : Array, srcOffset0 : Integer, src1 : Array, srcOffset1 : Integer, t : Float) → null

dst — Выходной массив.
dstOffset — Смещение в выходном массиве.
src0 — Исходный массив начального кватерниона.
srcOffset0 — Смещение в массиве src0.
src1 — Исходный массив целевого кватнериона.
srcOffset1 — Смещение в массиве src1..
t — Нормированный коэффициент интерполяции (от 0 до 1).

Подобен статическому методу slerp выше, но работает непосредственно с плоскими массивами чисел.

Исходный файл

О том как получить исходный код этого модуля читайте тут.