$$ \def\v{\boldsymbol} \def\m{\boldsymbol} \def\trans{^\mathsf{T}} \def\inv{^{-1}} \def\bmat{\begin{pmatrix}} \def\emat{\end{pmatrix}} \def\diag{\operatorname{diag}} \def\tr{\operatorname{tr}} \def\ad{\operatorname{ad}} \def\Ad{\operatorname{Ad}} \def\E{\operatorname{E}} \def\det#1{| #1 |} \def\her{^\mathsf{H}} \def\wed{\wedge} \def\given{\mid} \def\defeq{\triangleq} \def\Ys{{\cal Y}} \def\argmin{\mathop{\mathrm{argmin}}} \def\argmax{\mathop{\mathrm{argmax}}} \def\blockdiag{\mathop{\mathrm{blockdiag}}} \def\inner#1{\langle #1 \rangle} $$

CV・CG・ロボティクスのためのリー群・リー代数入門: (8) 四元数の球面線形補間

シリーズ一覧へ

前回のエントリへ


コンピュータグラフィクス分野で四元数 (クォータニオン) がよく使われる理由の一つが補間のしやすさにあるのではないかと思う.球面線形補間 (Spherical Linear Interpolation, slerp) の名前で知られていて,公式もよく知られている.

公式の導出としてよく説明されるのは「単位四元数は 4 次元空間の単位球面上の点とみなせるので,2 点を単位球面に沿って結ぶ最短経路を考えて,その経路上で補間する」というものである.この考え方で,初等的な幾何学的関係を使うと公式が導ける.

この考え方は正しい.正しいのだけど,4 次元空間の球面上で補間することにどのような意味があるのか,3 次元回転としてはどのような動きに対応するのかといったことを理解するには,ちょっと説明が足りていない (個人の感想です).

このエントリでは,その辺りをもう少しだけ詳しく説明してみることにする.

四元数と 4 次元空間

まずはその「4 次元空間内の単位球面」について詳しく見ていく.考え方はシンプルで,四元数 $\displaystyle \v{q} = q_0 + q_1\mathbf{i} + q_2\mathbf{j} + q_3\mathbf{k}$ を 4 次元空間の 1 点,あるいはその位置ベクトル $(q_0, q_1, q_2, q_3)\trans$ と対応づける.このエントリではしばしば両者を同一視して $\displaystyle \v{q} = (q_0, q_1, q_2, q_3)\trans$ と書く.

四元数全体は 4 次元空間全体に広がっており,そのうち単位四元数というのは $q_0^2 + q_1^2 + q_2^2 + q_3^2 = 1$ を満たすものだったから,この空間の単位球面上に分布する.

以降の説明を簡潔にするため,四元数のノルムを以下のように定義して,それを使って単位四元数であるための条件を書き直しておく.

四元数のノルム 四元数 $\v{q} = (q_0, q_1, q_2, q_3)\trans$ のノルム $\|\v{q}\|$ を以下のように定義する. $$ \begin{align} \| \v{q} \| = \sqrt{q_0^2 + q_1^2 + q_2^2 + q_3^2} \end{align} $$ $\| \v{q} \| = 1$ であるような四元数 $\v{q}$ を単位四元数と呼ぶ.


回転を表すには単位四元数 $\v{q}$ を使って $\v{p}' = \v{q} \v{p} \v{q}\inv$ のように純四元数 $\v{p}$ に作用させればよかったのだが,もしここで,単位四元数ではない一般の四元数を使ったらどうなるか.

これは前回のエントリで導いた $2 \times 2$ 行列との対応を考えればすぐにわかる.この作用は行列表現を使って
$$
\begin{align}
\m{Q}(\theta, \v{w}) \, [\v{p}]_\wed \, \m{Q}(\theta, \v{w})\inv
\end{align}
$$ と表せたわけだが,単位四元数の代わりにそれに実数 $\alpha$ ($\neq 0$) をかけたものを使ったとしても,
$$
\begin{align}
\left\{ \alpha \m{Q}(\theta, \v{w})\right\} \, [\v{p}]_\wed \, \left\{\alpha \m{Q}(\theta, \v{w})\right\}\inv
&= \alpha \m{Q}(\theta, \v{w}) \, [\v{p}]_\wed \, \frac{1}{\alpha} \m{Q}(\theta, \v{w})\inv\\
&= \m{Q}(\theta, \v{w}) \, [\v{p}]_\wed \, \m{Q}(\theta, \v{w})\inv
\end{align}
$$ なのだから,結果は変わらない.つまり,単位四元数を任意に実数倍したものでも同じ回転を表現できる.

