```VI. Object: class Quaternion VI.A Description: A scalar and an HVector that encapsulate rotations VI.B Data Members: VI.B.1 Private Data Members Type Name (Description) double s (scalar) HVector v (vector) VI.B.2 Public Data Members Type Name (Description) int error (Error flag, non-zero value is an error found in qmv_errno.h or errno.h) VI.C Function Members: VI.C.1 Constructors: Name: Arguments (Description) Quaternion void (identity rotation s = 0, v = 1,0,0) Quaternion double a, (Quaternion s = a, v = [b,c,d]) double b, double c, double d Quaternion Quaternion &w (copy of w) Quaternion Quaternion *w (copy of Quaternion pointed at by w) Quaternion double a, (Quaternion s = a, v = b) HVector &b Quaternion double *w (Quaternion filled with w) Quaternion Euler &e (Convert Euler Rotation to Quaternion) Quaternion Radians &theta, (Convert Axes/Angle to Quaternion) Axes axis Quaternion Radians theta, (Convert Vector/Angle to Quaternion) HVector &b Quaternion Radians &theta, (Convert double*/Angle to Quaternion) double *b Quaternion HMatrix &M (Convert Rotation Matrix to Quaternion.) VI.C.2 Operators: Return Type Operator Arguments (Description) Quaternion& - void (unary negative) Quaternion& ~ void (conjugate (rotation in the opposite direction) Note the conjugate of ~(a*b) = ~a * ~b. So the conjugate of a composite rotation is not the inverse of the rotations) void = Quaternion &w (copies w) double& [] int i (references element i, you may set or get the value of element i, Element 0 is the scalar, Elements 1-3 are the Vector. VI.C.3 Functions: Return Type Name Arguments (Description) void print void (print the elements) void rotate Axes axis, (Coordinate rotate the Radians theta Quaternion around axis by theta radians) VI.C.4 Destructors: ~Quaternion (Required to release allocated memory) VI.D Friends: VI.D.1 Operators: Return Type Operator Arguments (Description) Quaternion& + Quaternion& A, (A + B) Quaternion& B Quaternion& - Quaternion& A, (A - B) Quaternion& B Quaternion& * Quaternion& A, (A * B (adds A rotation to B) Quaternion& B (Note that A*B = B*A is not always true )) Quaternion >> Quaternion& A, (A * ~B) Quaternion& B Quaternion << Quaternion& A, (~A * B) Quaternion& B Quaternion& * HVector& a, (a * B (Intermediate step)) Quaternion& B Quaternion& * Quaternion& A, (A * b (Intermediate step)) HVector& b double ^ Quaternion& A, (~A * B (inner product)) Quaternion& B Quaternion& * Euler& a, (Prepend a rotation to B Quaternion& B Quaternion rotations are the reverse order of Matrix rotations) Quaternion& * Quaternion& A, (Append b rotation to A) Euler& b VI.D.2 Functions: Return Type Name Arguments (Description) void HMatrix::HMatrix Quaternion& (Convert Quaternion to a rotation Matrix) HVector& HVector::operator= Quaternion& (Copy Quaternion to Vector) VI.E Example Code Quaternion a; // s = 1, v = 0 Degrees alpha(30.0); Euler eta(alpha,Z_AXIS); Quaternion b(eta); Vector x; x = 1.000; // x is the i unit vector [1,0,0] Vector y; y = b * x * ~b; // rotate x 30 degrees counter-clockwise (+) around the Z axis y = ~b * x * b; // rotate x 30 degrees clockwise (-) around the Z axis ``` Discuss this article in the forums Date this article was posted to GameDev.net: 7/16/1999 (Note that this date does not necessarily correspond to the date the article was written) See Also: Quaternions © 1999-2011 Gamedev.net. All rights reserved. Terms of Use Privacy Policy Comments? Questions? Feedback? Click here!