Quaternions and spatial rotation

Quaternions are used in computer graphics and related fields because they allow for compact representations of rotations, or correspondingly, orientations, in 3D space:

Consider the quaternions with modulus 1 (these are sometimes called versors). They form a multiplicative group, acting on R3: for any such quaternion $\displaystyle z = \cos\frac{\alpha}{2} + \sin\frac{\alpha}{2}\,\hat\mathbf{v}$ , the mapping f(x) = z x z* is a counterclockwise rotation through an angle $\displaystyle \alpha\,$ about an axis v; -z is the same rotation. Composition of arbitrary rotations in R3 corresponds to the fairly simple operation of quaternion multiplication.

A pair of quaternions also allows for compact representations of rotations in 4D space; this is because the four-dimensional rotation group SO(4) may be written as a semi-direct product of the three-dimensional rotation group SO(3). The quaternions are, in turn closely related to the double covering of SO(3) by SU(2). Also closely related are the Lorentz group SL(2,C) and the Poincaré group.

Introduction

Every quaternion z = a + bi + cj + dk can be viewed as a sum a + u of a real number a (called the “real part” of the quaternion) and a 3-vector u = (b, c, d) = bi + cj + dk in R3 (called the “imaginary part”). In this view, quaternions are “mixed sums” of scalars and 3-vectors, and the quaternions i, j, and k correspond to the unit vectors i, j, and k.

Two such quaternions are added by adding the real parts and the imaginary parts separately:

(a + u) + (b + v) = (a + b) + (u + v)

The multiplication of quaternions translates into the following rule:

(a + u) (b + v) = (ab − <u, v>) + (av + bu + u × v)

Here, <u, v> denotes the scalar product and u × v the vector product of u and v.

This formula shows that two quaternions z and w commute, i.e., zw = wz, if and only if their imaginary parts are collinear vectors (because, in this case, the vector product of their imaginary parts will simply be equal to the zero vector).

Quaternion rotation

It is well known that the vector product is related to rotation in space. The goal then is to find a formula which expresses rotation in 3D space using quaternion multiplication, similar to the formula for a rotation in 2D using complex multiplication,

$\displaystyle f(w) = zw$ ,

where

$\displaystyle z = e^{\alpha i}$

is used for rotation by an angle α.

The formula in 3D cannot be a simple multiplication with a quaternion, because rotating a vector should yield a vector. Multiplying a vector with a non-trivial quaternion yields a result with non-zero real part, and thus not a vector.

It turns out that we can cancel the real part if we multiply by a quaternion from one side and with its inverse from the other side. Let z = a + u be a non-zero quaternion, and consider the function

f(v) = z v z−1

where z−1 is the multiplicative inverse of z and v is a vector, considered as a quaternion with zero real part. The function f is known as conjugation by z. Note that the real part of f(v) is zero, because in general zw and wz have the same real part for any quaternions z and w, and so

$\displaystyle \mathfrak{R}(z \ \mathbf{v} \ z^{-1}) = \mathfrak{R}(\mathbf{v} \ z^{-1} \ z) = \mathfrak{R}(\mathbf{v} \ 1) = 0$

(note that this proof requires the associativity of quaternion multiplication). Furthermore, f is a R-linear and we have f(v) = v if and only if v and the imaginary part u of z are collinear (because f(v) = v means v z = z v). Hence f is a rotation whose axis of rotation passes through the origin and is given by the vector u.

Note that conjugation with z is the same as conjugation with rz for any real number r. We can thus restrict our attention to the quaternions of absolute value 1, the so-called unit quaternions. Note that even then z and -z represent the same rotation. (The absolute value |z| of the quaternion z = a + v is defined as the square root of a2 + ||v||2. It is multiplicative: |zw| = |z| |w|.) Inverting unit quaternions is especially easy: If |z| = 1, then z−1 = z* (the conjugate z* of the quaternion z = a + v is defined as z* = av) and this makes our rotation formula even easier.

It turns out that the angle of rotation α is also easy to read off if we are dealing with a unit quaternion z = a + v: we have

$\displaystyle a = \cos \frac{\alpha}{2}$ .

To summarize, a counterclockwise rotation through an angle α about an axis v can be represented via conjugation by the unit quaternion z

$\displaystyle z = a + \sin\frac{\alpha}{2}\,\hat\mathbf{v}$
$\displaystyle z = \cos\frac{\alpha}{2} + \sin\frac{\alpha}{2}\,\hat\mathbf{v}$

where $\displaystyle \hat\mathbf{v}$ is the normalized vector

$\displaystyle \hat\mathbf{v} = \frac{\mathbf{v}}{\|\mathbf{v}\|}$ .

The composition of two rotations corresponds to quaternion multiplication: if the rotation f is represented by conjugation with the quaternion z and the rotation g is represented by conjugation with w, then the composition f o g is represented by conjugation with zw.

If one wishes to rotate about an axis that doesn’t pass through the origin, then one first translates the vectors into the origin, conjugates, and translates back.

The angle between two quaternions should not be confused with the angle of rotation involved in the rotation between the orientations corresponding to these quaternions: the former is half of the latter (or 180° minus half the latter). The angle between the axes of two rotations is again different.

For example the quaternion for the identity is ±1 and for a 180° rotation about the z-axis is ±k. The angle between the two quaternions is 90°. The angle between the axes of the two rotations is in this case undefined.

