import { BufferAttribute } from "../core/BufferAttribute.js"; import { InterleavedBufferAttribute } from "../core/InterleavedBufferAttribute.js"; import { Euler } from "./Euler.js"; import { Matrix4 } from "./Matrix4.js"; import { Vector3, Vector3Like } from "./Vector3.js"; export interface QuaternionLike { readonly x: number; readonly y: number; readonly z: number; readonly w: number; } export type QuaternionTuple = [x: number, y: number, z: number, w: number]; /** * Implementation of a quaternion. This is used for rotating things without incurring in the dreaded gimbal lock issue, amongst other advantages. * * @example * const quaternion = new THREE.Quaternion(); * quaternion.setFromAxisAngle( new THREE.Vector3( 0, 1, 0 ), Math.PI / 2 ); * const vector = new THREE.Vector3( 1, 0, 0 ); * vector.applyQuaternion( quaternion ); */ export class Quaternion { /** * @param x x coordinate * @param y y coordinate * @param z z coordinate * @param w w coordinate */ constructor(x?: number, y?: number, z?: number, w?: number); /** * @default 0 */ x: number; /** * @default 0 */ y: number; /** * @default 0 */ z: number; /** * @default 1 */ w: number; readonly isQuaternion: true; /** * Sets values of this quaternion. */ set(x: number, y: number, z: number, w: number): this; /** * Clones this quaternion. */ clone(): this; /** * Copies values of q to this quaternion. */ copy(q: QuaternionLike): this; /** * Sets this quaternion from rotation specified by Euler angles. */ setFromEuler(euler: Euler, update?: boolean): this; /** * Sets this quaternion from rotation specified by axis and angle. * Adapted from http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm. * Axis have to be normalized, angle is in radians. */ setFromAxisAngle(axis: Vector3Like, angle: number): this; /** * Sets this quaternion from rotation component of m. Adapted from http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm. */ setFromRotationMatrix(m: Matrix4): this; setFromUnitVectors(vFrom: Vector3, vTo: Vector3Like): this; angleTo(q: Quaternion): number; rotateTowards(q: Quaternion, step: number): this; identity(): this; /** * Inverts this quaternion. */ invert(): this; conjugate(): this; dot(v: Quaternion): number; lengthSq(): number; /** * Computes length of this quaternion. */ length(): number; /** * Normalizes this quaternion. */ normalize(): this; /** * Multiplies this quaternion by b. */ multiply(q: Quaternion): this; premultiply(q: Quaternion): this; /** * Sets this quaternion to a x b * Adapted from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm. */ multiplyQuaternions(a: Quaternion, b: Quaternion): this; slerp(qb: Quaternion, t: number): this; slerpQuaternions(qa: Quaternion, qb: Quaternion, t: number): this; equals(v: Quaternion): boolean; /** * Sets this quaternion's x, y, z and w value from the provided array or array-like. * @param array the source array or array-like. * @param offset (optional) offset into the array. Default is 0. */ fromArray(array: number[] | ArrayLike, offset?: number): this; /** * Returns an array [x, y, z, w], or copies x, y, z and w into the provided array. * @param array (optional) array to store the quaternion to. If this is not provided, a new array will be created. * @param offset (optional) optional offset into the array. * @return The created or provided array. */ toArray(array?: number[], offset?: number): number[]; toArray(array?: QuaternionTuple, offset?: 0): QuaternionTuple; /** * Copies x, y, z and w into the provided array-like. * @param array array-like to store the quaternion to. * @param offset (optional) optional offset into the array. * @return The provided array-like. */ toArray(array: ArrayLike, offset?: number): ArrayLike; /** * This method defines the serialization result of Quaternion. * @return The numerical elements of this quaternion in an array of format [x, y, z, w]. */ toJSON(): [number, number, number, number]; /** * Sets x, y, z, w properties of this quaternion from the attribute. * @param attribute the source attribute. * @param index index in the attribute. */ fromBufferAttribute(attribute: BufferAttribute | InterleavedBufferAttribute, index: number): this; _onChange(callback: () => void): this; _onChangeCallback: () => void; static slerpFlat( dst: number[], dstOffset: number, src0: number[], srcOffset: number, src1: number[], stcOffset1: number, t: number, ): void; static multiplyQuaternionsFlat( dst: number[], dstOffset: number, src0: number[], srcOffset: number, src1: number[], stcOffset1: number, ): number[]; random(): this; [Symbol.iterator](): Generator; }