Dual quaternions are a powerful mathematical tool widely used in 3D graphics, especially for skeletal animation and skinning.
what are Quaternions?
In 1843 mathematician William Rowan Hamilton was out walking along the Royal Canal in Dublin with his wife when the solution in the form of the following equation suddenly occurred to him:
i 2 = j 2 = k 2 = i j k = − 1 i^2 = j^2= k^2 = ijk = -1 i 2 = j 2 = k 2 = ij k = − 1
4 ⏟ Real part (Scalar) + 6 i + 1 j + 9 k ⏟ Imaginary part (Vector) \underbrace{4}_{\text{Real part (Scalar)}} + \underbrace{6i + 1j + 9k}_{\text{Imaginary part (Vector)}} Real part (Scalar) 4 + Imaginary part (Vector) 6 i + 1 j + 9 k
A quaternion is a four-dimensional extension of the complex numbers. They have pragmatic utility describing rotation in 3D and even quantum mechanics
Quaternion Basics
A quaternion is written as:
q = w + x i + y i + z k q = w + xi + yi + zk q = w + x i + y i + z k
where
w w w : scalar part
( x , y , z ) (x,y,z) ( x , y , z ) : vector part
i , j , k i,j,k i , j , k : imaginary units
The products of basis elements are defined by i 2 = j 2 = k 2 = i j k = − 1 i^2 = j^2= k^2 = ijk = -1 i 2 = j 2 = k 2 = ij k = − 1
The equality i j k = − 1 ijk = -1 ij k = − 1 results from
( i j ) k = k 2 = − 1 (ij)k = k^2 = -1 ( ij ) k = k 2 = − 1
By right-multiplying both side of − 1 i j k -1 ijk − 1 ij k by − k -k − k we get:
− 1 = i j k − 1 ( − k ) = ( i j k ) ( − k ) k = ( i j ) ( k ( − k ) ) k = ( i j ) ( − k 2 ) k = ( i j ) ( − ( − 1 ) ) k = i j \begin{aligned}
-1 &= ijk \\
-1 (-k) &= (ijk)(-k) \\
k &= (ij)(k ( -k)) \\
k &= (ij)(-k^2) \\
k &= (ij)(- (-1)) \\
k &= ij
\end{aligned} − 1 − 1 ( − k ) k k k k = ij k = ( ij k ) ( − k ) = ( ij ) ( k ( − k )) = ( ij ) ( − k 2 ) = ( ij ) ( − ( − 1 )) = ij
Similarly, we can get the following:
i 2 = j 2 = k 2 = − 1 i2=j2=k2=−1 i 2 = j 2 = k 2 = − 1
i j = k j i = − k j k = i k j = − i k i = j i k = − j \begin{aligned}
ij &= k \quad & ji &= -k \\
jk &= i \quad & kj &= -i \\
ki &= j \quad & ik &= -j
\end{aligned} ij j k k i = k = i = j j i k j ik = − k = − i = − j
Note: Quaternion multiplication is noncommutative
Quaternion Multiplication
Quaternions can be multiplied as:
( w 1 + x 1 i + y 1 j + z 1 k ) ( w 2 + x 2 i + y 2 j + z 2 k ) = w 1 w 2 − x 1 x 2 − y 1 y 2 − z 1 z 2 + ( w 1 x 2 + x 1 w 2 + y 1 z 2 − z 1 y 2 ) i + ( w 1 y 2 + y 1 w 2 + z 1 x 2 − x 1 z 2 ) j + ( w 1 z 2 + z 1 w 2 + x 1 y 2 − y 1 x 2 ) k \colorbox{white}{%
\color{black} %
$
\begin{aligned}
&(\textcolor{blue}{w_1} + \textcolor{red}{x_1}i + \textcolor{green}{y_1}j + \textcolor{purple}{z_1}k) (\textcolor{blue}{w_2} + \textcolor{red}{x_2}i + \textcolor{green}{y_2}j + \textcolor{purple}{z_2}k) \\
&= \textcolor{blue}{w_1}\textcolor{blue}{w_2}- \textcolor{red}{x_1}\textcolor{red}{x_2}- \textcolor{green}{y_1}\textcolor{green}{y_2}- \textcolor{purple}{z_1}\textcolor{purple}{z_2} \\
&\quad + (\textcolor{blue}{w_1}\textcolor{red}{x_2}+ \textcolor{red}{x_1}\textcolor{blue}{w_2}+ \textcolor{green}{y_1}\textcolor{purple}{z_2}- \textcolor{purple}{z_1}\textcolor{green}{y_2})\, i \\
&\quad + (\textcolor{blue}{w_1}\textcolor{green}{y_2}+ \textcolor{green}{y_1}\textcolor{blue}{w_2}+ \textcolor{purple}{z_1}\textcolor{red}{x_2}- \textcolor{red}{x_1}\textcolor{purple}{z_2})\, j \\
&\quad + (\textcolor{blue}{w_1}\textcolor{purple}{z_2}+ \textcolor{purple}{z_1}\textcolor{blue}{w_2}+ \textcolor{red}{x_1}\textcolor{green}{y_2}- \textcolor{green}{y_1}\textcolor{red}{x_2})\, k
\end{aligned}
$
} ( w 1 + x 1 i + y 1 j + z 1 k ) ( w 2 + x 2 i + y 2 j + z 2 k ) = w 1 w 2 − x 1 x 2 − y 1 y 2 − z 1 z 2 + ( w 1 x 2 + x 1 w 2 + y 1 z 2 − z 1 y 2 ) i + ( w 1 y 2 + y 1 w 2 + z 1 x 2 − x 1 z 2 ) j + ( w 1 z 2 + z 1 w 2 + x 1 y 2 − y 1 x 2 ) k
Given two quaternions:
q 1 = ( w 1 , v 1 ) , q 2 = ( w 2 , v 2 ) q_1=(w_1,v_1), \quad q_2=(w_2,v_2) q 1 = ( w 1 , v 1 ) , q 2 = ( w 2 , v 2 )
Thier product is:
q 1 q 2 = ( w 1 w 2 − v 1 ⋅ v 2 , w 1 v 2 + w 2 v 1 + v 1 × v 2 ) q_1q_2=(w_1w_2−v_1⋅v_2, w_1v_2+w_2v_1+v_1×v_2) q 1 q 2 = ( w 1 w 2 − v 1 ⋅ v 2 , w 1 v 2 + w 2 v 1 + v 1 × v 2 )
This form is much easier to compute using:
Dot product (⋅)
Cross product (×)
Dual Numbers
A dual number looks like:
Z = a + b ε Z = a + bε Z = a + b ε
Where:
a a a : real part
b b b : dual part
ε 2 = 0 ε^2 = 0 ε 2 = 0 , but ε ≠ 0 ε \neq 0 ε = 0
Note :
Real parts behave normally
Dual parts act like a cross interaction term
Dual Quaternions
A dual quaternion combines both ideas:
q ^ = q 0 + ε q ϵ \hat{q} = q_0 + \varepsilon q_\epsilon q ^ = q 0 + ε q ϵ
So a dual quaternion has 8 components :
1, i, j, k
ε , i ε , j ε , k ε ε, iε, jε, kε ε , i ε , j ε , k ε
Multiplication Rule
Let:
D 1 = q 1 + ϵ q 1 ′ D 2 = q 2 + ϵ q 2 ′ \begin{aligned}
D_1 &= q_1 + \epsilon q'_1 \\
D_2 &= q_2 + \epsilon q'_2 \\
\end{aligned} D 1 D 2 = q 1 + ϵ q 1 ′ = q 2 + ϵ q 2 ′
Then:
D 1 D 2 = q 1 q 2 + ε ( q 1 q 2 ′ + q 1 ′ q 2 ) D_1D_2=q_1q_2+ε(q_1q'_2+q'_1q_2) D 1 D 2 = q 1 q 2 + ε ( q 1 q 2 ′ + q 1 ′ q 2 )
Note :
The real part is just quaternion multiplication
The dual part mixes real and dual components
The term ε 2 = 0 ε^2=0 ε 2 = 0 , so dual × dual disappears
Example:
Given:
D 1 = ( 1 , 2 i , j , k ) + ( 1 , 2 i , j , k ) ε D 2 = ( 1 , i , 3 j , k ) + ( 1 , i , j , k ) ε \begin{aligned}
D_1 &= (1, 2i, j, k) + (1, 2i, j, k)\,\varepsilon \\
D_2 &= (1, i, 3j, k) + (1, i, j, k)\,\varepsilon
\end{aligned} D 1 D 2 = ( 1 , 2 i , j , k ) + ( 1 , 2 i , j , k ) ε = ( 1 , i , 3 j , k ) + ( 1 , i , j , k ) ε
Step 1: Real Part
q 1 = ( 1 , 2 i , j , k ) q 2 = ( 1 , i , 3 j , k ) \begin{aligned}
q_1 &= (1, 2i, j, k) \\
q_2 &= (1, i, 3j, k)
\end{aligned} q 1 q 2 = ( 1 , 2 i , j , k ) = ( 1 , i , 3 j , k )
Expand Quaternion Multiplication
q 1 q 2 = ( 1 + 2 i + j + k ) ( 1 + i + 3 j + k ) = 1 ( 1 + i + 3 j + k ) + 2 i ( 1 + i + 3 j + k ) + j ( 1 + i + 3 j + k ) + k ( 1 + i + 3 j + k ) \begin{aligned}
q_1 q_2 &= (1 + 2i + j + k)(1 + i + 3j + k) \\
&= 1(1 + i + 3j + k) \\
&\quad + 2i(1 + i + 3j + k) \\
&\quad + j(1 + i + 3j + k) \\
&\quad + k(1 + i + 3j + k)
\end{aligned} q 1 q 2 = ( 1 + 2 i + j + k ) ( 1 + i + 3 j + k ) = 1 ( 1 + i + 3 j + k ) + 2 i ( 1 + i + 3 j + k ) + j ( 1 + i + 3 j + k ) + k ( 1 + i + 3 j + k )
Compute Each Term
1 ( 1 + i + 3 j + k ) = ( 1 , i , 3 j , k ) 2 i ( 1 + i + 3 j + k ) = ( 2 i , − 2 , 6 k , − 2 j ) j ( 1 + i + 3 j + k ) = ( j , − k , − 3 , i ) k ( 1 + i + 3 j + k ) = ( k , j , − 3 i , − 1 ) \begin{aligned}
1(1 + i + 3j + k) &= (1,\, i,\, 3j,\, k) \\
2i(1 + i + 3j + k) &= (2i,\,-2,\,6k,\,-2j) \\
j(1 + i + 3j + k) &= (j,\,-k,\,-3,\,i) \\
k(1 + i + 3j + k) &= (k,\,j,\,-3i,\,-1)
\end{aligned} 1 ( 1 + i + 3 j + k ) 2 i ( 1 + i + 3 j + k ) j ( 1 + i + 3 j + k ) k ( 1 + i + 3 j + k ) = ( 1 , i , 3 j , k ) = ( 2 i , − 2 , 6 k , − 2 j ) = ( j , − k , − 3 , i ) = ( k , j , − 3 i , − 1 )
Combine Terms
q 1 q 2 = ( − 5 , i , 3 j , 7 k ) \begin{aligned}
q_1 q_2 &= (-5,\, i,\, 3j,\, 7k)
\end{aligned} q 1 q 2 = ( − 5 , i , 3 j , 7 k )
Step 2: Dual Part
q 1 q 2 ′ + q 1 ′ q 2 q_1 q_2' + q_1' q_2 q 1 q 2 ′ + q 1 ′ q 2
First Term
q 1 q 2 ′ = ( 1 + 2 i + j + k ) ( 1 + i + j + k ) = ( − 3 , 3 i , j , 3 k ) \begin{aligned}
q_1 q_2' &= (1 + 2i + j + k)(1 + i + j + k) \\
&= (-3,\, 3i,\, j,\, 3k)
\end{aligned} q 1 q 2 ′ = ( 1 + 2 i + j + k ) ( 1 + i + j + k ) = ( − 3 , 3 i , j , 3 k )
Second Term
q 1 ′ q 2 = ( 1 + 2 i + j + k ) ( 1 + i + 3 j + k ) = ( − 5 , i , 3 j , 7 k ) \begin{aligned}
q_1' q_2 &= (1 + 2i + j + k)(1 + i + 3j + k) \\
&= (-5,\, i,\, 3j,\, 7k)
\end{aligned} q 1 ′ q 2 = ( 1 + 2 i + j + k ) ( 1 + i + 3 j + k ) = ( − 5 , i , 3 j , 7 k )
Add Them
( − 3 , 3 i , j , 3 k ) + ( − 5 , i , 3 j , 7 k ) = ( − 8 , 4 i , 4 j , 10 k ) \begin{aligned}
(-3,\, 3i,\, j,\, 3k) + (-5,\, i,\, 3j,\, 7k)
= (-8,\, 4i,\, 4j,\, 10k)
\end{aligned} ( − 3 , 3 i , j , 3 k ) + ( − 5 , i , 3 j , 7 k ) = ( − 8 , 4 i , 4 j , 10 k )
Final Answer
D 1 D 2 = ( − 5 , i , 3 j , 7 k ) + ( − 8 , 4 i , 4 j , 10 k ) ε D_1 D_2 =
(-5,\, i,\, 3j,\, 7k)
+
(-8,\, 4i,\, 4j,\, 10k)\,\varepsilon D 1 D 2 = ( − 5 , i , 3 j , 7 k ) + ( − 8 , 4 i , 4 j , 10 k ) ε