UNPKG

playcanvas

Version:

PlayCanvas WebGL game engine

452 lines (451 loc) 17.6 kB
/** * @import { Mat4 } from './mat4.js' */ /** * A quaternion representing rotation in 3D space. Quaternions are typically used to represent * rotations in 3D applications, offering advantages over Euler angles including no gimbal lock and * more efficient interpolation. * * @category Math */ export class Quat { /** * A constant quaternion set to [0, 0, 0, 1] (the identity). Represents no rotation. * * @type {Quat} * @readonly */ static readonly IDENTITY: Quat; /** * A constant quaternion set to [0, 0, 0, 0]. * * @type {Quat} * @readonly */ static readonly ZERO: Quat; /** * Creates a new Quat instance. * * @overload * @param {number} [x] - The x value. Defaults to 0. * @param {number} [y] - The y value. Defaults to 0. * @param {number} [z] - The z value. Defaults to 0. * @param {number} [w] - The w value. Defaults to 1. * @example * const q1 = new pc.Quat(); // defaults to 0, 0, 0, 1 * const q2 = new pc.Quat(1, 2, 3, 4); */ constructor(x?: number, y?: number, z?: number, w?: number); /** * Creates a new Quat instance. * * @overload * @param {number[]} arr - The array to set the vector values from. * @example * const q = new pc.Quat([1, 2, 3, 4]); */ constructor(arr: number[]); /** * The x component of the quaternion. * * @type {number} */ x: number; /** * The y component of the quaternion. * * @type {number} */ y: number; /** * The z component of the quaternion. * * @type {number} */ z: number; /** * The w component of the quaternion. * * @type {number} */ w: number; /** * Returns an identical copy of the specified quaternion. * * @returns {this} A new quaternion identical to this one. * @example * const q = new pc.Quat(-0.11, -0.15, -0.46, 0.87); * const qclone = q.clone(); * * console.log("The result of the cloning is: " + qclone.toString()); */ clone(): this; /** * Conjugates a quaternion. * * @param {Quat} [src] - The quaternion to conjugate. If not set, the operation is done in place. * @returns {Quat} Self for chaining. * @example * const q = new pc.Quat(1, 2, 3, 4); * q.conjugate(); * // q is now [-1, -2, -3, 4] * @ignore */ conjugate(src?: Quat): Quat; /** * Copies the contents of a source quaternion to a destination quaternion. * * @param {Quat} rhs - The quaternion to be copied. * @returns {Quat} Self for chaining. * @example * const src = new pc.Quat(); * const dst = new pc.Quat(); * dst.copy(src); * console.log("The two quaternions are " + (src.equals(dst) ? "equal" : "different")); */ copy(rhs: Quat): Quat; /** * Calculates the dot product of two quaternions. * * @param {Quat} other - The quaternion to calculate the dot product with. * @returns {number} The dot product of the two quaternions. * @example * const a = new pc.Quat(1, 0, 0, 0); * const b = new pc.Quat(0, 1, 0, 0); * console.log("Dot product: " + a.dot(b)); // Outputs 0 */ dot(other: Quat): number; /** * Reports whether two quaternions are equal. * * @param {Quat} rhs - The quaternion to be compared against. * @returns {boolean} True if the quaternions are equal and false otherwise. * @example * const a = new pc.Quat(); * const b = new pc.Quat(); * console.log("The two quaternions are " + (a.equals(b) ? "equal" : "different")); */ equals(rhs: Quat): boolean; /** * Reports whether two quaternions are equal using an absolute error tolerance. * * @param {Quat} rhs - The quaternion to be compared against. * @param {number} [epsilon] - The maximum difference between each component of the two * quaternions. Defaults to 1e-6. * @returns {boolean} True if the quaternions are equal and false otherwise. * @example * const a = new pc.Quat(); * const b = new pc.Quat(); * console.log("The two quaternions are approximately " + (a.equalsApprox(b, 1e-9) ? "equal" : "different")); */ equalsApprox(rhs: Quat, epsilon?: number): boolean; /** * Gets the rotation axis and angle for a given quaternion. If a quaternion is created with * `setFromAxisAngle`, this method will return the same values as provided in the original * parameter list OR functionally equivalent values. * * @param {Vec3} axis - The 3-dimensional vector to receive the axis of rotation. * @returns {number} Angle, in degrees, of the rotation. * @example * const q = new pc.Quat(); * q.setFromAxisAngle(new pc.Vec3(0, 1, 0), 90); * const v = new pc.Vec3(); * const angle = q.getAxisAngle(v); * // Outputs 90 * console.log(angle); * // Outputs [0, 1, 0] * console.log(v.toString()); */ getAxisAngle(axis: Vec3): number; /** * Converts this quaternion to Euler angles, specified in degrees. The decomposition uses an * **intrinsic XYZ** order, representing the angles required to achieve the quaternion's * orientation by rotating sequentially: first around the X-axis, then around the newly * transformed Y-axis, and finally around the resulting Z-axis. * * @param {Vec3} [eulers] - An optional 3-dimensional vector to receive the calculated * Euler angles (output parameter). If not provided, a new Vec3 object will be allocated * and returned. * @returns {Vec3} The 3-dimensional vector holding the Euler angles in degrees. This will be * the same object passed in as the `eulers` parameter (if one was provided). * @example * const q = new pc.Quat(); * q.setFromAxisAngle(pc.Vec3.UP, 90); * const e = new pc.Vec3(); * q.getEulerAngles(e); * // Outputs [0, 90, 0] * console.log(e.toString()); */ getEulerAngles(eulers?: Vec3): Vec3; /** * Generates the inverse of the specified quaternion. * * @param {Quat} [src] - The quaternion to invert. If not set, the operation is done in place. * @returns {Quat} Self for chaining. * @example * // Create a quaternion rotated 180 degrees around the y-axis * const rot = new pc.Quat().setFromEulerAngles(0, 180, 0); * * // Invert in place * rot.invert(); */ invert(src?: Quat): Quat; /** * Returns the magnitude of the specified quaternion. * * @returns {number} The magnitude of the specified quaternion. * @example * const q = new pc.Quat(0, 0, 0, 5); * const len = q.length(); * // Outputs 5 * console.log("The length of the quaternion is: " + len); */ length(): number; /** * Returns the magnitude squared of the specified quaternion. * * @returns {number} The magnitude squared of the quaternion. * @example * const q = new pc.Quat(3, 4, 0, 0); * const lenSq = q.lengthSq(); * // Outputs 25 * console.log("The length squared of the quaternion is: " + lenSq); */ lengthSq(): number; /** * Performs a linear interpolation between two quaternions. The result of the interpolation * is written to the quaternion calling the function. * * @param {Quat} lhs - The quaternion to interpolate from. * @param {Quat} rhs - The quaternion to interpolate to. * @param {number} alpha - The value controlling the interpolation in relation to the two input * quaternions. The value is in the range 0 to 1, 0 generating q1, 1 generating q2 and anything * in between generating a linear interpolation between the two. * @returns {Quat} Self for chaining. * @example * const q1 = new pc.Quat(-0.11, -0.15, -0.46, 0.87); * const q2 = new pc.Quat(-0.21, -0.21, -0.67, 0.68); * * const result = new pc.Quat(); * result.lerp(q1, q2, 0); // Return q1 * result.lerp(q1, q2, 0.5); // Return the midpoint interpolant * result.lerp(q1, q2, 1); // Return q2 */ lerp(lhs: Quat, rhs: Quat, alpha: number): Quat; /** * Returns the result of multiplying the specified quaternions together. * * @param {Quat} rhs - The quaternion used as the second multiplicand of the operation. * @returns {Quat} Self for chaining. * @example * const a = new pc.Quat().setFromEulerAngles(0, 30, 0); * const b = new pc.Quat().setFromEulerAngles(0, 60, 0); * * // a becomes a 90 degree rotation around the Y axis * // In other words, a = a * b * a.mul(b); * * console.log("The result of the multiplication is: " + a.toString()); */ mul(rhs: Quat): Quat; /** * Multiplies each element of a quaternion by a number. * * @param {number} scalar - The number to multiply by. * @param {Quat} [src] - The quaternion to scale. If not set, the operation is done in place. * @returns {Quat} Self for chaining. * @example * const q = new pc.Quat(1, 2, 3, 4); * q.mulScalar(2); * // q is now [2, 4, 6, 8] */ mulScalar(scalar: number, src?: Quat): Quat; /** * Returns the result of multiplying the specified quaternions together. * * @param {Quat} lhs - The quaternion used as the first multiplicand of the operation. * @param {Quat} rhs - The quaternion used as the second multiplicand of the operation. * @returns {Quat} Self for chaining. * @example * const a = new pc.Quat().setFromEulerAngles(0, 30, 0); * const b = new pc.Quat().setFromEulerAngles(0, 60, 0); * const r = new pc.Quat(); * * // r is set to a 90 degree rotation around the Y axis * // In other words, r = a * b * r.mul2(a, b); */ mul2(lhs: Quat, rhs: Quat): Quat; /** * Normalizes the specified quaternion. * * @param {Quat} [src] - The quaternion to normalize. If not set, the operation is done in place. * @returns {Quat} The result of the normalization. * @example * const v = new pc.Quat(0, 0, 0, 5); * v.normalize(); * // Outputs [0, 0, 0, 1] * console.log(v.toString()); */ normalize(src?: Quat): Quat; /** * Sets the specified quaternion to the supplied numerical values. * * @param {number} x - The x component of the quaternion. * @param {number} y - The y component of the quaternion. * @param {number} z - The z component of the quaternion. * @param {number} w - The w component of the quaternion. * @returns {Quat} Self for chaining. * @example * const q = new pc.Quat(); * q.set(1, 0, 0, 0); * * // Outputs 1, 0, 0, 0 * console.log("The result of the vector set is: " + q.toString()); */ set(x: number, y: number, z: number, w: number): Quat; /** * Sets a quaternion from an angular rotation around an axis. * * @param {Vec3} axis - World space axis around which to rotate. Should be normalized. * @param {number} angle - Angle to rotate around the given axis in degrees. * @returns {Quat} Self for chaining. * @example * const q = new pc.Quat(); * q.setFromAxisAngle(pc.Vec3.UP, 90); */ setFromAxisAngle(axis: Vec3, angle: number): Quat; /** * Sets this quaternion to represent a rotation specified by Euler angles in degrees. * The rotation is applied using an **intrinsic XYZ** order: first around the X-axis, then * around the newly transformed Y-axis, and finally around the resulting Z-axis. * * @param {number|Vec3} ex - The angle to rotate around the X-axis in degrees, or a Vec3 * object containing the X, Y, and Z angles in degrees in its respective components (`ex.x`, * `ex.y`, `ex.z`). * @param {number} [ey] - The angle to rotate around the Y-axis in degrees. This parameter is * only used if `ex` is provided as a number. * @param {number} [ez] - The angle to rotate around the Z-axis in degrees. This parameter is * only used if `ex` is provided as a number. * @returns {Quat} The quaternion itself (this), now representing the orientation from the * specified XYZ Euler angles. Allows for method chaining. * @example * // Create a quaternion from 3 individual Euler angles (interpreted as X, Y, Z order) * const q1 = new pc.Quat(); * q1.setFromEulerAngles(45, 90, 180); // 45 deg around X, then 90 deg around Y', then 180 deg around Z'' * console.log("From numbers:", q1.toString()); * @example * // Create the same quaternion from a Vec3 containing the angles (X, Y, Z) * const anglesVec = new pc.Vec3(45, 90, 180); * const q2 = new pc.Quat(); * q2.setFromEulerAngles(anglesVec); * console.log("From Vec3:", q2.toString()); // Should match q1 */ setFromEulerAngles(ex: number | Vec3, ey?: number, ez?: number): Quat; /** * Converts the specified 4x4 matrix to a quaternion. Note that since a quaternion is purely a * representation for orientation, only the rotational part of the matrix is used. * * @param {Mat4} m - The 4x4 matrix to convert. * @returns {Quat} Self for chaining. * @example * // Create a 4x4 rotation matrix of 180 degrees around the y-axis * const rot = new pc.Mat4().setFromAxisAngle(pc.Vec3.UP, 180); * * // Convert to a quaternion * const q = new pc.Quat().setFromMat4(rot); */ setFromMat4(m: Mat4): Quat; /** * Set the quaternion that represents the shortest rotation from one direction to another. * * @param {Vec3} from - The direction to rotate from. It should be normalized. * @param {Vec3} to - The direction to rotate to. It should be normalized. * @returns {Quat} Self for chaining. * @example * const q = new pc.Quat(); * const from = new pc.Vec3(0, 0, 1); * const to = new pc.Vec3(0, 1, 0); * q.setFromDirections(from, to); */ setFromDirections(from: Vec3, to: Vec3): Quat; /** * Performs a spherical interpolation between two quaternions. The result of the interpolation * is written to the quaternion calling the function. * * @param {Quat} lhs - The quaternion to interpolate from. * @param {Quat} rhs - The quaternion to interpolate to. * @param {number} alpha - The value controlling the interpolation in relation to the two input * quaternions. The value is in the range 0 to 1, 0 generating q1, 1 generating q2 and anything * in between generating a spherical interpolation between the two. * @returns {Quat} Self for chaining. * @example * const q1 = new pc.Quat(-0.11, -0.15, -0.46, 0.87); * const q2 = new pc.Quat(-0.21, -0.21, -0.67, 0.68); * * const result = new pc.Quat(); * result.slerp(q1, q2, 0); // Return q1 * result.slerp(q1, q2, 0.5); // Return the midpoint interpolant * result.slerp(q1, q2, 1); // Return q2 */ slerp(lhs: Quat, rhs: Quat, alpha: number): Quat; /** * Transforms a 3-dimensional vector by the specified quaternion. * * @param {Vec3} vec - The 3-dimensional vector to be transformed. * @param {Vec3} [res] - An optional 3-dimensional vector to receive the result of the transformation. * @returns {Vec3} The transformed vector (res if specified, otherwise a new Vec3). * @example * // Create a 3-dimensional vector * const v = new pc.Vec3(1, 2, 3); * * // Create a quaternion rotation * const q = new pc.Quat().setFromEulerAngles(10, 20, 30); * * const tv = q.transformVector(v); */ transformVector(vec: Vec3, res?: Vec3): Vec3; /** * Set the values of the quaternion from an array. * * @param {number[]|ArrayBufferView} arr - The array to set the quaternion values from. * @param {number} [offset] - The zero-based index at which to start copying elements from the * array. Default is 0. * @returns {Quat} Self for chaining. * @example * const q = new pc.Quat(); * q.fromArray([20, 10, 5, 0]); * // q is set to [20, 10, 5, 0] */ fromArray(arr: number[] | ArrayBufferView, offset?: number): Quat; /** * Converts the quaternion to string form. * * @returns {string} The quaternion in string form. * @example * const q = new pc.Quat(0, 0, 0, 1); * // Outputs [0, 0, 0, 1] * console.log(q.toString()); */ toString(): string; /** * @overload * @param {number[]} [arr] - The array to populate with the quaternion's number * components. If not specified, a new array is created. * @param {number} [offset] - The zero-based index at which to start copying elements to the * array. Default is 0. * @returns {number[]} The quaternion as an array. */ toArray(arr?: number[], offset?: number): number[]; /** * @overload * @param {ArrayBufferView} arr - The array to populate with the quaternion's number * components. If not specified, a new array is created. * @param {number} [offset] - The zero-based index at which to start copying elements to the * array. Default is 0. * @returns {ArrayBufferView} The quaternion as an array. */ toArray(arr: ArrayBufferView, offset?: number): ArrayBufferView; } import { Vec3 } from './vec3.js'; import type { Mat4 } from './mat4.js';