見出し画像

【日記/2024-04-26】 自分の数学学習ロードマップと3DCGを学んでいて思った事・振り返り

3DCG を触っていると数学の概念はちょくちょく登場します。
最も身近なのは「トポロジー」と「ブーリアン」でしょうか。
トポロジーは位相空間という分野で登場する概念です。
「位相」というと周波数のようなものを想像してしまうのですが、同じ単語でありながら英単語は異なるため全くの別分野です。
周波数などに登場する「位相」は Phase、位相空間の「位相」は Topology なので英単語にすると全然違うのです、ややこしい

Topology はそのまま「トポロジー」と読みます。
位相空間で最も有名な話は「ドーナツとマグカップは同じ幾何学的性質を持つ(同相である)」という話でしょうか。
つまり、マグカップを変形させていくとドーナツにできるし、ドーナツを変形させ続けるとマグカップにできるため、この二つは同じものであると見做せるという話のようです。

これ、位相空間を勉強し始めた頃は全く意味がわからなかったのですが、3DCGを始めてから概念をなんとなく理解できた気がします。
例えばマグカップのモデルデータがあったとして、これを ZBrush や Blenderを使って変形させることを考えると、マグカップからドーナツを作ることは可能だと思います。
そしてその逆もおそらく可能でしょう
この考え方を少し変化させると球体オブジェクトを変形させて人の顔を作るなら、人の顔と球体も位相空間的には同相であると言えるのかもしれません。
位相空間論や多様体に関してはまだまだ勉強中のため、時間があるタイミングでもっと理解を深めたいですね。

ノーマルマップは「接空間」と呼ばれる数学分野の多様体で登場する概念を用いた技術です。
多様体は前提知識として位相空間の理解が必要ですが、多様体の延長線として存在するのはリー群 と呼ばれる群の構造を持つ多様体が登場します。
「群の構造」というのは群論における群のことで、これを理解するには代数学の理解が必要となります。
リー群はロボティクスの回転計算などで登場しますが、 Unity などでゲーム開発をしていると回転計算でしばしば登場するクォータニオン(数学分野では四元数という呼び方のほうが馴染みがあるかもしれません)
は実はこのリー群と深い関わりがあることを最近知りました。

数学を勉強するモチベーション

話は変わって、私が真面目に数学を勉強したい!と思ったきっかけになったのは2022年ごろのGWの時期とつい最近の話ですが、仕事でセキュリティ周りの仕事をしていた為、その際にデータの暗号化などを通してAES暗号のアルゴリズムを知った事がきっかけでした。

AES暗号では「ガロア体(有限体とも呼ばれる)」と呼ばれる数が登場します。
ガロア体はざっくり言えば四則演算の出来る有限の要素で作られる集合のことです。
「四則演算ができるのは当たり前なのでは?」と思うかもしれないのですが、代数学を勉強していると「四則演算ができる」という条件を満たすのは意外と難しいことである事に気づきます。
AES暗号では 0 と 1 だけを要素として持つ有限体 GF(2) を 8次まで拡大した拡大体 $${GF(2^8)}$$ を用います。
「0 と 1だけが登場する世界で四則演算が成り立つ」までは理解できるのですが環論、体論の理解がないと「拡大ってなんや???」となります。
なのでガロア体の性質を理解するには前提として群、環、体までは理解している必要があるのでした。

しかし、このガロア拡大体が当時全くの不勉強だった自分にとってすごく美しく感じ「なんとしても理解したい!」と思ったところから自分の数学を勉強する人生が始まりました。

代数学を学ぶ

これらを理解するためのスタート地点にあったのは代数学の基本的な知識でした。
「集合」を用いた演算の話から始まりました
このブール演算は後の 3DCG でも 「ブーリアン」という概念で登場します。

↓ 3DCGでのブーリアン操作について書いた記事

写像の登場

集合の次に学ぶのは「写像」という概念です。

上の図での対応関係を見ていてエンジニアであれば map や Dictionary を連想するのではないかと思います。

実際に「写像」は英語では map なので、この概念はプログラミングの map や Dictionary と深く結びついていることがわかります。
こんなところでも数学と繋がっていたとは!

