四元数の概念を(ほんの一部だけ)実体験

ⅰ 3Dを理解するのに虚数が便利
先日の「transformプロパティの3D変形にチャレンジ」の記事を書くにあたり、3次元のものを回転させる場面が出てきました。
これを理解するのはとても苦労しました。

3Dなので「x、y、z」の軸が登場するのですが、
例えば「z= 1の点をy軸を90度回転させるとどうなるか」との問いに対して、
答えは「x = 1」なのですが、これを頭の中で理解するのはとても混乱します。

それをさらに90度回転させると(z = -1)・・・さらに90度回転させると(x = -1)・・・

これを図に描きながら、3D上で回転させることを理解するのは難しいとつくづく感じました。
目の前でモノが回転するのは説明なしで直感ですぐに分かります。
しかし、これを数字で表現すると途端に難しくなります。
tennis-1381230_1920 (1).jpg
BessiによるPixabayからの画像


ⅱ 「四元数」を使うとうまく説明できるのでは?
この3D上で回転させる図を描きながら、ふと思い浮かびました。
もしかしたら、まだ一度も使ったことはないですが「四元数」を使うとうまく説明できるのでは?

しかし、そもそも四元数の中身を全く知りません。
ただ知識としては「3D空間上での回転を考えるときは、3種類の虚数を使うと簡単に回転できる」ということは何かで読んで知っていました。
ゲームで3D回転を高速で実現できているのは四元数(クォータニオン)のお陰で、
もしこのプログラムを、行列式やベクトルの概念で記述していたら高速ではとても実現できないかフリーズするとか、
宇宙船の姿勢制御にも使われているとかの話でした。


ⅲ 3種類の虚数とは
3種類の虚数とは、もちろん異なる3種類の虚数が登場します、それを「i」、「j」、「k」で表現します。

「i」という虚数は学校でも登場しました。
1つの虚数「i」を理解するのも大変ですが、一気に3種類の虚数が登場するのでさぞかし難しそうですが、使ってみてその複雑さよりその便利さに驚きました。

通常は、これを四元数というらしいのですが、おそらく3つの虚数+実数で4つの種類の数を扱うため四元数というのかも知れません。


ⅳ 3種類の虚数の定義
その3種類の虚数の定義は、
ⅰ 「i2 = j2 = k2 = ijk = -1」というものです。
ⅱ ⅰの定義から次のことが導き出されます。
①「ij = k」、②「jk = i 」、③「ki = j」
です。
ⅲ さらにⅰとⅱから・・・
④「ji = -k」、④「kj = -i」、⑤「ik = -j」
が導き出されます。

なお、「i ≠ j、j ≠ k、k ≠ i」の関係にあり、名前は虚数で同じでも、同じ値ではなくそれぞれ異なります。
しかも「ij ≠ ji、jk ≠ kj、ki ≠ ik」と、記述する順番が異なると同じ値にはならない、というものです。

通常の実数の感覚とは異なるので、記述する順番には特に注意が必要です。
その理由は、後に明らかになるはずです。

ここまでを確認します。以降の説明でこの部分が重要になります。
重要な定義

基本:「i2 = j2 = k2 =ijk = -1
①「ij = k」 ②「jk = i 」 ③「k i= j
④「ji = -k」 ⑤「kj = -i」 ⑥「ik = -j


①は最も基本的な定義なので、そういうものだと追及は諦めてください。

②は、なぜ①から導き出せるのかですが
  基本の「ijk = -1」に着目してください。
例えば、この両辺に「k」を乗じると、「ijkk = -1k」=「-ij = -k」=「ij = k」が導き出されます。
同様にして「i」を乗じると「jk = i 」が、「j」を乗じると「ki = j」が導き出せます。

③は、②の応用ですが・・・
例えば、②より「i=jk」なので、「ji」の「i」を「jk」に置き換えると
「ji」=「jjk」=「-k」、つまり「ji = -k」となります。


ⅴ では3種類の虚数を使ってみましょう
冒頭で「z= 1の点をy軸を90度回転させると」答えは「x = 1」と説明しましたが、これを3つの虚数を使って考えてみましょう。

計算の手順
⑦ 「x → i、y → j、z → k」と考えます。
⑧ 回転させる軸を先に記述します。
⑨ 回転させられる方は⑧の次に記述して、⑧×⑨と計算します。
⑩ 回転される軸と回転させられる軸が同じ場合は変化しない。
なお、90度回転させるとは、回転軸の+側から0の方を見て時計回りに90度回転させることを意味します。
※z軸に関しては、手前側を+と考えるか奥の向こう側を+と考えるか、色々な解釈があることを知りました。
ここでは向こう側を+と考えて、話を展開しました。

したがって3Dで考えた場合には、時計の針が回転するというのは、実は向こう側のz軸の+側からxy平面上の針を回転させていると考えるので、+である向こう側から時計回りに回転させると、-であるこちら側からは反時計回りに回転するように見えることに注意してください。

※「時計回り」という言葉に関しては混乱は少ないようですが、「右回り・左回り」は混乱は多いですし、バネや朝顔のつるの巻き方に「〇〇回り・巻き」といっても正しく伝わらないと思います。

定義があればいいのですが、定義がないとこういったことを表現し伝えることすら難しいものと感じました。

手順に当てはめると回転させる軸はy「j」で、回転させられる方はz「k」なので、
「j × k」 = 「jk」になります。
重要な定義の②より「jk = i」なので、答えは「i」、つまりx= 1 ですね。

「さらに90度回転させると(x = -1)」と冒頭に書きました。
それを、検証してみましょう。

先程求めた「i」を90度回転させると、
j × i = ji、重要な定義の④より「ji = -k」なので、答えは「-k」でつまり z = -1 ですね。

やはり冒頭に書いてある「さらに90度回転させると(x = -1)」は、
j × (-k) = -(jk)、これは重要な定義の②より -(i) で、つまり x = -1 ですね。

ここまで来ると、さらに90度回転させると最初のzに戻りそうですね。
念のために、j × (-i) = -(ji) 、重要な定義の④より = -(-k) = kで、z = 1 になりました。
説明は省略しますが、私はさらに「Z = 1」をx軸を90度回転させた場合、「y = 1」をz軸を90度回転させた場合も、この考え方が成立することを確認しました。


ⅵ y軸を90度、x軸を90度回転させた場合は?
上記の話をさらに一歩進めて、2つの軸を回転させた場合を考えてみました。
しかし、複雑なことはありません。
上記の話をそのまま応用すれば、答えが求められます。

ということは、3つの軸を回転させた場合も成立するはずです。
(まだ、確認していませんが・・・)

とりあえず、2つの軸を回転させた場合です。
「z = 1」をy軸90度、x軸90度回転させた場合です。
計算:
最初に「z = 1」をy軸90度回転を計算します。これは既に答えが出ていて「i」でx = 1でした。
次に「x = 1」をx軸90度回転を計算しますが、これは同じ軸なので⑩より変化はないので、答えは「x = 1」です。

つまり、「z = 1」をy軸90度、x軸90度回転させると答えは「x = 1」です。

さらに「x = 1」をy軸90度、x軸90度回転させると
j × i で④より-kになり、i × (-k) =(⑥より)-(-j)、つまり答えは「y = 1」です。

「y = 1」をy軸90度、x軸90度回転させると
j × jは⑩より変化なし、i × jは①よりk、答えは「z = 1」で、元に戻ります。

1つの軸を90度回転させるときは、4回でもとに戻りますが、2つの軸を回転させるときは(他の軸でも確認しましたが)3回でもとに戻りました。


ⅶ ij と ji は同じではない
では、虚数では「ij ≠ ji、jk ≠ kj、ki ≠ ik」となっている理由を実例で説明したいと思います。
すぐ上の例では、「y軸を90度、x軸を90度回転させた場合」の説明をしました。
「z = 1」を「y軸→x軸の順」に回転させると、「x = 1」になりました。

では、「z = 1」を順序を逆にして「x軸→y軸の順」に回転させてみましょう。
i × k = ⑥より -j になり、次は⑩より変化なしで、答えは -j つまり「y = -1」です。
同じ2つの軸を回転させる場合でも、回転させる順番が異なると答えが違ってくることが分かります。
「回転させる=虚数を乗じる」ことですから、虚数を乗じる順番が異なると答えが違ってくることになります。


ⅷ 虚数は実在しない?
虚数と聞くと、実在しない世界の話で・・・と考える方も多いかと思います。
でも、身の回りでは実在しない数をみなさん何の疑問に感じることなく使っています。

えっ、そんなはずはない、と思うかもしれませんが・・・
マイナス1万円を実際に見た方はおられますか?
マイナス2個のりんご、マイナス3匹の犬・・・
これらは計算上、帳簿上は使っても実像を見た方はいないはずです。

そもそも、テーブルの上に1万円札が置いてあって、これがプラスの1万円札なのか、マイナスの1万円札なのか見分けられません。
すべて、見えるものはプラス(いちいちプラスと表現するのは面倒なので、省略して)1万円札です。

ものでなくとも、マイナス1キロメートル歩いたり、マイナス1キログラムのものを持ったり、マイナス1時間を過ごしたり・・・これらはすべて計算上存在しているだけです。
計算上あった方が便利だからマイナスという実在しないものを使用しているにすぎません。
これは、虚数についても全く同じことが言えます。
存在しなくても、計算上便利という点では全く同じで、しかも虚数を使わないと答えが出ないものも存在します。


ⅸ 本日は90度回転の例だけを取り上げました
今回の記事では90度の回転の例で説明しましたが、現実には0~360度の範囲の回転があります。
90度の例が一番説明しやすかったから90度の限定版で説明させていただきました。

90度だと説明しやすい理由
角度を三角関数の90度間隔で考えると・・・
cos90=0 sin90=1
cos180=-1 sin180=0
cos270=0 sin270=-1
cos360=1 sin360=0
という関係があり、90度単位で回転させると、「0、1、-1」の数値にしかならないので、「x、y、z」軸上のいずれかに存在するので説明しやすかったからです。

これが45度だったら・・・
冒頭の問題は、『「z= 1の点をy軸を45度回転させるとどうなるか」』となり、
答えは推測ですが「z = 0.707、x=0.707」となり、これをさらに45度回転させると「z=0、x=1」となると思うのですが、じゃあ30度回転なら?任意の点ならなどと複雑になって対応できないので、とりあえず今回は90度限定バージョンでお話させて頂きました。


現実には3Dで考える場合には、回転に加え、物体が移動したり拡大縮小したりの要因もありますので、transformプロパティの値には「回転・縮尺・移動」の値を指定できるようになっています。縮尺と移動に関しては、先日の「transformプロパティの3D変形にチャレンジ」で説明した通りです。
今回は回転に関して説明するつもりでしたが、かなり脇道の回転の話をしてしまいました。

なお、ネットで四元数を検索していただくと分かると思いますが、今回の話以上の難解な用語を乱発して説明されています。
今回の説明は、四元数の定義から外れないように、非常にわかりやすくするために工夫したものなので、0次元である「点」に関しての回転の話でした。
これをもとに整理し、1次元・2次元、出来れば3次元の話に改良・発展させて、色々な場面で活用できるように出来たらいいなと思います。

本筋の話のtransformプロパティの回転の話は、別の機会にとっておきます。

"四元数の概念を(ほんの一部だけ)実体験"へのコメントを書く

お名前:[必須入力]
メールアドレス:
ホームページアドレス:
コメント:[必須入力]