クォータニオンとは何ぞや?:基礎線形代数講座

みなさん、はじめまして。技術本部 開発技術部のYです。

ひさびさの技術ブログ記事ですが、タイトルからお察しの通り、今回は数学のお話です。

#数学かよ って思った方、ごめんなさい(苦笑)

数学の勉強会

弊社では昨年、有志による隔週での数学の勉強会を行いました。ご多分に漏れず、コロナ禍の影響で会議室に集合しての勉強会は中断、再開の目処も立たず諸々の事情により残念ながら中止となり、用意した資料の配布および各自の自学ということになりました。

勉強会の内容は、高校数学の超駆け足での復習から始めて、主に大学初年度で学ぶ線形代数の基礎の学び直し 、および応用としての3次元回転の表現の基礎の理解といった感じです。

「線形代数」とは、微積分と並び理工系の科学・技術の諸分野で基礎中の基礎として用いられる数学の分野で、ゲームでは主に3DCGの技術的基礎として応用されています。昨今のAIブームでも一時期話題になりました。 タイトルにある「クォータニオン」とは、日本語では「四元数」と訳され、ゲームではキャラや背景などを3次元回転させるときに応用されるもので、勉強会の中では最後に出てくるラスボスであり少し難しい数学の概念です。

勉強会の趣旨は、この「クォータニオン」を数学的にきちんと理解することを えさ ゴールとして、そのために(実際はそれだけでなくさまざまな技術の基礎となっている)「線形代数」の基礎をきちんと学び直そうということでした。

なぜ数学?

ゲーム開発においても分業化・専業化の流れは著しく、ゲームアプリケーション(みなさんに遊んで頂いているゲームそのもの)を開発する際、いわゆるゲームエンジンや各種ライブラリを用いるのが当たり前になっています。これらエンジンやライブラリは、ゲーム開発者にさまざまな機能を提供し効率よく開発できるようにすることが役割であり、極端な話、三角関数を全く知らなくても3Dゲームを作れる時代になっています。 しかしながら例えばゲーム固有の表現のためにシェーダー(画面を描画する機能)をカスタマイズしたい場合や、当然のことながらエンジンやライブラリそのものの開発者は、ある程度のさまざまな数学の知識が必要となります。技術的に高度なことをしようと思うとなおさら深い理解が必要です。

このように数学や物理学は、ゲーム業界のみならず理工系のさまざまな分野で、科学者・技術者を根元から支える基礎となり重要な武器となっています。

資料を公開します

今回、この勉強会用に用意した資料「基礎線形代数講座:線形代数 回転の表現」を一般に公開いたします。全8講、本文が全部で140ページのPDFで、各講は以下のような標題です。

  • 第1講 イントロダクション
  • 第2講 初等関数
  • 第3講 ベクトル
  • 第4講 行列 I:連立一次方程式
  • 第5講 行列 II:線形変換
  • 第6講 行列 III:固有値・対角化
  • 第7講 回転の表現 I
  • 第8講 回転の表現 II

線形代数 基礎の本質的な部分をできるだけ簡潔に分かりやすく学べるように全体を組み立ててみました。各項目を学ぶ順番や手法、一部は定義すら一般的なものと違う(例:行列式)こともあります 。いわゆる「大人の学び直し」ではあるのですが、内容はガチの数学となっています。 記事の最後に公開先へのリンクを張っておきますので、興味のある方は参考にして頂ければと思います。

特に学生の方で、この資料で線形代数を学んでみようと思われた奇特な方がいらっしゃれば、言うまでもないことですが読んだ後改めて講義で指定されている教科書を読んでみましょう。きっとこれまで以上に理解が深まることと思います。

この記事では、その中から「クォータニオン」の導入部分である、第8講の第2節までをそのまま引用します。導入部なので内容は平易となっていますが、複素数・行列・三角関数に関するある程度の知識がないと理解は難しいと思われます。ぜひ紙と鉛筆を用意して、ご自身でも図や式を書いたり計算したりしながら、じっくり読んでみてください。

基礎線形代数講座からの引用

【第8講】回転の表現II


【8-1】はじめに

本講では、4種の3次元回転の表現の最後としてクォータニオンについて学ぶ。クォータニオンは日本語では四元数(しげんすう)と訳されるもので、1843年にハミルトンにより発見された複素数を拡張した代数体系であり、3次元の回転の表現としても多くの利点を備えている。
その性質から特に計算機を用いる場合にも他の表現手法に比べ優位な点が多く、近年 宇宙機を始め、3DCGやCV、ロボット工学等々さまざまな分野で応用されている。一方で他の表現手法に比べるとやや抽象的でその本質(4次元空間に埋め込まれた3次元回転)が捉えづらい面も否めない。本講では、拡張の元になった大きさ1の複素数の積による複素平面内での回転の復習から始め、ハミルトンによる発見に至るまでの過程*1をたどる事でクォータニオンを導入し、その性質を分かりやすく解説する。