この写像は関数とよく似ています。というよりは関数をより抽象的に一般化させると写像になるという感じなのかもしれません。
行列計算も線型写像と呼ばれる写像の一種なので、行列計算は写像の演算ルールが適用されることがわかります。

「行列は演算順序が変わると答えも変わる」という性質がありますが、これは写像が非可換であるという性質を考えると納得できます。

群との出会い

この集合と写像を勉強した後に次は群の構造を学びます。
群とは
・結合法則が成り立つ
・単位元が存在する
・逆元が存在する
という3つの性質を満たした集合の事を言います。
この3つを満たすとそれは「群」であると言えます。
群の演算は a ○ b というように定義されますが、この演算は明確には定義されません。
その「演算」は掛け算かもしれないし足し算かもしれないし、行列を用いた計算かもしれないし、もっと異なる操作であるかもしれません。

この3つの性質を満たしたものを「群」と呼ぶとして、それを定義すると何が嬉しいのか?
という話になります。

群論はこの群についてより深く学ぶ分野です。
実はこの「群」は非常に抽象度が高い概念であることからも汎用性が高く、様々な事象に当てはめる事が出来ます。

群を学ぶと最初に「巡回群」と出会うと思います。

巡回群は一つの要素だけですべての要素を構成する群を言います。
「巡回群は一つの要素だけですべての要素を構成する」とは何なのか?
例えば時計で考えてみます。
秒は 0 から始まり、そこから1, 2, 3, …と1刻みで増えていき 60 になると 1分が経過します。1分経ったらまた秒は 0にリセットされ、1刻みで増え続けます。
「1刻みで増える」ということは
0に1を足して1になり、
1に1を足して2になり、
2に1を足して3になる
ということです。
これはつまり
1 … 1
2 … 1 + 1
3 … 1 + 1 + 1
4 … 1 + 1 + 1 + 1
5 … 1 + 1 + 1 + 1 + 1

と書くことができます。
60 になると 0 にリセットされることから
1 で全てを表現できます。
0 と 1 は足しても 1 であり、 a ○ e = a
となる単位元 e が存在します。
(このように 0 が単位元となる場合はこれを零元と呼ぶこともあります)
足し算は結合法則も交換法則も成り立つので
a ○ b も b ○ a も同じであり、(a ○ b) ○ c も a ○ ( b ○ c) も成り立ちます。
そして60を周期にすることからどの数も $${ a ○ a^{-1} = e }$$ となる 逆元 $${ a^{-1} }$$ が存在します。
たとえば 1 なら 59 で 60 = 0になるので1の逆元は59、2 なら 58 、3 なら 57です。
したがってこれは群の要件を満たすので群の構造を成します。

そしてこの「60 を周期にして 1 刻みで増えていく」数は 1 だけで全てを表現できるので 巡回群と考えることができます。

図形への回転操作を巡回群として考える

先ほども書いた通り、群は明確に演算が定義されていないのであらゆる操作を「演算」と考える事が出来ます。
「図形の回転操作」も「演算」と考えることが出来ます。
「正六角形を60度回転させる」事を考えてみます。
このとき、回転角度 を θ として θ = $${ \frac{\pi}{6} }$$ とするなら回転行列 $${\begin{pmatrix}cos θ  & -sin θ \\sin θ & cos θ\end{pmatrix}}$$ を元と考えることができます。
この回転行列を A とするなら

60度の回転 … A
120度の回転 … A・A
180度の回転 … A・A・A
240度の回転 … A・A・A・A
300度の回転 … A・A・A・A・A
360度の回転 … A・A・A・A・A・A
と表す事ができ、6つの要素で構成される集合が作れることがわかります。

「360度回転する」ということは一回転して元の位置に戻ってくるので「回転していない状態」である事と等価です。
したがってこの場合「360度回転する」事は単位元 e と考えることが出来ます。
この行列計算もまた結合法則を満たし単位元と逆元を持つので群であり、Aだけで全ての元を生成できるので巡回群であると言えます。

