このページの最終更新日 2020/10/25

四元数と3Dプログラミング

1、四元数とは何か

 3Dプログラミングのライブラリを触っていると必ず Quaternion(四元数)たるものに遭遇します。例えばブラウザで動作するJavaScriptだとThree.js、WindowsアプリをC#で書くときなどはOpenTKが最近では有名でしょうか。
 これらのライブラリを使って3Dプログラムを書く場合は、四元数の中身を理解していなくてもそれほど問題はないかもしれません。とは言え、あまり中身を分かっていないままプログラムを書くのは味気ないものですし、弊社では解析業務関係のプログラムも対応することもあり、数学的な勉強の意味も含めて四元数の中身について説明していくことにします。まずは四元数の数体系について説明していきます。


2、四元数の数体系

 四元数は複素数を拡張した数体系であるとされます。お馴染みの複素数は $x,y$ を実数、$i$ を虚数単位として、「$x+yi$」 のように表されますが、 四元数は $w,x,y,z$ を実数、$i,j,k$ を基底元として「$w+xi+yj+zk$」と表されます。複素数「$x+yi$」の「$x$」を実部、「$y$」を虚部というのに対して、四元数では「$w+xi+yj+zk$」の「$x$」を実部、「$xi+yj+zk$」を虚部というように呼びます。
 ここで、四元数の基底元 $i,j,k$ に対して次式が成り立ちます。

$i^2 = j^2 = k^2 = ijk = -1  (1)$

 基底元の自乗がマイナス1になるところは虚数単位に似ていますが、それぞれの基点元を掛け合わたときの値は四元数独特のものです。$ik$ とか $ki$ などがどのような値になるかは明示していませんが、(1)式から導けるので各自で導出してみて下さい。


3、四元数の掛け算

 四元数同士を掛け合わせると四元数になりますが、その乗法は可換ではありません。「可換」でないとは入れ替えても同じにはならないということです。

$q_1 = w_1 + x_1 i + y_1 j + z_1 k$

$q_2 = w_2 + x_2 i + y_2 j + z_2 k$

$q_1 q_2 = w_1 w_2 - x_1 x_2 - y_1 y_2 - z_1 z_2$

$\quad + (w_1 x_2 + w_2 x_1 + y_1 z_2 - y_2 z_1) i$

$\quad + (w_1 y_2 + w_2 y_1 + z_1 x_2 - z_2 x_1) j$

$\quad + (w_1 z_2 + w_2 z_1 + x_1 y_2 - x_2 y_1) k$

ここでは $q_1$と$q_2$の積を例示していますが、$q_1 q_2$の掛け算を、$q_2 q_1$のように順序を変えると答えが変わってきます。このような性質は3次元空間での回転の順序を変えると結果が異なることと関連付けて考えられることが多いです。例えば、ある物体をX軸の周りに60°回転させてからY軸の周りに60°回転させた場合と、Y軸の周りに60°回転させてからX軸の周りに60°回転させた場合では物体の向いている方向は違ってきますよね。


4、四元数で回転を表す

具体的にイメージ出来るものがないと理解が難しいので、下にブラウザで操作出来る3Dオブジェクトを用意してみました。
「回転」ボタンをクリックすると、立方体全体が$u = [u_x, u_y, u_z]$軸で回転して、座標$r_1=[x_1,y_1,z_1]$にあった頂点が、$r_2=[x_2,y_2,z_2]$へ移動します。
「逆回転」ボタンをクリックすると、立方体全体が$u = [u_x, u_y, u_z]$軸で「回転」ボタンクリック時とは逆に回転して、座標$r_2=[x_2,y_2,z_2]$にあった頂点が、$r_1=[x_1,y_1,z_1]$へ移動します。

パネル内の立方体はクリックしながらマウスを動かすことで視点位置を回転させることが出来ます。


 さて、教科書を読んでいると四元数を使って、3次元の座標の回転を次のように表現出来るとされています。

座標$\boldsymbol{r_1}=[x_1,y_1,z_1]$にあった点が

回転軸 $\boldsymbol{u} = [u_x, u_y, u_z]$で$\theta$回転して、

$\boldsymbol{r_2}=[x_2,y_2,z_2]$へ変換されるとします。

ここで次のような四元数$q_u, \overline{q_u}, q_1, q_2$を定義します。ここで$u$は単位ベクトルであるとします。

$q_u=\cos\dfrac{\theta}{2}+(u_xi+u_yj+u_zk)\sin\dfrac{\theta}{2}$

$\overline{q_u}=\cos\dfrac{\theta}{2}-(u_xi+u_yj+u_zk)\sin\dfrac{\theta}{2}$

$q_1 = x_1 i+y_1 j+z_1 k$

$q_2 = x_2 i+y_2 j+z_2 k$


このとき、次式が成立する。

$q_2 = q_u q_1 \overline{q_u} \quad (2)$