●おさらい
任意の複素数 x+iy に大きさ 1 の複素数 cosθ+isinθ を掛ける事は複素平面内での θ 回転を表していた。実際 (x+iy)=(cosθ+isinθ)(x+iy)=(xcosθysinθ)+i(xsinθ+ycosθ) この式で、1i をベクトルの基底としてみると、 xx=xcosθysinθ, yy=xsinθ+ycosθ という線形変換と見ることができて、行列形式で書けば [xy]=[cosθsinθsinθcosθ][xy] となり、すなわち複素平面である 1i 平面での θ 回転を表している事がわかる。

これの本質は、iを掛けるという事:基底 1 と i との閉じた代数が、1i 平面内で一回りする回転に相当していることにある。
f:id:sgtech:20210601193226p:plain:h160


【8-2】クォータニオンの導入:ハミルトン劇場

[8-2-1] 拡張複素数で複素( 3次元)空間を回したい

ハミルトンは複素数を拡張して、虚数単位 i の他に独立な別の虚数単位 j を導入 i2=1, j2=1, i=i, j=j1,i,j の 3つの元で 1i平面、1j平面、ij平面それぞれの回転を表現できないか?と考えた(つまり複素平面を複素空間に拡張できないか?ってこと) 。
f:id:sgtech:20210601193336p:plain:h160

「独立な異なる虚数単位 i,j」に違和感がある人もいると思う。新しい代数として拡張していっているので、うまく拡張できさえすればあとは「慣れ」ではあるのだが「複素数」を以下のように解釈することで別の虚数単位を導入するという拡張も違和感が減るかもしれない。
おさらい*2:2行 2列の行列 I=[0110] を考えると(この行列は 上の おさらいで出てきた 2次の 回転行列で θ=π/2 としたものでもあることに注意)、 I2=[1001]=E ( E は単位行列 )となる(つまり 2乗して -1)。また行列 Z=xE+yI (x,yR) を考えると、 Z=[xyyx] なので、Z=O となるのは x=y=0 のときのみ(つまり EI は線形独立)。この行列 Z=xE+yI に対し E1,Ii に対応させることで、複素数 z=x+iy に対応させる事が可能となる。
ここでさらに別の行列 例えば J=[1221] を考えると、J2=E を満たし、この J を含め E,I,J が線形独立であることは容易に確かめられる。このような「複素数の拡張」(上の J の事)がうまく行くかどうかは別にして「違和感」のない表現もやろうと思えば可能ではある。


以下、ハミルトンがクォータニオンを発見するまでの過程*3をたどってみよう。
ハミルトン:1i平面と 1j平面の回転は当然できた。

f:id:sgtech:20210601193421p:plain:h160
でも ij平面がうまくいかない。 i×j の扱いがどうにもこうにも…
とりあえず i×jij として回るようにはできたけど*4、この ij って本来 i にならないと ij平面にはならない。でも ij=i としてしまうと i を掛けても j にならずに 1 となってうまく回らない。どうしたものか・・・
(ちなみに後に別の数学者により、このような 1,i,j による 「複素数の拡張」(三元数に相当)は、うまく行かない事が証明されている。)


[8-2-2] 4次元? マジか 4次元??

ある日運河のほとりを歩いている時(実話*5)にひらめいた: もう一つ虚数単位を導入して i×j=k としてみよう。実数単位 1 と虚数単位 i,j,k で 4次元になるけど、うまくいくかも・・・
回転面は 1i,1j,1k平面, ij,jk,ki平面の6面になるのか。3次元回転をうまく取り出すには、ij,jk,ki平面の回転がこんな風になるといいのかな?
f:id:sgtech:20210601193503p:plain:h160

i を掛けると?:想定図のように jk平面を回すため、ij=k としてみよう

f:id:sgtech:20210601193724p:plain:h160
お、jk平面だけでなく 1i平面も同時に回るんだ。そりゃそうか。しかもそれぞれの平面内で回りそうだ。
角度 θ の場合として「大きさ」1の (cosθ+sinθ) を、4次元に拡張した「複素数」(w+ix+jy+kz) に( i2=1, ij=k, ik=j に注意して)掛けてみよう:
(8-2-1)(w+ix+jy+kz)=(cosθ+isinθ)(w+ix+jy+kz)=wcosθ+ixcosθ+jycosθ+kzcosθ+iwsinθxsinθ+kysinθjzsinθ=(wcosθxsinθ)+i(wsinθ+xcosθ)+j(ycosθzsinθ)+k(ysinθ+zcosθ)
確かに wx平面( 1i平面:下から2行目)と yz平面( jk平面:下から1行目)がそれぞれの平面内 で同時に別々に回っている*6

つまりこういうこと
[wxyz]=[cosθsinθ00sinθcosθ0000cosθsinθ00sinθcosθ][wxyz]


