Contents
raw proof

Propositions

The Großmann Identity states that

a×(b×c)=(ac)b(ab)c\mathbf{a} \times (\mathbf{b} \times\mathbf{c}) = (\mathbf{a}\cdot\mathbf{c})\mathbf{b}-(\mathbf{a}\cdot\mathbf{b})\mathbf{c}

The 3D vector cross-product is anti-commutative

a×b=(b×a)\mathbf{a}\times\mathbf{b}=-(\mathbf{b}\times\mathbf{a})

A vector is always orthogonal to its normal

ab×a=0\mathbf{a}\cdot\mathbf{b}\times\mathbf{a}=0

A quaternion written in vector form is defined as

q=(w,v)\mathbf{q} = (w, \mathbf{v})

Quaternion multiplication using vector form is defined as

q1q2=(w1w2v1v2,w1v2+w2v1+v1×v2)\mathbf{q}_1\mathbf{q}_2 = (w_1w_2- \mathbf{v}_1\cdot\mathbf{v}_2, w_1\mathbf{v}_2 + w_2\mathbf{v}_1 + \mathbf{v}_1\times\mathbf{v}_2)

Since the quaternion we use to rotate a vector is a versor, i.e q=1|\mathbf{q}|=1, we know that

w2=1vvw^2 = 1 - \mathbf{v}\cdot\mathbf{v}

Efficient vector rotation

The classic text book approach of rotating a vector uR3\mathbf{u}\in\mathbb{R}^3 by using a versor q=(w,v)\mathbf{q}=(w, \mathbf{v}) is by embedding the vector u\mathbf{u} into the augmented quaternion p=(0,u)\mathbf{p} = (0, \mathbf{u}) and determining the rotation by

p=(0,u)=qpq\mathbf{p}' = (0, \mathbf{u}') = \mathbf{q}\mathbf{p}\overline{\mathbf{q}}

However, this approach requires too many multiplications and a much better way is taking apart the expression

pq=(0,u)(w,v)=(uv,wuu×v)\begin{array}{rl} \mathbf{p}\overline{\mathbf{q}} &= (0,\mathbf{u})(w, -\mathbf{v})\\ &= (\mathbf{u}\cdot\mathbf{v}, w\mathbf{u} - \mathbf{u}\times\mathbf{v}) \end{array}

From which follows that

qpq=(w,v)(uv,wuu×v)=(w(uv)v(wuu×v),w(wuu×v)+(uv)v+v×(wuu×v))=(0,w2u+wv×u+(uv)v+wv×u+v×(v×u))=(0,u(vv)u+2wv×u+(uv)v+(vu)v(vv)u=(0,u+2wv×u+2(uv)v2(vv)u)=(0,u+2wv×u+2v×(v×u))=(0,u+2v×(wu+v×u))\begin{array}{rl} \mathbf{q}\mathbf{p}\overline{\mathbf{q}} &= (w, \mathbf{v})(\mathbf{u}\cdot\mathbf{v}, w\mathbf{u} - \mathbf{u}\times\mathbf{v})\\ &= (w(\mathbf{u}\cdot\mathbf{v}) - \mathbf{v}\cdot(w\mathbf{u} - \mathbf{u}\times\mathbf{v}), w(w\mathbf{u} - \mathbf{u}\times\mathbf{v}) + (\mathbf{u}\cdot\mathbf{v})\mathbf{v}+ \mathbf{v}\times(w\mathbf{u} - \mathbf{u}\times\mathbf{v}) )\\ &= (0, w^2\mathbf{u} + w\mathbf{v}\times\mathbf{u}+(\mathbf{u}\cdot\mathbf{v})\mathbf{v} + w\mathbf{v}\times\mathbf{u} + \mathbf{v}\times(\mathbf{v}\times\mathbf{u}))\\ &= (0, \mathbf{u} - (\mathbf{v}\cdot\mathbf{v})\mathbf{u}+ 2w\mathbf{v}\times\mathbf{u}+(\mathbf{u}\cdot\mathbf{v})\mathbf{v}+(\mathbf{v}\cdot\mathbf{u})\mathbf{v} - (\mathbf{v}\cdot\mathbf{v})\mathbf{u}\\ &= (0, \mathbf{u} + 2w\mathbf{v}\times\mathbf{u}+2(\mathbf{u}\cdot\mathbf{v})\mathbf{v}-2(\mathbf{v}\cdot\mathbf{v})\mathbf{u})\\ &= (0, \mathbf{u} + 2w\mathbf{v}\times\mathbf{u} + 2\mathbf{v}\times(\mathbf{v}\times\mathbf{u}))\\ &= (0, \mathbf{u} + 2\mathbf{v}\times (w\mathbf{u} + \mathbf{v}\times\mathbf{u}))\\ \end{array}

Which is a pretty nice finding! We can then rotate a vector u\mathbf{u} by

R(u)=u+2v×(wu+v×u)R(\mathbf{u}) = \mathbf{u} + 2\mathbf{v}\times (w\mathbf{u} + \mathbf{v}\times\mathbf{u})

Which can also be written as

t=2v×uR(u)=u+wt+v×t\begin{array}{rl} \mathbf{t}&=2\mathbf{v}\times\mathbf{u}\\ R(\mathbf{u}) &= \mathbf{u} + w\mathbf{t} + \mathbf{v}\times\mathbf{t} \end{array}