An Explination of Quaternions: http://mathworld.wolfram.com/Quaternion.html
q.new(r,i,j,k)
Creates a new Quaternion with real part [r] and imaginary parts [i], [j] and [k]
q.__add(a,b)
Metamethod for adding two Quaternions
q.__sub(a,b)
Metamethod for subtracting two Quaternions
q.__mul(a,b)
Metamethod for multiplying two quaternions
q.conj(a)
Quaternion Conjugation
q.magnitude(a)
Gets the magnitude of a Quaternion
q.normalize(a)
Normalizes a Quaternion to a magnitude of 1
q.inverse(a)
Gets the (multiplicative) inverse of a Quaternion
q.rotateVQ(vector,rotQ)
Rotates a 3-vector [vector] using Quaternion [rotQ]
q.toRotQ(angle, axis)
Returns the Rotation Quaternion from euler parameters: axis, and rotation about that axis
q.vecToQ(vector, r)
Creates a Quaternion with the imaginary part specified by [vector] and with a real part of [r]
q.getImag(a)
Returns the imaginary part of a Quaternion as a 3-vector
q.serialize(a, round)
Returns a string in form: "w + x + y + z". If specified, rounds to [round] amount of decimal places