# Guide to Game Development/Theory/Mathematics/Quaternions
## About

Quaternions are used for rotating a geometry and points with along multiple axes of rotation. They exist in four dimensions, and so that have four parts: w, x, y and z. As x, y and z are linked and similar to each other, people sometimes use another letter to represent all three, v is common for this. To represent them you should store them in a 4-dimensional vector like so: ${\textbf {q}}={\begin{pmatrix}w\\x\\y\\z\end{pmatrix}}$. Quaternions are used as an alternative to Euler angles.
Benefits of Quaternions:
* No gimbal locking
* Interpolation is smooth and direct
* Simple to do calculations with

## Basic creation of a quaternion

So if you chose some unit length 3D-vector that you could like to rotate the geometry around (${\hat {\textbf {n}}}$) and an amount of degrees that you want to rotate the geometry ($\theta$) then create a rotation quaternion (${\textbf {q}}$).
There are generally two forms for representing quaternion, short and long. In the short notation it shows it in terms of w and v (a combination of x, y and z).
${\textbf {q}}={\bigg\cos {\bigg{\frac {\theta }{2}}{\bigg )},{\hat {\textbf {n}}}\sin {\bigg{\frac {\theta }{2}}{\bigg )}{\bigg )}$
This can be represented in the long notation using w, x, y and z:
${\textbf {q}}={\begin{pmatrix}\cos({\frac {\theta }{2}})\\{\hat {\textbf {n}}}_{x}\sin({\frac {\theta }{2}})\\{\hat {\textbf {n}}}_{y}\sin({\frac {\theta }{2}})\\{\hat {\textbf {n}}}_{z}\sin({\frac {\theta }{2}})\end{pmatrix}}$
Where: $w^{2}+x^{2}+y^{2}+z^{2}=1$
If a quaternion is not rotated, then it will have the value: ${\textbf {q}}={\begin{pmatrix}1\\0\\0\\0\end{pmatrix}}$

## Links with imaginary numbers

The 4 components (w, x, y and z) can be broken down into one real number and three imaginary numbers:
$w+ix+jy+kz$ where $i$, $j$ and $k$ are imaginary numbers such that $i^{2}=j^{2}=k^{2}=ijk=-1$. From that, you can create the following statements:
${\begin{aligned}ij=k=-ji\\jk=i=-kj\\ki=j=-ik\\ik=-j=-ki\\ji=-k=-ij\\kj=-i=-jk\end{aligned}}$

## Inverse Quaternions

To invert a quaternion, simply multiply the x, y and z components by -1.
${\textbf {q}}={\begin{pmatrix}w\\x\\y\\z\end{pmatrix}}$
${\textbf {q}}^{-1}={\begin{pmatrix}w\\-x\\-y\\-z\end{pmatrix}}$

## Multiplying quaternions

When multiplying two quaternions together, order matters (${\textbf {Q}}={\textbf {RS}}\neq {\textbf {SR}}$).
The multiple is defined by:
${\textbf {Q}}={\textbf {RS}}=[w_{r}+ix_{r}+jy_{r}+kz_{r}][w_{s}+ix_{s}+jy_{s}+kz_{s}]=[w_{s}w_{r}-{\hat {\textbf {n}}}_{s}\cdot {\hat {\textbf {n}}}_{r},w_{s}{\hat {\textbf {n}}}_{r}+w_{r}{\hat {\textbf {n}}}_{s}+{\hat {\textbf {n}}}_{r}\times {\hat {\textbf {n}}}_{s}]={\begin{pmatrix}w_{s}w_{r}-{\hat {\textbf {n}}}_{s}\cdot {\hat {\textbf {n}}}_{v}\\w_{s}{\hat {\textbf {n}}}_{r_{x}}+w_{r}{\hat {\textbf {n}}}_{s_{x}}+({\hat {\textbf {n}}}_{r}\times {\hat {\textbf {n}}}_{s})_{x}\\w_{s}{\hat {\textbf {n}}}_{r_{y}}+w_{r}{\hat {\textbf {n}}}_{s_{y}}+({\hat {\textbf {n}}}_{r}\times {\hat {\textbf {n}}}_{s})_{y}\\w_{s}{\hat {\textbf {n}}}_{r_{z}}+w_{r}{\hat {\textbf {n}}}_{s_{z}}+({\hat {\textbf {n}}}_{r}\times {\hat {\textbf {n}}}_{s})_{z}\end{pmatrix}}$

## Spherical Linear Interpolation (SLERP)

This is how you Interpolate gradually between two quaternions, like getting a mid-point (or some other point) between two quaternions.

### Superscript notation for Quaternions

Before you can do SLERP, you need to understand the superscript notation for a quaternion.
If you have a quaternion a and you use the superscript notation to raise it to the power t, this means that it will scale the angles inside the quaternion by superscript t. As this only scales all of the angles, this means that the magnitude ($w^{2}+x^{2}+y^{2}+z^{2}$) of the Quaternion is still 1.

#### Superscript notation in short notation

${\textbf {a}}={\bigg\cos {\bigg{\frac {\theta }{2}}{\bigg )},{\hat {\textbf {n}}}\sin {\bigg{\frac {\theta }{2}}{\bigg )}{\bigg )}$
${\textbf {a}}^{t}={\bigg\cos {\bigg{\frac {t\theta }{2}}{\bigg )},{\hat {\textbf {n}}}\sin {\bigg{\frac {t\theta }{2}}{\bigg )}{\bigg )}$

#### Superscript notation in long notation

${\textbf {a}}={\begin{pmatrix}\cos({\frac {\theta }{2}})\\{\hat {\textbf {n}}}_{x}\sin({\frac {\theta }{2}})\\{\hat {\textbf {n}}}_{y}\sin({\frac {\theta }{2}})\\{\hat {\textbf {n}}}_{z}\sin({\frac {\theta }{2}})\end{pmatrix}}$
${\textbf {a}}^{t}={\begin{pmatrix}\cos({\frac {t\theta }{2}})\\{\hat {\textbf {n}}}_{x}\sin({\frac {t\theta }{2}})\\{\hat {\textbf {n}}}_{y}\sin({\frac {t\theta }{2}})\\{\hat {\textbf {n}}}_{z}\sin({\frac {t\theta }{2}})\end{pmatrix}}$

### The SLERP Equation

If your first Quaternion was q and the second quaternion was r and you wanted to find a point in-between (p) which is t percent of the way from q to r, where 0 ≤ t ≤ 1.
The final equation is defined as:
${\textbf {p}}=({\textbf {r}}{\textbf {q}}^{-1})^{t}{\textbf {q}}$

## See also

* Creating a Quaternion class in code

## External Links

Youtube:
* Math for game developers:
** Quaternion playlist
* Humane Rigging 03 - 3D Bouncy Ball 05 - Quaternion Rotation
* Hand Calculation of Quaternion Rotation
Wikipedia pages:
* Quaternion
* Quaternions and spatial rotation
* Slerp - Spherical Linear Interpolation
Wikibooks:
* Abstract_Algebra/Quaternions

## References

* ↑ https://www.youtube.com/watch?v=4mXL751ko0w at 1:35
* ↑ https://www.youtube.com/watch?v=SCbpxiCN0U0 at 5:39
* ↑ https://www.youtube.com/watch?v=4mXL751ko0w at 4:05
* ↑ https://www.youtube.com/watch?v=CRiR2eY5R_s at 8:28
* ↑ https://en.wikipedia.org/wiki/Slerp#Quaternion_Slerp