$\boldsymbol{r_1}, \boldsymbol{u}$ は既知のベクトルですから、これを用いて$\boldsymbol{r_2}$ が計算出来ることになります。

ここでは、(2)式が成り立ちますね はい終わり。ではなくもう少し突っ込んで(2)式が成り立つことを数学的に考察していきます。


5、四元数の等式を幾何学的に考察する

四元数$q=w+xi+yj+zk$ を次のように(実部,虚部)として省略して書くことにします。

$q=(w,\boldsymbol{r}) \quad (q\in\mathbb{H}, w\in\mathbb{R},\boldsymbol{r}\in\mathbb{R}^3)$

$(w_1,\boldsymbol{r_1})(w_2,\boldsymbol{r_2})=(w_1 w_2-\boldsymbol{r_1} \cdot \boldsymbol{r_2},\ w_1 \boldsymbol{r_2}+w_2\boldsymbol{r_1}+\boldsymbol{r_1}\times\boldsymbol{r_2})$

ここで$\mathbb{H}$は四元数の集合を表し、$\boldsymbol{r}=[x,y,z]$です。


これを用いて(2)式に適用すれば、

$\displaystyle q_u q_1 \overline{q_u} = (\cos \frac{\theta}{2},\sin\frac{\theta}{2}\boldsymbol{u}) (0,\boldsymbol{r_1})(\cos \frac{\theta}{2},-\sin\frac{\theta}{2}\boldsymbol{u})$

$\displaystyle=(\cos \frac{\theta}{2},\sin\frac{\theta}{2}\boldsymbol{u}) (\sin\frac{\theta}{2}\boldsymbol{u}\cdot\boldsymbol{r_1}, \ \cos\frac{\theta}{2}\boldsymbol{r_1}+ \sin\frac{\theta}{2}\boldsymbol{u}\times\boldsymbol{r_1})$


実部と虚部に分けて評価すると、

$\displaystyle w_2=\cos\frac{\theta}{2}\sin\frac{\theta}{2}\boldsymbol{u}\cdot\boldsymbol{r_1}- \cos\frac{\theta}{2}\sin\frac{\theta}{2}\boldsymbol{u}\cdot\boldsymbol{r_1}+ \sin^2\frac{\theta}{2}\boldsymbol{u}\cdot(\boldsymbol{u}\times\boldsymbol{r_1})=0$

$\displaystyle\boldsymbol{r_2}= \cos^2 \frac{\theta}{2}\boldsymbol{r_1}+ 2\sin \frac{\theta}{2}\cos \frac{\theta}{2}\boldsymbol{u}\times \boldsymbol{r_1}+ \sin^2 \frac{\theta}{2}(\boldsymbol{u}\cdot \boldsymbol{r_1})\boldsymbol{u}+ \sin^2\frac{\theta}{2}\boldsymbol{u}\times(\boldsymbol{u}\times\boldsymbol{r_1}) $

$\vec{A}\times(\vec{B}\times\vec{C})=(\vec{A}\cdot\vec{C})\vec{B}-(\vec{A}\cdot\vec{B})\vec{C}$を用いて整理すれば、

$\displaystyle\boldsymbol{r_2}= \boldsymbol{r_1}+ 2\sin \frac{\theta}{2}\cos \frac{\theta}{2}\boldsymbol{u}\times \boldsymbol{r_1}+ 2\sin^2 \frac{\theta}{2}(\boldsymbol{u}\cdot \boldsymbol{r_1})\boldsymbol{u}- 2\sin^2 \frac{\theta}{2}\boldsymbol{r_1} \quad (3)$

 回転後の座標$\vec{r_2}$ は回転前の座標$\vec{r_1}$、及び回転軸$\vec{u}$と回転角$\theta$を用いて式(3)のように表現される。これが正しいことを証明しよう。幾何学的な考察により、$\vec{r_2}$と$\vec{r_1}$には次式(4)の関係が成立する。(4)式に(3)式を代入して式が成立することを確認してみよう。

$\displaystyle\boldsymbol{r_2}-\boldsymbol{r_1} =2\tan\frac{\theta}{2}(\boldsymbol{u}\times\frac{\boldsymbol{r_1}+\boldsymbol{r_2}}{2}) \quad (4)$

$\displaystyle(右辺)=2\tan\frac{\theta}{2}( \cos^2\frac{\theta}{2}\boldsymbol{u}\times\boldsymbol{r_1}+ 2\sin \frac{\theta}{2}\cos \frac{\theta}{2}\boldsymbol{u}\times(\boldsymbol{u}\times\boldsymbol{r_1})) $

$\displaystyle\quad\quad = 2\sin \frac{\theta}{2}\cos \frac{\theta}{2}\boldsymbol{u}\times \boldsymbol{r_1}+ 2\sin^2 \frac{\theta}{2}(\boldsymbol{u}\cdot \boldsymbol{r_1})\boldsymbol{u}- 2\sin^2 \frac{\theta}{2}\boldsymbol{r_1}$