行列への理解を深める

このとき、自分は「回転行列ってどうしてこの演算なの?」という疑問を持ちます。
学生時代からこの式の存在は知ってはいました。
しかし、どういう理屈からこの式が導けるのか?を深く考えた事がありませんでした。
そこでこの回転操作から脱線する形になりますが三角関数と回転について改めて勉強し直すことになりました。

三角関数と回転に関しては書くと長くなるのでここでは割愛します。
これは別の記事にまとめる予定ですが、最終的には加法定理を導出する事になります。

ベクトルに対する認識の移り変わり

ベクトルに対する印象も変わりました。
複素数や多項式もベクトルの要件を満たすからです。
ベクトルもまた群・環・体のようにあるルールを満たすものをそのように定義しているに過ぎないんですね。
これまでは方向とか矢印とかそんなイメージしかなかったベクトルですが、ベクトル空間の定義を改めて知る事で「なるほどこれがベクトルなのか!」と理解することが出来ました。
多項式もベクトル空間の要件を満たすのでベクトルなのですね。
最大次数を 5 とした $${ x^5 + x^3 + x^1 }$$ のような多項式があったとしてもこれは (1,0,1,0,1,0) と同じように扱うことが出来ます。
AES 暗号では 多項式を用いて拡大された有限体 $${ GF(2^8) }$$ を扱いますが、この有限体の要素は全て多項式です。
そしてコンピュータ側ではこの多項式を8次元の ベクトルとみなし、それをビット列に当てはめて使用します。
したがって $${ x^2 }$$ なら (0,0,0,0,0,1,0,0) であり、これを1バイトのビット列に当てはめると 0000 0100 という値になります。
同じように $${ x^2 + x + 1  }$$ なら 0000 0111 となります。

そして AES 暗号の SBox は入力として渡ってくるデータのバイト値をこれらの $${ GF(2^8) }$$ の要素と見なした上で各要素の乗法逆元に置き換えた後にアフィン変換を行った値に置換するという操作を行います。

ベクトル空間の解釈が大きくなったところでそしたら色情報も(r,g,b) みたいに表現するわけだからこれもベクトルじゃん!という事に気づくのですが、そんな感じで色を(r,g,b) -> (x,y,z)のベクトルとみなして活用しているのがノーマルマップなんですよね。

複素数とオイラーの公式からフーリエ変換を知る

ここまで数学を勉強をしてみて、以前から興味のあったフーリエ解析も今なら覚えられるんじゃないか?と思い改めて微分、積分から勉強します。
ここでマクローリン展開という関数を多項式の和で近似する手法を知るのですが、このマクローリン展開から 三角関数を多項式の和として近似することができることを知ります。

ここでネイピア数 e の虚数乗 $${ e^{ix} }$$という概念を知ります。
虚数乗ってどういうこと!?となりますが、これは ネイピア数 $${ e^x }$$ のマクローリン展開を見ていくと答えが見えてきます。

$${e^x = 1 + x + \frac{x^2}{2!} + \frac{x^3}{3!} + \frac{x^4}{4!} + … }$$
これを$${ e^{x} }$$ から $${ e^{ix} }$$ 変え、xの部分を機械的に置き換えると

$${e^x = 1 + ix + \frac{(ix)^2}{2!} + \frac{(ix)^3}{3!} + \frac{(ix)^4}{4!} + … }$$
ここで虚数は2乗すると-1になる値なので
$${e^x = 1 + ix - \frac{x^2}{2!} - \frac{ix^3}{3!} + \frac{x^4}{4!} + \frac{ix^5}{5!} - \frac{x^6}{6!} - \frac{ix^7}{7!} + …}$$
結果的にこのようになり、これを実部と虚部で分けると
$${e^{ix} = (1 - \frac{x^2}{2!} + \frac{x^4}{4!} - \frac{x^6}{6!} + …) + i(x - \frac{x^3}{3!} + \frac{x^5}{5!} - \frac{x^7}{7!} + …)}$$

実部と虚部をそれぞれ分けるとこれはそれぞれ cos と sin のマクローリン展開の形になる事がわかります。

つまり $${ e^{ix} }$$ = cos x + i sin x という形になるのです。
そしてこの式から  $${ e^{iπ} }$$ = cos π + i sin π = -1 となることから
$${ e^{iπ} }$$ = -1 というとてもシンプルな数式が出てきます。
これがかの有名なオイラーの公式!なのでした
e, i, πはいずれもそれぞれ異なる分野で生まれた数であるにも関わらずこのような一つの形で綺麗な数字を出すのはたしかに「世界で最も美しい数式」なのかもしれません。


ここでめっちゃテンションの上がった自分は「数学SUGEEEEEE!!」となったわけです。
もっと若い時にこういう事をちゃんと学ぶべきだった…
(高校時代にやったかどうか記憶も怪しい)

フーリエ変換にはフーリエ複素級数というものがあるのですが、これはこれまでの勉強から単に三角関数の和 cos θ + sin θ を単にオイラーの公式 $${ e^{ix} }$$でコンパクトにしたものであるという事がわかります。
それがわかればフーリエ変換の難しそうな数式も読める気がしてきますね。

改めて虚数を学ぶ

さて、Unity エンジニアであれば クォータニオン はとても馴染みが深い存在ですがクォータニオンは複素数の拡張系です。
複素数は $${ a + i b }$$ という実部と虚部を用いた表現ですが、
クォータニオンは $${ a + i b + j c + k d }$$ と表現されます。
これまで代数学を通して有限体、多項式を用いて拡大された拡大体や群、環、体などの演算構造を知ると「虚数」という概念もまた沢山ある数の一つであると自然に感じるようになりました。
(一昔前は二乗すると-1になるってなんだよ!!わかんねー!となっていた)

これは抽象的な事象を用いた計算や演算の構造を沢山見ることで昔の自分が知らなかった演算の構造を知った事が大きいかもしれません。
私にとって最初の「数学」は実数同士での演算までしか想像できず、それが限界でした。
しかしこれらの数学を理解していくことで「数学は必ずしも実数同士の演算を指すわけではない」という事を理解するようになりました。
数に限らないもっと広い概念同士であっても、規則を満たすのであればそれは「演算」であると考えるようになります。

四元数のより深い理解を目指しリー群を知る

四元数の三次元回転はあるベクトル v を 回転情報を持ったオイラーパラメータ q を用いて回転させる演算です。
(ベクトル v は実部を持たない xi + yj + zk という数として扱い、四元数の演算ルールで演算する)

回転後のベクトルを v' とするなら
$${ v' = q・ v・q^{-1} }$$
と書く事ができます。

四元数は乗法において非可換なので上記の演算順序は変わってはいけません。
四元数は上記の演算を適用する事で回転させることができる!
ことはわかりましたが、じゃあなんでこの順番で演算すると回転させられるんだ?という疑問が出ます。
ここに関してはいろいろ調べていたのですが CEDEC の発表で以下のような資料を見つけます。

ここでリー群とクォータニオンの回転には深いつながりがあることを知ります。
そしてリー群を理解するために多様体を知る必要があり、そのためには位相の理解が不可欠であるため位相空間を学び始めるのでした。

位相空間はまだ勉強中ですが、始めたのは今年の1月からでした。
そしてちょうど1月の中旬ごろから ZBrush の勉強を始めます。
最近は 3DCG の勉強が中心なのであまり数学の勉強が出来ていないのですが、ある程度 ZBrush と Blender の知識が身に付いたらまた数学を開いた時間で勉強したいなと思っています。

その間ブランクができてしまうので、可能な限り忘れないように今後も note のほうに備忘録として記事を書いていきたいと思っています。

最初は暗号への理解から始まった数学ですが、こうやって振り返ると現在の3Dグラフィクス方面にも関係性があり当時学んだ代数学の知識も役立っています。
数学を学べば学ぶほどにありとあらゆるものが数学と結びついているのだなと数学の奥深さをより一層感じます。
まだまだ理解は浅く駆け出しですが、もっと専門性を深めていきたいですね


この記事が気に入ったらサポートをしてみませんか?