An example

Let us consider the rotation f around the axis u = i + j + k, with an rotation angle of 120°—i.e., 3 radians.

$\displaystyle \alpha = \frac{2 \pi}{3} = 120^\circ$

The length of u is √3, the half angle is π3 ( 60° ) with cosine ½ ( cos 60° = 0.5 ) and sine √32 ( sin 60° = 0.866 ). We are therefore dealing with a conjugation by the unit quaternion

$\displaystyle z = \cos\frac{\alpha}{2} + \sin\frac{\alpha}{2}\,\hat\mathbf{u}$
$\displaystyle z = \cos 60^\circ + \sin 60^\circ\,\hat\mathbf{u}$
$\displaystyle z = \frac{1}{2} + \frac{\sqrt{3}}{2}\cdot\,\hat\mathbf{u}$
$\displaystyle z = \frac{1}{2} + \frac{\sqrt{3}}{2}\cdot \frac{(i+j+k)}{\sqrt{3}}$
$\displaystyle z = \frac{1 + i + j + k}{2}$ .

Concretely,

f(ai + bj + ck) = z (ai + bj + ck) z*

(note that $\displaystyle z^*=1/z$ , as $\displaystyle z$ has unit modulus; here $\displaystyle z^*=\frac{1-i-j-k}{2}$ ). This can be simplified, using the ordinary rules for quaternion arithmetic, to

f(ai + bj + ck) = ci + aj + bk,

as expected: the rotation corresponds to keeping a cube held fixed at one point, and rotating it $\displaystyle 120^\circ$ about the long diagonal through the fixed point (observe how the three axes are permuted cyclically).

Quaternions versus other representations of rotations

The representation of a rotation as a quaternion (4 numbers) is more compact than the representation as an orthogonal matrix (9 numbers). Furthermore, for a given axis and angle, one can easily construct the corresponding quaternion, and conversely, for a given quaternion one can easily read off the axis and the angle. Both of these are much harder with matrices or Euler angles.

In computer games and other applications, one is often interested in “smooth rotations,” meaning that the scene should slowly rotate and not in a single step. This can be accomplished by choosing a curve such as the spherical linear interpolation in the quaternions, with one endpoint being the identity transformation 1 (or some other initial rotation) and the other being the intended final rotation. This is more problematic with other representations of rotations.

When composing several rotations on a computer, rounding errors necessarily accumulate. A quaternion that’s slightly off still represents a rotation after being normalised—a matrix that’s slightly off need not be orthogonal anymore and therefore is harder to convert back to a proper orthogonal matrix.

The orthogonal matrix corresponding to a rotation by the unit quaternion z = a + bi + cj + dk (with |z| = 1) is given by

$\displaystyle \begin{pmatrix} a^2+b^2-c^2-d^2&2bc-2ad &2ac+2bd \\ 2ad+2bc &a^2-b^2+c^2-d^2&2cd-2ab \\ 2bd-2ac &2ab+2cd &a^2-b^2-c^2+d^2\\ \end{pmatrix}$

(Compare the equivalent general formula for a 3 × 3 rotation matrix in terms of the axis and the angle.)

Pairs of unit quaternions as rotations in 4D space

A pair of unit quaternions zl and zr can represent any rotation in 4D space. Given a four dimensional vector v, and pretending that it is a quaternion, we can rotate the vector v like this:

$\displaystyle f(v)=z_lvz_r= \begin{pmatrix} a_l&-b_l&-c_l&-d_l\\ b_l&a_l&-d_l&c_l\\ c_l&d_l&a_l&-b_l\\ d_l&-c_l&b_l&a_l \end{pmatrix}\begin{pmatrix} a_r&-b_r&-c_r&-d_r\\ b_r&a_r&d_r&-c_r\\ c_r&-d_r&a_r&b_r\\ d_r&c_r&-b_r&a_r \end{pmatrix}\begin{pmatrix} w\\x\\y\\z \end{pmatrix}$

It is straightforward to check that for each matrix MMT=I, that is, that each matrix (and hence both matrices together) represents a rotation. Note that since (zlv)zr = zl(vzr), the two matrices must commute. Therefore, there are two commuting subgroups of the set of four dimensional rotations. Arbitrary four dimensional rotations have 6 degrees of freedom, each matrix represents 3 of those 6 degrees of freedom.

Since an infinitesimal four dimensional rotation can be represented by a pair of quaternions (as follows), all (non-infinitesimal) four dimensional rotations can also be represented.

$\displaystyle z_lvz_r=\begin{pmatrix} 1 &-dt_{ab}&-dt_{ac}&-dt_{ad}\\ dt_{ab}&1 &-dt_{bc}&-dt_{bd}\\ dt_{ac}& dt_{bc}&1 &-dt_{cd}\\ dt_{ad}& dt_{bd}& dt_{cd}&1 \end{pmatrix}\begin{pmatrix} w\\ x\\ y\\ z \end{pmatrix}$

$\displaystyle z_l= \left(1+{dt_{ab}+dt_{cd}\over 2}i+{dt_{ac}-dt_{bd}\over 2}j+{dt_{ad}+dt_{bc}\over 2}k\right)$

$\displaystyle z_r= \left(1+{dt_{ab}-dt_{cd}\over 2}i+{dt_{ac}+dt_{bd}\over 2}j+{dt_{ad}-dt_{bc}\over 2}k\right)$