Pynote

Python、機械学習、画像処理について

数学 - 3次元空間上の回転の四元数 (クォータニオン) による表現

概要

コンピューターグラフィクス等の分野では、3次元空間上の回転を四元数 (クォータニオン) で表すことが多い。
本記事では四元数でなぜ3次元空間上の回転を表せるのかを解説する。

四元数の定義及び基本的な性質については以下の記事を参照されたい。

pynote.hatenablog.com

3次元空間上の回転

3次元空間上の回転はあるベクトルを軸とした回転として表される。
\boldsymbol{p} をベクトル \boldsymbol{u} 回りに \theta だけ回転した点を \boldsymbol{p}' とする。

四元数による3次元空間上の回転の表現

3次元上の点 \boldsymbol{p} \in \mathbb{R}^3四元数 p = (0, \boldsymbol{p}) と同一視する。

以下、細字は四元数、太字は3次元実ベクトルとして区別する。

定理
四元数 q = (\cos\frac{\theta}{2}, \sin\frac{\theta}{2} \boldsymbol{u}) をとる。 ただし、\boldsymbol{u} は単位ベクトルとする。
このとき、p' = qpq^{-1} と変換した四元数 q' は、点 \boldsymbol{p} を単位ベクトル \boldsymbol{u} 回りに \theta だけ回転した点を表す。

\boldsymbol{p}\boldsymbol{u} に平行なベクトル \boldsymbol{p}_{||} と直交するベクトル \boldsymbol{p}_{\bot} に分解する。

 \displaystyle
\boldsymbol{p} = \boldsymbol{p}_{||} + \boldsymbol{p}_{\bot}

さらに、\boldsymbol{p}_{||}, \boldsymbol{p}_{\bot} に直交するベクトル \boldsymbol{p}_o = \boldsymbol{u} \times \boldsymbol{p}_{\bot} をとる。

このとき、

 \displaystyle
\boldsymbol{p}'
= \boldsymbol{p}_{||} + n
= \boldsymbol{p}_{||} + \cos\theta \boldsymbol{p}_{\bot} + \sin\theta \boldsymbol{p}_o

と表せる。各3次元実ベクトルを四元数で表したとき、

 \displaystyle
p' = qpq

を示すことが証明の目標である。
ここで以下を先に示しておく。

c = \cos\frac{\theta}{2}, s = \sin\frac{\theta}{2} とする。

(1) q \cdot p_{||} = p_{||} \cdot q

 \displaystyle
\begin{align}
q \cdot p_{||}
&= (c, s\boldsymbol{u}) \cdot (0, \boldsymbol{p}_{||}) \\
&= (-s\langle \boldsymbol{u}, \boldsymbol{p}_{||} \rangle, c\boldsymbol{p}_{||} + s (\boldsymbol{u} \times \boldsymbol{p}_{||})) \ \because \boldsymbol{u} \times \boldsymbol{p}_{||} = \boldsymbol{p}_{||} \times \boldsymbol{p}_{u} = \boldsymbol{0}\\
&= (-s\langle \boldsymbol{u}, \boldsymbol{p}_{||} \rangle, c\boldsymbol{p}_{||}) \\
&= p_{||} \cdot q
\end{align}

(2) q は単位四元数である。

 \displaystyle
\begin{align}
\|q\|^2
&= q\overline{q} \\
&= (c, s \boldsymbol{u}) \cdot (c, -s \boldsymbol{u}) \\
&= (c^2 + s^2 \langle \boldsymbol{u}, \boldsymbol{u} \rangle, -sc \boldsymbol{u} + sc \boldsymbol{u} - s^2 (\boldsymbol{u} \times \boldsymbol{u}) \\
&= (1, 0)
\end{align}

本題の証明を行う。

 \displaystyle
\begin{align}
qpq^{-1}
&= q (p_{||} + p_{\bot}) q^{-1}\\
&= q p_{||} q^{-1} + q p_{\bot} q^{-1} \ \because 分配則\\
&= p_{||} q q^{-1} + q p_{\bot} q^{-1} \ \because qp_{||} = p_{||}q\\
&= p_{||} + q p_{\bot} q^{-1} \ \because qq^{-1} = 1\\
&= p_{||} + (c, s\boldsymbol{u}) \cdot (0, \boldsymbol{p}_{\bot}) q^{-1} \\
&= p_{||} + (-s \langle \boldsymbol{u}, \boldsymbol{p}_{\bot} \rangle,
    c p_{\bot} + s (\boldsymbol{u} \times \boldsymbol{p}_{\bot})) q^{-1} \\
&= p_{||} + (0, c \boldsymbol{p}_{\bot} + s \boldsymbol{p}_o) \cdot (c, -s \boldsymbol{u}) 
 \ \because \langle \boldsymbol{u}, \boldsymbol{p}_{\bot} \rangle = 0\\
&= p_{||} + (
sc \langle \boldsymbol{p}_{\bot}, \boldsymbol{u} \rangle + s^2 \langle \boldsymbol{p}_o, \boldsymbol{u} \rangle,
c^2 \boldsymbol{p}_{\bot} + sc \boldsymbol{p}_o - sc (\boldsymbol{p}_{\bot} \times \boldsymbol{u}) - s^2 (\boldsymbol{p}_o \times \boldsymbol{u})) \\
&= p_{||} + (0, c^2 \boldsymbol{p}_{\bot} + sc \boldsymbol{p}_o + sc \boldsymbol{p}_o - s^2 \boldsymbol{p}_{\bot}) 
\ \because \boldsymbol{p}_{\bot} \times \boldsymbol{u} = -\boldsymbol{p}_o, \boldsymbol{p}_o \times \boldsymbol{u} = \boldsymbol{p}_{\bot}\\
&= p_{||} + (0, (\cos^2\frac{\theta}{2} - \sin^2\frac{\theta}{2}) \boldsymbol{p}_{\bot} + 2 \sin\frac{\theta}{2} \cos\frac{\theta}{2} \boldsymbol{p}_o)
\end{align}

ここで、2倍角の公式 \cos \theta = \cos^2\frac{\theta}{2} - \sin^2\frac{\theta}{2}\sin\theta = 2 \sin\frac{\theta}{2} \cos\frac{\theta}{2} より、

 \displaystyle
p_{||} + (0, \cos \theta \boldsymbol{p}_{\bot} + \sin\theta \boldsymbol{p}_o) = (0, \boldsymbol{p}_{||} + \cos \theta \boldsymbol{p}_{\bot} + \sin\theta \boldsymbol{p}_o) = (0, \boldsymbol{p}') = p'

よって、p' = qpq^{-1} が示された。

コンピューターで扱う際の四元数の表現

コンピューター上では4つの浮動小数点数 (w, x, y, z) で表される。
w は実部、x, y, z は虚部を意味する。
四元数が3次元空間上の回転を表す場合は、
(w, x, y, x) = (\cos\frac{\theta}{2}, \sin\frac{\theta}{2}x, \sin\frac{\theta}{2}y, \sin\frac{\theta}{2}z)

ある回転に対応する四元数は一意ではない

定理
3次元上の回転を表す四元数 q = (\cos\frac{\theta}{2}, \sin\frac{\theta}{2} \boldsymbol{u}) に対して、  -q も同じ回転を表す。

Proof)

(-q)p(-q^{-1}) = (-1)^2qpq^{-1} = qpq^{-1}