言ってみれば,ある回転を表す無数の四元数を,ノルムが 1 のもので代表させているわけである.方向ベクトルとか法線ベクトルとかを単位ベクトルに取るのと似ているかもしれない.

単位四元数で代表させるといったが,実はその「代表」は 2 つ存在することに注意したい.具体的には $\alpha = \pm 1$ の両方が単位四元数になる.このことは $\| -\v{q} \| = \sqrt{(-q_0)^2 + (-q_1)^2 + (-q_2)^2 + (-q_3)^2} = \| \v{q} \|$ からすぐにわかる.

4 次元空間で考えるなら,四元数を実数倍するというのは,原点とその四元数を表す点を結ぶ直線上の別の点を取るということである.そのような直線上の点のうち単位球面上にあるのは 2 点で,それらは原点に関して互いと点対称な位置にある.

つまり,3 次元回転との対応を考えたとき,単位四元数がなす単位球面を 2 つに割った半球面はもう一方の半球面とそっくり同じものである.

余談: なぜ単位四元数を使うのか

任意に実数倍しても同じ回転を表せるのならば,どうしてわざわざ単位四元数に正規化する必要があるのか,球面線形補間とは直接関係しないが,ちょっと考えておきたい.

実用上の理由としては,逆元の計算が簡単になるという点が挙げられる.単位四元数なら共役を取るだけで済む.単位四元数でないとき,$\alpha \m{Q}(\theta, \v{w})$ の逆元は $\frac{1}{\alpha} \m{Q}(-\theta, \v{w})$ になるので,結局ここで正規化に相当する計算をする必要が生じる.

四元数は 4 パラメータで 3 次元回転を表す冗長な表現だが,その冗長さがたかだか実数倍として現れるだけという点は実用上大きな利点である.ノルムが 1 になるように正規化するのは簡単だし,例えば複数の回転を合成するときは,正規化しないまま回転を合成し続けておいて回転作用を行う時点になってから初めて正規化するといった方法を取ることもできる.

回転行列だとこうはいかなくて,数値誤差の影響は行列の各列が正規直交でなくなるという形で現れるので,放置して合成し続けるとひどい目に合うし,正規化には特異値分解だったりグラム・シュミット直交化だったりと比較的コストの高い計算が必要になる.

固定軸まわりの回転を表す四元数の動き

さて,前回の話を思い出すと,単位ベクトル $\v{w} = (w_1, w_2, w_3)\trans$ を軸とする角度 $\theta$ の 3 次元回転は単位四元数 $\displaystyle (\cos\frac{\theta}{2},\, w_1\sin\frac{\theta}{2},\, w_2\sin\frac{\theta}{2},\, w_3\sin\frac{\theta}{2})\trans$ で表せるのだった.このうち $\v{w}$ を固定して $\theta$ を動かしたときに,この四元数 $\v{q}(\theta)$ は 4 次元空間をどう動くのか考えてみる.

まず,前回確認したとおり $\v{q}(\theta)$ のノルムは $\theta$ の値に依らず 1 なので,$\v{q}(\theta)$ は確かに単位四元数である.次に,
$$
\begin{align}
\v{q}(\theta) &= \cos\frac{\theta}{2} (1, 0, 0, 0)\trans + \sin\frac{\theta}{2} (0, w_1, w_2, w_3)\trans
\end{align}
$$ と表せることに着目すると,$\v{q}(\theta)$ は 2 本の 4 次元ベクトル $(1, 0, 0, 0)\trans$ と $(0, w_1, w_2, w_3)\trans$ が張る 2 次元空間上に存在する.この平面を $\Pi(\v{w})$ と書くことにしよう.