j を掛けると?:想定図のように ki平面を回すため、jk=i としてみよう

f:id:sgtech:20210601193756p:plain:h160
およ。さっきの i を掛けて jk平面をうまく回せる条件:i×j=k と合わせると、ij=k, ji=k となって、なんと積は可換じゃなくなる! まあしょうがないか…。

角度 θ だと同様に:
(8-2-2)(cosθ+jsinθ)(w+ix+jy+kz)=(wcosθysinθ)+j(wsinθ+ycosθ)+k(zcosθxsinθ)+i(zsinθ+xcosθ)
ん、これも別々に回っている。

●残り k を掛けると?:想定図のように ij平面を回すため、ki=j としてみよう

f:id:sgtech:20210601193844p:plain:h160
これも角度 θ だと同様に:
(8-2-3)(cosθ+ksinθ)(w+ix+jy+kz)=(wcosθzsinθ)+k(wsinθ+zcosθ)+i(xcosθysinθ)+j(xsinθ+ycosθ)

●とりあえず分かったこと

虚数単位 i,j,k に対して積を ij=k,ji=k,jk=i,kj=i,ki=j,ik=j として w+ix+jy+kz に左から cosθ+isinθ を掛けると、1i平面, jk平面が同時に θ 回転 する。j,k で回しても同様。でもこのままだと1i平面で余計な回転が発生し、最終的に実現したい純粋な 3次元の回転を切り出せない。何かうまい方法はないのだろうか?

つまりこうなって欲しい
[wxyz]=[1000010000cosθsinθ00sinθcosθ][wxyz]


●そういえば非可換だった*7

非可換なので、右から掛けたらどうなる?
右から i を掛けた場合:
f:id:sgtech:20210601193947p:plain:h160
なんと 1i平面は同じ向きで、jk平面は逆向きに回る!じゃあ i だとその逆になるだろう。

右から i を掛けた場合:
f:id:sgtech:20210601194024p:plain:h160
これなら、左から i を、右から (i) を掛けることで 1i平面の回転だけを無くせそう。


●というわけで

左から i 右から i を掛けた場合:
f:id:sgtech:20210601194059p:plain:h160
jk平面は2倍回りそうだけどw やってみよう。
(8-2-4)(cosθ+isinθ)(w+ix+jy+kz)(cosθisinθ)=(cosθ+isinθ){(wcosθ+xsinθ)+i(wsinθ+xcosθ)+j(ycosθzsinθ)+k(ysinθ+zcosθ)}=wcos2θ+xsinθcosθ(wsin2θ+xsinθcosθ)+i(wsinθcosθ+xcos2θ)+j(ycos2θzsinθcosθ)+k(ysinθcosθ+zcos2θ)+i(wsinθcosθ+xsin2θ)+k(ysinθcosθzsin2θ)j(ysin2θ+zsinθcosθ)=w(cos2θ+sin2θ)+ix(cos2θ+sin2θ)+j{y(cos2θsin2θ)z(2sinθcosθ)}+k{y(2sinθcosθ)+z(cos2θsin2θ)}=w+ix+j(ycos2θzsin2θ)+k(ysin2θ+zcos2θ)
最後は倍角の公式を使った。これで jk平面 だけを回せた!
めでたしめでたし。2倍回るけどw

こうなった
[wxyz]=[1000010000cos2θsin2θ00sin2θcos2θ][wxyz]


・・・ハミルトン劇場 終


このあと第8講は

  • 【8-3】クォータニオン:定義と諸性質
  • 【8-4】クォータニオン:3次元回転の表現
  • 【8-5】 [▼]付録 1:一般的な4次元の回転について
  • 【8-6】付録2:成分表示における4次元内積の不変性について
  • 【8-7】 [▼A]付録 3:オイラーの公式と代数的補間式 について

と続きます・・・。

公開先

「基礎線形代数講座」は、開発技術部の技術資料一般公開先でもある、SlideShare サイトにて公開しています。

www.slideshare.net

セガでは共に技術力を高め合い研鑽していていける方を募集しています。 興味がある方は下記サイトにアクセスして下さい。

recruit.sega.jp

*1:あくまで筆者の想像(妄想)による過程であり、史実に基づいたものではありません。

*2:詳細は第5講 付録2参照

*3:くどいですが、筆者による想像(妄想)です

*4: 𝑖×𝑖𝑗=𝑖2𝑗=𝑗 ってこと

*5:運河を渡る橋に 𝑖2=𝑗2=𝑘2=𝑖𝑗𝑘=1 と刻んだとの事

*6:ちなみに 4次元では 2本の直交する基底で張られる (回転 )面を、基底を共有せずに 2面とることが できる( 3次元ではできない)。この場合 1𝑖平面 と 𝑗𝑘平面 は原点のみで交わっている事に注意。

*7:ハミルトン卿ご自身は、この積の非可換性(当時初?)あまりお気に召さなかったらしい

Powered by はてなブログ