Quaternions
Quaternions can be used to represent rotations.
- Require less memory
- Concatenating quaternions require less arithmetic
- More easily interpolated
They are represented as a 4D vector.
The 4th component is a scalar value, taking the space for \( w \).
\[ q = s + \vec{v} = \langle w, x, y, z \rangle \]
Alternative representation (Grimoire uses this notation). This notation makes it look like a vector in homogenous coordinates.
\[ q = \langle x, y, z, w \rangle \]
Creating a quaternion from an angle and axis of rotation
\[ q = cos \frac{\theta}{2} + \vec{A} sin \frac{\theta}{2} \]
where \( \theta \) is an angle about the unit axis \( A \).
Multiplying Quaternions
Multiplication is NOT commutative, so order really matters.
\[ q_1 q_2 = s_1 s_2 - \vec{v_1} \cdot \vec{v_2} + s_1 \vec{v_2} + s_2 \vec{v_1} + \vec{v_1} \times \vec{v_2} \]
Rotating Vectors with Quaternions
Suppose some function \( \phi \) represents a rotation meant to be applied to some point \( \vec{P} \). To be a rotation it must:
- Preserve lengths
- Preserve angles
- Preserve handedness
Length is preserved if:
\[ \lVert \phi(\vec{P}) \rVert = \lVert \vec{P} \rVert \]
Angle is preserved if:
\[ \phi(\vec{P_1}) \cdot \phi(\vec{P_2}) = \vec{P_1} \cdot \vec{P_2} \]
Handed is preserved if:
\[ \phi(\vec{P_1}) \times \phi(\vec{P_2}) = \phi(\vec{P_1} \times \vec{P_2}) \]
This is how you do the above with a quaternion:
\[ \vec{P'} = q P q^{-1} \]
which is equivalent to:
\[ R_q = \begin{bmatrix} 1-2y^2 - 2 z^2 & 2xy-2wz & 2xz+2wy \\ 2xy+2wz & 1-2x^2-2z^2 & 2yz-2wx \\ 2xz-2wy & 2yz+2wx & 1-2x^2-2y^2 \end{bmatrix} \]
Spherical Linear Interpolation
\[ q(t) = \frac{sin \theta (1-t)}{sin \theta} q_1 + \frac{sin \theta t}{sin \theta} q_2 \] where \( 0 \le t \le 1 \)