2008年12月06日
回転 その1 ~四元数とは~
突然ですけど、
スクリプトを使って回転を調節するのって ちょっと難しいですよね

回転に関する関数がたくさんあるし、3次元での回転なのでイメージしにくいし・・・・
さらに何がヤヤコシイって、回転を表す変数rotationの型が四元数(クオータニオン)で表されてますからねぇ~

この四元数っていうのがクセモノなんですよ^^;;;
名前はときどき聞くけど、いったい何者????? って感じですよね。
ソラマメ内で検索しても、四元数について詳しく書いた記事がないみたいですし。
で、
じゃぁ、ちょっと私が頑張って書いてみようかなと!!と思い立ちまして

張り切って書いてみましたが・・・・・・・
う~~~ん、ちょっと失敗かな^^;;
はっきり言って、激辛


1.まずは二元数
まずは、高校数学の復習から始めますね。
複素数の話です。えと、数学Bだったかな?理系だけじゃなくて文系の人も習ってるはずですよ。
(実は、最近では教科書が変わっちゃって習わない内容らしいんですが・・・・年齢バレちゃう><。)
まぁ この話は、あんまし関係ないので軽く流しますね

まず、複素数というのは、虚数単位 i と2つの実数 x , y を用いて
z = x + i y
の形で表される数ですけど、ここでは四元数と区別するために、あえて二元数と呼ぶことにしますね。
あ、上でいう i というのは i2 = –1 を満たす虚数です。
ここで、r2 = x2 + y2 となる正の数 r を用いると、x = r cosθ , y = r sinθ となる θ が
存在するので、先ほどの二元数 z は、
z = r (cosθ + i sinθ )
という形で表されます。
これは、「原点を中心として反時計回りに θ だけ回転させたのち、原点を中心として r 倍に拡大する」という
変換を表します。
う~~ん、かなりテキトーな解説ですけど 四元数とはあまり関係ないので、とりあえずは
「平面上の回転移動は、二元数を用いることによって表すことができる」
ということだけ理解してもらえればいいかなと^^
2.四元数とは
平面内(2次元)の回転を表すのに「二元数」を使ったんだから、空間内(3次元)では「三元数」を使えば良さそう
なんですけど、三元数だとなかなか上手くいかなかったみたいですね。
で、ハミルトンという偉い先生が考え出したのが四元数です。
(高校数学で「行列」の単元に登場する「ハミルトン・ケーリーの定理」でおなじみのハミルトン先生です^^)
さて、ここからは丁寧に いきますよ~~

