playcanvas
Version:
PlayCanvas WebGL game engine
452 lines (451 loc) • 17.6 kB
TypeScript
/**
* @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';