外積を利用した回転

rotation-by-cross-product.png

Introduction

回転軸回転角を指定して回転する。
結論を先に書くとこうなる。

ベクトルpと回転軸rが直行している場合

(1)
\begin{align} p'=p\cos\theta+r\times p \sin\theta \end{align}

ベクトルpと回転軸rが直行してない場合

(2)
\begin{align} p'=p\cos\theta+r\times p \sin\theta + r\left<r,p\right>(1-\cos\theta) \end{align}

ただし、$\|r\|=1$である。
外積を使った回転の良い所は、回転がひとつの回転軸と回転角で表されるため、どのような回転か直感的にわかりやすいところである。
ただし、外積を使った回転は、回転行列による回転に比べると、回転の豪勢が単純ではなくなってしまう。
直感的にわかりやすく、かつ合成しやすい回転、それがクォータニオンによる回転である。
なぜこうなるのか?順を追って、説明する。

xy平面に張り付いていいるベクトルpを回転させる。

まずは簡単なのから考えよう。
zrotate.png
ベクトルpと垂直な方向にベクトルqがあると仮定する。(まだqが具体的にどんな値かは知らない状態。)
qのノルムはpのノルムと等しいとする。
pからz軸まわりにθだけ回転したベクトルp'は

(3)
\begin{align} p'=p\cos\theta+q\sin\theta \end{align}

と書ける。なぜなら↓この図の通り。
rotation.png
どうやってqを手に入れるのか?
外積を使うと簡単に手に入る。
z軸方向の基底ベクトルを$e_z$とすると、ベクトルqは

(4)
\begin{align} q=e_z \times p \end{align}

で求めることが出来る。
つまり、ベクトルqはベクトルpにもベクトル$e_z$にも直交し、ノルムがpと一緒である。

Pが斜め(xy平面に張り付いていない)の場合のz軸周りの回転

下の図のようにベクトルpがxy平面にない場合はどうなってしまうのか?
pishigher.png
この場合は、ベクトルpを基底ベクトル$e_z$垂直なベクトル平行なベクトルに分解すればいい。

(5)
\begin{align} p=p\perp+p\parallel \end{align}

$p\perp$$e_z$に垂直、$p\parallel$$e_z$に平行である。
こうすれば、$p\perp$の方はx-y平面上の回転と同じ。
$p\parallel$の方は回転後も変化しない(今はz軸を中心とした回転だから)

(6)
\begin{align} p'\perp=p\perp\cos\theta+q\sin\theta\\ p'\parallel=p\parallel \end{align}

である。式.(5)より、

(7)
\begin{align} p'=p\perp\cos\theta+q\sin\theta+p\parallel \end{align}

になる。
ベクトル$p\perp,p\parallel,q$はそれぞれ次式のようになっている。

$p\perp$

(8)
\begin{align} p\perp=p-p\parallel \end{align}

ベクトルの引き算参照。

$p\parallel$

(9)
\begin{align} p\parallel=e_z\left<e_z,p\right> \end{align}

なぜなら、(内積参照)

(10)
\begin{align} p\parallel=e_z(p_xe_x+p_ye_y+p_ze_z) \end{align}

$e_z$はz方向の基底ベクトルである。つまり、y成分とx成分は0なので、$p_xe_x+p_ye_y$は消すことが出来る。

(11)
\begin{align} p\parallel=e_z(p_ze_z) \end{align}

$e_z$は基底ベクトルなのでノルム1。つまり$p\parallel$はベクトルpのz成分ぶんの長さを持ち、$e_z$の方向にある(つまりz軸に平行)なベクトルということだ。

ベクトルq

$p\perp$$e_z$に垂直なベクトルである。

(12)
\begin{align} q=e_z\times p\perp\\ =e_z\times(p-e_z\left<e_z,p\right>)\\ =e_z\times p \end{align}

2行目は先程の$p\perp$の式(8)と$p\parallel$の式5を代入しただけである。
3行目は$e_z\times e_z=0$の関係を利用して(外積参照。)結局

(13)
\begin{align} q=e_z\times p\perp =e_z \times p \end{align}

となった。

任意の軸まわりの回転

今までの話はz軸まわりの回転に限ったものであったが、任意の回転軸まわりの回転についても同様の議論ができる。
必要なのは、ベクトル「$e_z$」の代わりに回転軸を表すベクトルである。
回転軸をrとする。
ベクトルrのノルムは1でなければならない。
これまでの$e_z$をベクトル「r」で置き換えると次式のようになる。

(14)
\begin{align} p'=\cos\theta+q\sin\theta+p\parallel\\ p\perp=p-p\parallel\\ p\parallel=r\left<r,p\right>\\ q=r\times p \end{align}

これらの式を一本にまとめて、外積を使ったベクトルの回転の式としよう。

(15)
\begin{align} p'=p\cos\theta+r\times p \sin\theta + r\left<r,p\right>(1-\cos\theta) \end{align}

ただし、$\|r\|=1$である。


cross-product rotation

サポートサイト Wikidot.com cross-productrotation