これらから,$\v{q}(\theta)$ は単位球面と $\Pi(\v{w})$ の交線上にあることがわかる.$\Pi(\v{w})$ は原点を通る平面だから,$\v{q}(\theta)$ は単位球面上の大円に沿って動くということを意味する.

$\theta = 0$ のときは $\v{q}(0) = (1, 0, 0, 0)\trans$ である.$\theta$ が変化するとともに $\v{q}(\theta)$ がどう動くかを知るには,$\v{q}(\theta) = \displaystyle (\cos\frac{\theta}{2},\, w_1\sin\frac{\theta}{2},\, w_2\sin\frac{\theta}{2},\, w_3\sin\frac{\theta}{2})\trans$ と $(1, 0, 0, 0)\trans$ を結ぶ大円弧の中心角を求めればよい.この 2 つのベクトルの内積は $\displaystyle \cos \frac{\theta}{2}$ だから,中心角は $\displaystyle \frac{\theta}{2}$ である.

単一軸まわりの3次元回転は,4次元単位球面上の大円を描く

$\theta$ を 0 から増やしていくと,$(1, 0, 0, 0)\trans$ から大円に沿って動き始めて,$\theta = \pi$ で $(0, w_1, w_2, w_3)\trans$ を通り,$\theta = 2\pi$ でちょうど逆側の $(-1, 0, 0, 0)\trans$ に到達する.$(-1, 0, 0, 0)\trans = -(1, 0, 0, 0)\trans$ だからこれは元の点 $(1, 0, 0, 0)\trans$ と同じく恒等変換を表しており,確かに $\theta = 2\pi$ 回転して元の姿勢に戻っていることがわかる.さらに $2\pi$ だけ回って $\theta = 4\pi$ で元の点 $(1, 0, 0, 0)\trans$ に戻る.こうしてみると「単位球面を 2 つに割った半球面はもう一方の半球面とそっくり同じ」であることがよくわかる.

球面線形補間

これで材料は揃った.既に察知した人も多いかも知れないが,球面線形補間とは要するに球面上の 2 点を大円弧上で補間することであり,さっき見たとおり 4 次元単位球面の大円弧とは,単一軸まわりの 3 次元回転をするときに通る経路である.

この考え方に沿って単位四元数 $\v{q}_1$ と $\v{q}_2$ の補間を実際に構成してみよう.

$\v{q}_2 = (\v{q}_2 \v{q}_1\inv) \v{q}_1$ であるから,$\v{q}_1$ から $\v{q}_2$ への相対回転は $\v{q}_2 \v{q}_1\inv$ で表せる.これを $\Delta\v{q}$ と書くことにする.オイラーの回転定理から,この相対回転も,何らかの単位ベクトル $\v{w} = (w_1, w_2, w_3)\trans$ を軸とする何らかの角度 $\theta$ の回転になっていなくてはならない.つまり
$$
\begin{align}
\Delta\v{q} &= (\cos\frac{\theta}{2},\, w_1 \sin\frac{\theta}{2},\, w_2 \sin\frac{\theta}{2},\, w_3 \sin\frac{\theta}{2})\trans\\
&= (\cos\phi,\, w_1 \sin\phi,\, w_2 \sin\phi,\, w_3 \sin\phi)\trans
\end{align}
$$ と書けるはずである.ただし,読みやすさのために $\displaystyle \phi = \frac{\theta}{2}$ と置き直した.$\theta$ は 3 次元空間での回転角,$\phi$ はそれに対応する 4 次元空間の大円弧の中心角である.

大円弧に沿って中心角を補間する

この回転軸 $\v{w}$ はそのままで,角度だけ $t$ 倍することを考える.$t = 0$ なら恒等変換 ($\v{q}_1$ から動かない),$t = 1$ なら $\Delta\v{q}$ に一致し ($\v{q}_2$ まで動く),$t$ にその間の適当な値を与えることで補間ができる.これを $\Delta\v{q}^t$ と書くことにする.

