【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

四元数によるロドリゲスの回転公式

行列を使わずに、四元数だけでロドリゲスの回転公式を求めます。

目次

概要

以下の記事では四元数を行列で表現して計算しました。

今回は行列を使わずに四元数だけで計算します。

回転

単位純虚四元数 $n$ を回転軸として、純虚四元数 $v$ によって表現されるベクトルを $θ$ 回転します。

\begin{aligned} &\exp\left(\fracθ2n\right)v\exp\left(-\fracθ2n\right) \\ &=\left(\cos\fracθ2+n\sin\fracθ2\right)v\left(\cos\fracθ2-n\sin\fracθ2\right) \\ &=v\cos^2\fracθ2+(nv-vn)\sin\fracθ2\cos\fracθ2-nvn\sin^2\fracθ2 \end{aligned}

計算を一旦止めて、式に現れた要素を個別に計算します。

準備

2 倍角の公式による三角関数の計算です。

\begin{aligned} 2\sin\fracθ2\cos\fracθ2 &=\sinθ \\ 2\sin^2\fracθ2 &=1-\left(1-2\sin^2\fracθ2\right) \\ &=1-\cosθ \\ \end{aligned}

四元数の積を外積内積に分離して計算します。

\begin{aligned} nv-vn &=2(n×v) \\ nvn &=n(v×n-v⋅n) \\ &=n×(v×n)-n(v⋅n) \\ &=(n⋅n)v-(n⋅v)n-n(v⋅n) \\ &=v-2(v⋅n)n \end{aligned}

※ $nvn$ は鏡映です。途中で使っているベクトル三重積の公式については以下の記事を参照してください。

計算 1

回転の計算を続行します。

\begin{aligned} &\exp\left(\fracθ2n\right)v\exp\left(-\fracθ2n\right) \\ &=\left(\cos\fracθ2+n\sin\fracθ2\right)v\left(\cos\fracθ2-n\sin\fracθ2\right) \\ &=v\cos^2\fracθ2+(nv-vn)\sin\fracθ2\cos\fracθ2-nvn\sin^2\fracθ2 \\ &=v\cos^2\fracθ2+2(n×v)\sin\fracθ2\cos\fracθ2-\{v-2(v⋅n)n\}\sin^2\fracθ2 \\ &=v\left(\cos^2\fracθ2-\sin^2\fracθ2\right)+(n×v)\sinθ+2(v⋅n)n\sin^2\fracθ2 \\ &=v\cosθ+(n×v)\sinθ+(v⋅n)n(1-\cosθ) \end{aligned}

これは Wikipedia に載っている公式と一致します。$\mathbf {k}$ は回転軸です。

\mathbf {v} _{\mathrm {rot} }=\mathbf {v} \cos \theta +(\mathbf {k} \times \mathbf {v} )\sin \theta +\mathbf {k} ~(\mathbf {k} \cdot \mathbf {v} )(1-\cos \theta )\,.

計算 2

先ほどの結果では $\cosθ$ が 2 個所に現れました。これをまとめるため工夫します。

$nvn$ の計算に現れるベクトル三重積に公式を適用しないでそのまま残します。そのためにはベクトル三重積の公式から関係式を得る必要があります。

\begin{aligned} n×(v×n) &=(n⋅n)v-(n⋅v)n \\ &=v-(n⋅v)n \\ ∴-(n⋅v)n&=n×(v×n)-v \\ \\ nvn &=n(v×n-v⋅n) \\ &=n×(v×n)-n(v⋅n) \\ &=2n×(v×n)-v \\ &=-\{2n×(n×v)+v\} \end{aligned}

これを使って計算します。

\begin{aligned} &\exp\left(\fracθ2n\right)v\exp\left(-\fracθ2n\right) \\ &=\left(\cos\fracθ2+n\sin\fracθ2\right)v\left(\cos\fracθ2-n\sin\fracθ2\right) \\ &=v\cos^2\fracθ2+(nv-vn)\sin\fracθ2\cos\fracθ2-nvn\sin^2\fracθ2 \\ &=v\cos^2\fracθ2+2(n×v)\sin\fracθ2\cos\fracθ2+\{2n×(n×v)+v\}\sin^2\fracθ2 \\ &=v\left(\cos^2\fracθ2+\sin^2\fracθ2\right)+(n×v)\sinθ+2n×(n×v)\sin^2\fracθ2 \\ &=v+(n×v)\sinθ+n×(n×v)(1-\cosθ) \end{aligned}

これは Wikipedia では行列で書かれています。$\mathbf {K}$ はベクトル積の作用 $\mathbf {k}×$ を表現した行列です。

\mathbf {v} _{\mathrm {rot} }=\mathbf {v} +(\sin \theta )\mathbf {K} \mathbf {v} +(1-\cos \theta )\mathbf {K} ^{2}\mathbf {v} \,,\quad \|\mathbf {K} \|_{2}=1\,.

この式を極座標の発想で組み立てる方法については、以下の記事を参照してください。