# Maths - Dual Quaternion Example

Amy de Buitléir has kindly sent me this nice step-by-step example.

It illustrates how it is easier to just work with dual quaternions and forget about vectors..

Ex: We have a prop inside a container, which is inside a scene.
The prop is at (0, 0, 100), specified in the container's co-ordinate system.
The container is at (0, 0, 0), specified in the scene's co-ordinate system.
The container is also rotated +30° around the y-axis.

Note: I have shown the coordinates differently from usual (z down, y toward viewer).

Q: What is the location of the prop, specified in the scene's co-ordinate
system?

First, we need to build a dual quaternion to represent the state (location and rotation) of the prop wrt (with respect to) the container. We'll call this dual quaternion Q(prop,container).

The position of the prop with respect to the container can be represented by
the quaternion:

t(prop,container) = (0, 0, 0, 100)

The real part of the dual quaternion Q(prop,container) is 1 because prop isn't rotated. The dual part is:

dual part = (1/2)(real)t = (1/2)(1)(0, 0, 0, 100) = (0, 0, 0, 50)

Q(prop,container) = 1 + ε(0, 0, 0, 50)

Next, we need to build a dual quaternion to represent the state of the container wrt the scene.

t(container,home) = 0 because the container is not translated.

The container is rotated 30 around the y-axis, so
sx2 = sz2 = 0    sy2 = sin(30/2) = 0.2588
cx2 = cz2 = 1    cy2 = cos(30/2) = 0.9659
real part = (0.9659, 0, 0.2588, 0)

dual part = (1/2)(real)t = 0

Q(container,home) = (0.9659, 0, 0.2588, 0) + ε0 = (0.9659, 0, 0.2588, 0)

Now we're ready to calculate the state of the prop wrt the scene:

Q(prop,home) = Q(prop,container) * Q(container,home)
= [1 + ε(0, 0, 0, 50)] (0.9659, 0, 0.2588, 0)
= (0.9659, 0, 0.2588, 0) + ε(0, 0, 0, 50)(0.9659, 0, 0.2588, 0)
= (0.9659, 0, 0.2588, 0) + ε(0, -12.94, 0, 48.295)

We can easily extract the translation from this dual quaternion.

t(prop,home) = 2*real†*dual
= 2(0.9659, 0, 0.2588, 0)†(0, -12.94, 0, 48.295)
= 2(0.9659, 0, -0.2588, 0)(0, -12.94, 0, 48.295)
= 2(0, -25.0, 0, 43.3)
= (0, -50, 0, 86.6)

We can double-check this using an inverse transformation. We'll use the last
quaternion to calculate the state of the prop wrt the container, and verify
that it agrees with the original quaternion.

Q(prop,container) = Q(prop,home) * Q(home,container)
= Q(prop,home) * Q(container,home)†
= [(0.9659, 0, 0.2588, 0) + ε(0, -12.94, 0, 48.295)] (0.9659, 0, 0.2588, 0)†
= [(0.9659, 0, 0.2588, 0) + ε(0, -12.94, 0, 48.295)] (0.9659, 0, -0.2588, 0)
= 1 + ε(0, -12.94, 0, 48.295)(0.9659, 0, -0.2588, 0)
= 1 + ε(0, 0, 0, 50)

Which agrees with the original calculation.