四元数の実数冪 単位四元数 $\v{q} = (\cos \phi,\, w_1 \sin \phi,\, w_2 \sin \phi,\, w_3 \sin \phi)\trans$ の実数 $t$ による冪乗を以下のように定義する. $$ \begin{align} \v{q}^t &= (\cos t\phi,\, w_1 \sin t\phi,\, w_2 \sin t\phi,\, w_3 \sin t\phi)\trans \end{align} $$

残る課題はこれを両端 $\Delta\v{q}^0 = (1, 0, 0, 0)\trans$ と $\Delta\v{q}^1 = \Delta\v{q}$ の線形和として表示することである.すなわち
$$
\begin{align}
\Delta\v{q}^t &= a_0 \Delta\v{q}^0 + a_1 \Delta\v{q}^1\\
&= a_0 (1, 0, 0, 0)\trans + a_1 (\cos\phi,\, w_1 \sin\phi,\, w_2 \sin\phi,\, w_3 \sin\phi)\trans
\end{align}
$$ を満たすような係数 $a_0$ と $a_1$ を見つけたい.4 つの成分について書き下すと
$$
\begin{align}
\cos t\phi &= a_0 \cdot 1 + a_1 \cos\phi\\
w_1 \sin t\phi &= a_0 \cdot 0 + a_1 w_1 \sin\phi\\
w_2 \sin t\phi &= a_0 \cdot 0 + a_1 w_2 \sin\phi\\
w_3 \sin t\phi &= a_0 \cdot 0 + a_1 w_3 \sin\phi
\end{align}
$$ となる.これらを $a_0$ と $a_1$ について解けばよい.2 本目以降の式は $\v{w}$ に依らず
$$
\begin{align}
a_1 &= \frac{\sin t\phi}{\sin\phi}
\end{align}
$$ とすれば満たされる.これを 1 本目に代入することで
$$
\begin{align}
a_0 &= \cos t\phi - a_1 \cos\phi\\
&= \cos t\phi - \frac{\sin t\phi \cos\phi}{\sin\phi}\\
&= \frac{\cos t\phi \sin\phi - \sin t\phi \cos\phi}{\sin\phi}
\end{align}
$$ となる.三角関数の加法定理を使うと
$$
\begin{align}
a_0 &= \frac{- \sin(\phi - t\phi)}{\sin\phi}\\
&= \frac{-\sin(1-t)\phi}{\sin\phi}\\
&= \frac{\sin(1-t)\phi}{\sin\phi}
\end{align}
$$ が得られる.

以上で得られた $\Delta\v{q}^t$ は $\v{q}_1$ から $\v{q}_2$ への相対回転を補間したものなので,これを $\v{q}_1$ にかけることで目的の補間結果が
$$
\begin{align}
\Delta\v{q}^t \, \v{q}_1
&= \left\{ \frac{\sin(1-t)\phi}{\sin\phi} \Delta\v{q}^0 + \frac{\sin t\phi}{\sin\phi} \Delta\v{q}^1 \right\} \v{q}_1\\
&= \frac{\sin(1-t)\phi}{\sin\phi} \v{q}_1 + \frac{\sin t\phi}{\sin\phi} \v{q}_2
\end{align}
$$ のように得られる.実際に計算するには $\phi$ の値が必要だが,$\v{q}_1$ と $\v{q}_2$ を 4 次元ベクトルとみなしたときの内積を求めて,その逆コサインを計算するのが簡便である.

四元数の球面線形補間 2 つの単位四元数 $\v{q}_1$ と $\v{q}_2$ の割合 $t$ での球面線形補間は $$ \begin{align} \text{Slerp}(\v{q}_1, \v{q}_2, t) &= \frac{\sin(1-t)\phi}{\sin\phi} \v{q}_1 + \frac{\sin t\phi}{\sin\phi} \v{q}_2 \end{align} $$ で与えられる.ただし $\phi = \arccos \langle \v{q}_1, \v{q}_2 \rangle$ であり,$\langle \v{p}, \v{q} \rangle$ は四元数 $\v{p}, \v{q}$ を 4 次元ベクトルとみなしたときの内積とする.