四元数(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

创建一个与该四元数具有相同xyzw 属性的四元数。

.conjugate () : Quaternion

返回该四元数的旋转共轭。 四元数的共轭表示的是,围绕旋转轴在相反方向上的相同旋转。

.copy (q : Quaternion) : Quaternion

复制四元数 qxyzw 属性到该四元数中。

.equals (v : Quaternion) : Boolean

v - 用于进行比较的四元数。

将四元数 vxyzw 的属性 与当前四元数的对应属性相比较,以确定它们是否表示相同的旋转。

.dot (v : Quaternion) : Float

计算四元数 v 与当前四元数的dot product(点积)。

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

array - 用于构造四元数的形如(x, y, z, w)的数组。
offset - (可选)数组的偏移量。(译者注:使用数组中从第offset元素算起的四个元素)

从一个数组来设置四元数的 xyzw 的属性。

.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

设置该四元数的 xyzw属性。

.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 中设置该四元数的xyzw属性。

静态方法

静态方法(相对于实例方法)被设计用来直接从类进行调用,而非从特定的实例上进行调用。 要使用静态版本,需要按照如下方式来调用: 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