まず、
i2 = j2 = k2 = i j k = –1 ・・・・・・(2.1)
を満たす3つの虚数単位 i , j , k を定義します。
そんな数なんて存在しないだろ!! 3つもあるの??? とか文句言わないでくださいね^^;;
もちろん2乗して負になる数なんて実際には存在しない(だから虚数と言うんですよね)ですし、
これは、定義なのでそのまま従ってください。まぁ 単なる記号だと思ってもらえればいいかと。
で、これらの i , j , k は、以下の関係も満たします。
i j = k j k = i k i = j j i = –k k j = –i i k = –j ・・・・・・(2.2)
簡単に証明しておきますと、たとえば、 i j k = –1 の両辺に右から k をかけると、i j k2 = –k となりますけど、
k2 = –1 なので、 i j = k が得られます。他も同じような感じです。
で、これらの虚数単位 i , j , k と4つの実数 s , x , y , z を用いて、例えば 2 + 0.3 i – 4 j + 1.4 k みたいな感じで
q = s + i x + j y + k z ・・・・・・(2.3)
の形で表される数が四元数と呼ばれる数でして、s を q の実部、 x , y , z を q の虚部といいます。
通常は、虚数単位等を省略して q = ( s ; x , y , z ) のように成分表示するんですけど、
SLのスクリプト(LSL)では、 q = ( x , y , z , s ) のように実部を一番後ろに書くみたいです。
LSLの表記方法はなんとなく気持ち悪いので、以下は普通の表記方法でいきますね。
んまぁ、
「3次元の回転を表す四元数というのは、q = s + i x + j y + k z という形の数」
ということだけ理解してもらえればいいかなと^^
3.四元数の計算
以下、2つの四元数 q , q' を q = ( s ; x , y , z ) , q' = ( s' ; x' , y' , z' ) とします。
まず、四元数は、加減および実数倍に関しては、下のように普通に計算することができます。
回転には関係ないんですけどね^^;;
q + q' = (s + s' ; x + x' , y + y' , z + z' )
q – q' = (s – s' ; x – x' , y – y' , z – z' )
a q = ( as ; ax , ay , az ) ( a は実数)
問題は、乗除なんですけど、上の(2.2)にもあったように、 i , j , k の間の乗法が交換可能じゃないんですよ。
だから、なんとなく四元数の乗法に関しても交換可能ではないと予想できますよね。
まぁ 普通にそのまま計算してみましょう。
まず、
q q'= ( s + i x + j y + k z ) ( s' + i x' + j y' + k z' )
= s s' + i s x' + i s y' + k s z' + ←根性でひたすら展開!!
i s' x + i2x x' + i j x y' + i k z x' +
i s' y + j i x' y + j2y y' + j k y z' +
k s' z + k i z x' + k j y' z + k2z z'
= ( s s' –x x' –y y' –z z' ) + ( s x' + s' x + y z' –y' z ) i + ←(2.1)と(2.2)より
( s y' + s' y + z x' –z' x ) j + ( s z' + s' z + x y' –x' y ) k
見にくいので、成分表示すると
q q' = ( ss'–xx'–yy'–zz' ; sx'+s'x+yz'–y'z , sy'+s'y+zx'–z'x , sz'+s'z+xy'–x'y ) ・・・・・・(3.1)
のようになります。で、同様に計算すると、
q' q = ( ss'–xx'–yy'–zz' ; sx'+s'x–yz+y'z' , sy'+s'y–zx'+z'x , sz'+s'z–xy'+x'y )・・・・・・(3.2)
実部は同じなんですけどね、よく見比べると虚部の符号がビミョーに違いますよね。
というわけで、一般には q q' ≠ q' q となって、乗法に関しては交換法則が成り立ちません。
まぁ、簡単に言うと
「四元数のかけ算は、かける順番に注意しなければダメですよ!」
ということです。
4.共役四元数
ある四元数 q に対して、その虚部の符号をすべて逆にした数を q の共役四元数といって、 q と表します。
すなわち、
q = ( s ; x , y , z ) に対して、
q = ( s ; –x , –y , –z ) です。 ・・・・・・(4.0)
で、(3.1) や (3.2) のような感じで、q と q の積を考えると・・・・・
あ~ら不思議 虚部が全部0になって消えちゃって実数になるんですよ^^
しかも、どっちを先に書けても同じ結果になるんです!こんな感じですね↓
q q = q q = s2 + x2 + y2 + z2 ・・・・・・(4.1)
で、この値の平方根の正数を q の絶対値といって、|q|と表します。すなわち

ですね。で、q q = |q|2の両辺を |q|2で割ると

となるので、 q の逆数 q –1 は、

と表すことができ、四元数に関して除法も定義することできます。
まとめておくと、
「四元数のわり算は、共役四元数を使って表すことができる」
って感じですかね^^
とまぁ、四元数の性質について書いてきましたけど、なかなか実際の回転の話まで
たどり着きそうにないですね・・・

まだまだ話が長くなりそうなので、とりあえず、この記事はここで ひと区切りにしますね。
今回はSLに関係する話が何一つ出てきませんでしたけど、続きは また今度です~~~(^o^)
ではでは~~

Posted by Fujiko Tomorrow at 23:02│Comments(2)
│回転
この記事へのコメント
ふじこさん。すごい!
数学Ⅰも分からない、おバカな私には
チンプンカンプンw
ふじこさんは、きっと、学校の先生に違いない(勝手に決めましたw)
数学Ⅰも分からない、おバカな私には
チンプンカンプンw
ふじこさんは、きっと、学校の先生に違いない(勝手に決めましたw)
Posted by ようこ at 2008年12月07日 13:06
数学は(数学の先生が?)中学の時から大好きでした^^
スクリプトでプログラムを組むのと 数学の問題を解くのって、なんか似てません???
まぁ、私はそんなに難しいスクリプトは無理なんですけどね^^;;
スクリプトでプログラムを組むのと 数学の問題を解くのって、なんか似てません???
まぁ、私はそんなに難しいスクリプトは無理なんですけどね^^;;
Posted by Fujiko Tomorrow
at 2008年12月08日 12:44
