Memo for myself about quaternions (when used to calculate rotation in 3D space).
A quaternion is an extension of the complex numbers. In the context of a spatial rotation, it's a vector of dimension 4 encoding a rotation angle in radians around an axis in 3D. The advantages of using quaternions over rotation matrices are: they use less memory, they are more numerically stable, and they are easier to use.
Structure to memorise a quaternion:
A default quaternion corresponding to no rotation has values \((0, 0, 0, 1)\). Using the conventions: same handness for the rotation as for the coordinates system; matrix stored by row. Creating a quaternion from a rotation axis and an angle can be done as follow:
Converting a rotation matrix to a quaternion can be done as follow:
Converting a quaternion to a rotation matrix can be done as follow:
Adding two quaternions can be done as follow:
Substracting two quaternions can be done as follow:
The conjugate of a quaternion (the inverse rotation) can be calculated as follow:
Applying a quaternion to a vector can be done as follow:
Applying the conjugate of a quaternion to a vector can be done as follow:
The rotation angle of the quaternion can be obtained as follow:
The rotation axis of a quaternion can be calculated as follow:
The rotation angle of a quaternion can be increased as follow:
Unit test to check that the implementation is correct: