読者です 読者をやめる 読者になる 読者になる

未踏作業日誌――余計なもの作るよ!

未踏の作業日誌的なものを書きましょうということで書くことにしました.余計なことばっかりしています.

Quaternionが難しすぎるので可視化してみた話

1週間ぶりの更新ですが,先週辺りからずっと脱線してました.まだやるつもりです.

それはいいのですが,UnityではTransformの回転をQuaternionによって表しています.もちろん,Inspector上ではオイラー角で扱えるのですが,本質的にはQuaternionを使っています.

オイラー角はXYZ軸の角度を直感的に扱えますが,ジンバルロックやSlerpがうまくできないといった問題を抱えています.一方で,Quaternionは計算負荷が小さいくせにジンバルロックはないし,Slerpの計算が高速だし,足し算,引き算,かけ算が定義されています.聞いただけだとオイラー角の欠点を克服した素晴らしい数学的概念だと思います.

しかし,一方でQuaternionは複素数,つまり虚数から始まった概念です.存在しない数字を扱ったら全部丸く収まった,人間が見ても中身の意味はわからない,というとんでもない性質を持っていると言われています.

でも,そう言われると本当なのかな,と思ってしまいます.ハミルトンは800ページに及ぶ四元数の論文を書いたとか,四元数は恐ろしいと言うことで無駄に敷居を上げる誰かの作戦なのかもしれません.

 

そういうわけで,視覚的にQuaternionの値を確認できるものを作ってみました.

Unity Web Player | MikuMikuDance for Unity

 

簡単に言うと,ミクさんの頭をQuaternionによって回転できるだけのものです.画面端のStartボタンを押すと始まります.画面端にスライダーが4本出てきますが,上からX, Y, Z, Wの値をいじれるようになっています.

弄ってみるとわかるのですが,X, Y, Zはローカルの向きを表しているということがわかると思います.スライダーを動かすともちろん回転するのですが,弄っている値の他に勝手に動いている値もあります.Quaternionには i^2 = j^2 = k^2 = ijk = -1 という有名な規則があるため,そこから逸脱しないようにUnityが勝手に調性しています.これのおかげでローカルな向きの回転を表すことができているとも言えるでしょう.

 

ローカル軸の回転ができた! わーいで終わってしまうとただQuaternion便利だねで終わってしまうのでアレなのですが,そもそもの話としてなんでこれで回転がうまく表現できているのという大きな疑問があります.

元々Quaternionは数学的な遊び(閃き)の中で発見されたものです.そもそもの話として3DCGのTransform行列を生成するために使おうと思って発見されていないはずです.これは,後々の研究で3次元の幾何学に応用できるぞ,とハミルトン以外の人が発見してくれたおかげです.

それだとしても,Xを弄って正規化すればローカルのX軸回転が実現する,というのはとても不思議です.オイラー角も3軸の回転を表していますが,Quaternionは虚数なわけです.それでジンバルロックの問題も解決して,Slerpが簡単に行えるという利点が付け加わると本当に不思議です.ポルナレフも何が起こっているのかわからないわけですね.

なぜそれで計算がうまくいくのか.数学的な規則がとても整備されているおかげで,4つの変数でなんかうまく計算できる.そういうところに数学の魅力を感じるわけですが,いかんせん意味がわかりません.考え方を鍛えたいですね.