++C++; // 未確認飛行 C 連載:次世代技術につながるSilverlight入門 C#たんと学ぶ/わりと硬派なソフトウェア開発講座 第3回「Webアプリケーション」(前編)

Top総合 目次画像処理

四元数の数学的意味

このエントリーをはてなブックマークに追加

目次

キーワード

概要

四元数と3次元空間中の回転」 の付録。

四元数の数学的な側面について説明します。

はっきり言って、画像処理の分野では不要な知識。 画像処理(主に 3D CG)の分野では、とりあえず、 「四元数とは、回転の軸と角度を表わすために使うデータの形式」 とだけ覚えておけば OK。

ここで話す内容は要するに、 「なんでそれを四元数と呼ぶんだろう」という疑問に答えるものです。

ちなみに、 「ハミルトンの四元数体」 の内容の焼き直しだったりします。 より深く理解するためには、 などについて調べることをお勧めします。

その前に・・・ 複素数についておさらい

四元数の説明に入る前に、 少し複素数についておさらいしておきます。 簡単に言うと、複素数ってのは以下のようなものです。

  • 実数に、 i2 = 1 となる元 i を追加したもの。
  • 実数上の2次元ベクトルともみなせる。
  • 曲形式 α = r ( cosθ + i sinθ ) で表現できる。
  • 複素数同士の掛け算で、2次元の回転を表現できる。
  • 四則演算に関して閉じている。

で、四元数はこれと似た性質を持っています。 (というか、複素数をさらに拡張した数になっています。)

  • 複素数に、虚数単位 iに加えてさらに、 j2 = 1 となる元 j を追加したもの。
  • すなわち、i, j k = ij を使って、 a + i b + j c + k d と表わされる(a, b, c, d は実数)。
  • 複素数上の2次元ベクトル、実数上の4次元ベクトルとみなせる。
  • 回転軸となる単位ベクトル (x, y, z) と角度 θ を使って、 q = r ( sinθ, x cosθ, y cosθ, z cosθ ) と表現したりする。
  • 四元数の掛け算を使って、3次元の回転を表現できる。
  • 四則演算に関して閉じている。ただし、複素数と違って、積は非可換。

四元数

複素数は、実数に対して i = 1 となる数 i を付け足したもので、 2つの実数 a, b を使って a + i b と書ける数です。

これと同様に、今度は複素数に対して、 j = 1 となる数 j をさらに付け足したものが四元数(quaternion)です。 2つの複素数 α, β を使って、

α +*

と書くか、あるいは、 k = ij と置いて、 4つの実数 a, b, c, d を使って、

a + i b + j c + k d

と書けます。 四元数という名前は、見ての通り、4つの実数から成る数という意味です。

ちなみに、 i, j, k の間には、以下のような関係が成り立ちます。

i2 = j2 = k2 = 1
ij = k, ki = j, jk = i
ji = k, ik = j, kj = i

四元数は、発見者の名前を取ってハミルトンの四元数(Hamilton's quaternion)とも呼ばれます。

実部と虚部

複素数では実部が実数1つ、虚部も実数1つでしたが、 四元数では虚部が3つになっています。 この虚部の3つの実数は1セットで意味を持っていたりするので、 四元数、

a + i b + j c + k d

を、 実部 x = a と、 虚部 u = (b, c, d) に分けて、

( x; u )

と表したりします。 実部・虚部をそれぞれスカラー部・ベクトル部と呼んだりもします。

また、ベクトル部が 0 ベクトルのとき、 四元数 ( x; 0 ) を実数と同一視し、 単に x で書き表します。

このような形式を用いることで、以下に述べるように、 加減乗除などの計算が簡単に書き表すことができます。

加減算

まず、四元数の加減算は非常に単純で、以下のようになります。

( x; u ) ± ( y; v ) = ( x ± y; u ± v )
乗算

次に、乗算ですが、

( a + i b + j c + k d ) × ( e + i f + j g + k h )
= ( ae bf cg dh ) + i( af + be + ch dg )
+ j( ag + ce + df bh ) + k( ah + de + bg cf )

なので、ベクトル表現では以下のようになります。

( x; u ) × ( y; v ) = ( xy u v ; x v + y u + u × v )

ただし、 2つのベクトル u, v に対する u v u × v はそれぞれ、ベクトルの内積・外積です。

複素数の場合と違って、 u × v の部分が非可換なので、 四元数の積は非可換になります。

共役と逆元

四元数 q = ( x; u ) に対して、 実数 x2 + | u |2 q絶対値と呼び、 |q| で表します。

また、四元数 q = ( x; u ) に対して、 ( x; u ) で表される四元数を、 共役な四元数と呼び、 q* で表します。 (あるいは、 q と表したりもします。)

四元数 q とその共役四元数を掛け合わせると、

qq* = ( x; u ) × ( x; u ) = ( x2 u ( u ); x u x u + u × ( u ) )
= ( x2 + | u |2; 0 ) = x2 + | u |2

というように、 q の絶対値の2乗になります。

このことから、

q×
q*
|q| 2
=
q*
|q| 2
×q = 1

となるので、q が非 0 のとき、 必ず逆元が存在し、 q−1 =

q*
|q| 2
と表せます。 したがって、四元数は非可換体になります。 (四則演算がすべて問題なく行える。ただし、積は非可換(左右入れ替えると値が変わる)。)

四元数を使った回転

3次元空間上の回転」 で説明したように、 座標ベクトル u で表される点 A を、回転軸 p を中心に角度 θ 回転した点 A' の座標ベクトル u' は、以下のような計算で求めることができます。

u' = sinθ u × p + cosθ ( u ( up ) p ) + ( up )p
= sinθ u × p + cosθ u + ( 1 cosθ ) ( u p ) p

このことを踏まえた上で、本題の四元数を使った回転の話に入ります。 まず、絶対値が 1 になるような四元数を用意します。 絶対値が 1 の四元数 Σ は以下のように、 絶対値 1 の3次元ベクトル p と角度 θ を用いて表すことができます。

Σ = ( cos
θ
2
; sin
θ
2
p )

そして、この四元数とその共役を使って、 以下のようにして他の四元数 q = ( x; u ) を挟み込むように掛けます。

Σ*= ( cos
θ
2
; sin
θ
2
p ) ×q× ( cos
θ
2
; sin
θ
2
p )

このままだと少し計算が面倒なので、いったん Σ = ( y; v ) と置いて計算します。

Σ*= ( y; v )( x; u )( y; v ) = ( xy + uv, yu xv v×u )( y; v )
= ( x ( y2 + | v |2 ); 2y u×v + ( y2 | v |2 )u + 2 ( uv )v )

この式に、

( y2 + | v |2 ) = sin2
θ
2
+ cos2
θ
2
= 1
( y2 | v |2 ) = cos2
θ
2
sin2
θ
2
= cosθ
2 y v = 2 cos
θ
2
sin
θ
2
p = sinθ p
2 sin2
θ
2
= 1 cosθ

などの関係式を代入すると、

Σ* ( x; u ) Σ = ( x; sinθ u×p + cosθ u + ( 1 cosθ )( u p )p )

となります。 この式のベクトル部ですが、先ほど説明した3次元ベクトルの回転の式と一致しています。 すなわち、絶対値 1 の四元数 Σ を用意し、 Σ* q Σ という計算をすることで、 3次元ベクトルの回転をすることができます。

[お問い合わせ](q)