CGのための数学
CGプログラミングで最もよく使われる数学に線形代数があります.線形代数ではベクトル,行列といったおなじみの要素が入っていますし,行列式もよく使います.
今回はあくまでCGプログラミングを目的としているので,ベクトルの内積や外積などに,ほんの少しCGプログラミングに関する説明を追加しています.
コンピュータグラフィックスでは,様々なところで確率と統計が使用されています.
例えば,レイトレーシングによるレンダリングでは,モンテカルロ法を使って光輸送のシミュレーションを行い,計算を高速に行えます.モンテカルロ法は乱数を使って数値積分を行う方法です.また,物理ベースレンダリングでよく使用されるマイクロファセット反射モデルでは,マイクロファセットの分布に確率が使用されています.他にもシャドウマップの影生成手法には確率を使ってソフトシャドウをシミュレーションするバリアンスシャドウマッピングがあります.このように確率と統計はコンピュータグラフィックスにおいて重要な学問ではあるのですが,扱っている範囲が広く,個人的には難しい印象でしたし,今でもそう感じています.確率・統計は用語が多く,しかも似たような名前も少なくないので,混乱しがちです.そのため,用語は出来るだけ絞っています. 目標はモンテカルロ法によって数値積分できるようになるところです.
フーリエ解析というのは基本的に波を解析する手法です.世の中には様々な波があるわけですが,CGでは特に関係のあるものに光があります.光は電磁波であり波の一種です.光はいろんな波が含まれていて,それを単純な波がどれくらい含まれているか解析するのがフーリエ解析です.そのような作業をスペクトル分析といいます.例えば太陽光をスペクトル分光すると7色の光に分解できます.この分光が自然で起きている現象が虹です.また,プリズムを使えば人為的に分光することができます.
フーリエ解析では高校で学んだ三角関数,複素数,ベクトル,微積分をすべて使うことになります.
物体を回転させるときに,よくXYZの各軸に対して回転値を設定すると思います.これは直感的にわかりやすい方法であり,このような表現を オイラー角表現 といいます.では実際にオイラー角で指定した回転を処理する場合,通常は行列やクォータニオンに変換して計算します.これは行列やクォータニオンが便利な性質を持っているからです.
特にクォータニオンは回転を表すのに行列よりも少ない情報量と計算負荷が軽いといった特徴があります.
ジンバルロックが発生しない
球面線形補間ができる
また,クォータニオンを拡張して回転と平行移動を表すデュアルクォータニオンがあります.これはスキニングで使われています.ここでは,はじめにクォータニオン,その後にデュアルクォータニオンについて扱います. 特に3DCGでは光源から放出された光子(フォトン)が様々な物体に反射・吸収・散乱されて,カメラに入射してくる光子をシミュレーションして画像を生成します.これをレンダリングといいます.このシミュレーションで必要になってくるのが微積分です
半球アンビエント
アンビエントキューブ
テクスチャ焼付け
いずれも対象の周辺からの入射の輝度情報が必要
データが大きいので大幅に圧縮したい
環境マッピング用照度環境マップを用意する
空間城の任意の位置から任意の方向を向いた時の照度を格納
大胆に近似
照度環境マップを級数展開して近似する
球面におけるフーリエ級数展開みたいなものらしい