Quaternion - Verge3D 用户手册 - Soft8Soft
Description: 了解如何在使用 Verge3D 制作的交互式 3D 应用程序中使用 Quaternion

# 四元数（Quaternion）

该类实现了 quaternion 。
四元数在Verge3D中用于表示 rotation （旋转）。

## 代码示例

`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 坐标
y — y 坐标
z — z 坐标
w — w 坐标

## 属性

### # .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

复制四元数 q 的 x、y、z 和 w 属性到该四元数中。

### # .equals(v : Quaternion) → Boolean

v — 用于进行比较的四元数。
将四元数 v 的 x、 y、 z 和 w 的属性 与当前四元数的对应属性相比较，以确定它们是否表示相同的旋转。

### # .dot(v : Quaternion) → Float

计算四元数 v 与当前四元数的dot product（点积）。

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

array — 用于构造四元数的形如(x, y, z, w)的数组。
offset - （可选）数组的偏移量。（译者注：使用数组中从第offset元素算起的四个元素）
从一个数组来设置四元数的 x、 y、z 和 w 的属性。

### # .identity() → Quaternion

设置该四元数为 identity 四元数，即表示“不旋转”的四元数。

### # .invert() → Quaternion

翻转该四元数 —— 计算 conjugate 。假定该四元数具有单位长度。

### # .length() → Float

计算四元数的 Euclidean length （欧几里得长度，直线长度），视为一个四维向量。

### # .lengthSq() → Float

计算四元数 Euclidean length （欧几里得长度，直线长度）的平方，视为一个四维向量。 如果要比较两个四元数的长度，这可能会十分有用， 因为这比 length() 的效率稍高一些。

### # .normalize() → Quaternion

Normalizes（归一化）四元数 —— 即计算与该四元数具有相同旋转、但长度为1的四元数。

### # .multiply(q : Quaternion) → Quaternion

将该四元数与q相乘。

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

将该四元数设为 a x b 。
改编自 here 所概述的方法。

### # .premultiply(q : Quaternion) → Quaternion

Pre-multiplies this quaternion by q.

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

q — The target quaternion.
step — The angular step in radians.
Rotates this quaternion by a given angular step to the defined quaternion q. The method ensures that the final quaternion will not overshoot q.

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

qb — The other quaternion rotation
t — interpolation factor in the closed interval [0, 1].
Handles the spherical linear interpolation between quaternions. t represents the amount of rotation between this quaternion (where t is 0) and qb (where t is 1). This quaternion is set to the result. Also see the static version of the slerp below. `// rotate a mesh towards a target quaternion 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（角度）所给定的旋转来设置该四元数。
改编自 here 所述的方法。
假定Axis已被归一化，angle以弧度来表示。

### # .setFromEuler(euler : Euler) → Quaternion

从由 Euler 角所给定的旋转来设置该四元数。

### # .setFromRotationMatrix(m : Matrix4) → Quaternion

从m的旋转分量中来设置该四元数。
改编自 here 所概述的方法。

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

Sets this quaternion to the rotation required to rotate direction vector vFrom to direction vector vTo.
Adapted from the method here.
vFrom and vTo are assumed to be normalized.

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

array - （可选）存储该四元数的数组。若未指定该参数，则将创建一个新数组。
offset - （可选）若指定了该值，结果将会被拷贝到该 Array。
在形如[x, y, z, w]的数组中，返回四元数中的数字元素。

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

attribute — 源 attribute。
index — attribute 中的索引。
从 attribute 中设置该四元数的x、 y、 z、 w属性。

## 静态方法

静态方法（相对于实例方法）被设计用来直接从类进行调用，而非从特定的实例上进行调用。 要使用静态版本，需要按照如下方式来调用： `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 — The starting quaternion (where t is 0)
qEnd — The ending quaternion (where t is 1)
qTarget — The target quaternion that gets set with the result
t — interpolation factor in the closed interval [0, 1].
Unlike the normal method, the static version of slerp sets a target quaternion to the result of the slerp operation. `// 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 — The output array.
dstOffset — An offset into the output array.
src0 — The source array of the starting quaternion.
srcOffset0 — An offset into the array src0.
src1 — The source array of the target quatnerion.
srcOffset1 — An offset into the array src1.
t — Normalized interpolation factor (between 0 and 1).

Like the static slerp method above, but operates directly on flat arrays of numbers.

## 源码

src/math/Quaternion.js