3D 描画の基礎知識
二次元と三次元
三次元空間――それは、我々の生きているこの現実世界に他なりません。
三次元を再現するのがリアルタイム3Dレンダリング
再現した結果、モニタという二次元上に次元が落とされる
ディスプレイで表現する以上これは生じる
擬似的に三次元をシミュレートしても、最終的にはモニタ上の二次元に落とす
奥行きによる前後関係
遠近法による伸縮拡大
などを算出しないといけない
の三次元から二次元への変換を行なう基本的な計算手法はほとんど変わりません。
OpenGL にしても、
DirectX にしても、
WebGL でも
数学の話なので当たり前
座標系には2通りある
z軸をどっちに伸ばすかで2通りがある
すなわち3次元の座標系の軸は2通りある
DirectXとOpenGLでこれが違うので注意
OpenGL 右手
DirectX 左手
座標変換について知る
次元を落とす際に必要な処理として、座標変換がある
座標変換には大きく分けて三種類
これらを正しく組み合わせることで、最終的にモニター上のどの位置にどんなものを描き出すのかが決まります。
https://gyazo.com/7ea7e88d3b7440315a5e62fab97de3e5
身近なものでたとえると、カメラがあります。
三次元の情報を二次元に変換するものの代表例
写真であれ映像であれ、カメラを通すとそれは全て二次元の情報に変換される
最終的には写真や動画として平面上で表現できる形になります
頭のなかでカメラを使っているときをイメージしながら、座標変換について考えてみましょう。
OpenGL の処理系ではこのモデル変換という名称が一般的
DirectX 系ではワールド変換と呼ばれている
モデル変換とは、被写体となる物体が三次元空間のどの位置にあるのかを定義するための座標変換です。現実の世界とは異なり、プログラムのなかの三次元空間には世界の中心の基準となる原点という位置が定義されています。その原点から見て、被写体となるモデルが相対的にどの位置に存在しているのかを知るためにモデル変換が必要になります。
仮に、シミュレートする三次元空間にリンゴがひとつ存在しているとしたら、そのリンゴの存在する位置を定義するためにモデル変換が必要になるわけですね。
ビュー変換では、実際にカメラがどの位置にあるのか、そしてカメラはどこを向いているのかなどを定義します。先ほどのリンゴの話に合わせると、仮に三次元空間にリンゴが存在していたとしてもカメラがそのリンゴに向けられていなければ、リンゴが映し出されることはありませんね。他にも、たとえばカメラとリンゴとの距離が著しく離れていれば、仮にリンゴにカメラが向けられていたとしても映らないかもしれません。
カメラの位置や、その向けられている方角を決めるために行なう座標変換、それがビュー変換というわけです。
射影変換
この変換では、三次元空間のどの領域を撮影するのかなどを定義します。たとえば、横に幅広くパノラマとして撮影するのか、あるいは縦長の映像として撮影するのか、どのくらい遠くまでを撮影するのかなどを定義することができます。
一般的なカメラの場合は、レンズの前にあるもの全てを撮影しますし、どのくらい遠くまで撮影するのかなんて意識することはありませんね。しかし、プログラムが無限に広い空間をシミュレートするのは不可能です。そこで、一番手前はここから、一番遠くはここまで、というシミュレートする領域を決めて処理するわけですね。
プロジェクション変換を行なうことによって、いわゆる遠近法の効果が得られます。近くにあるものは大きく、遠くにあるものは小さく描画されるようになるわけです。
WebGL でプログラムを組んでいく上では、座標系の知識、座標変換の知識が不可欠です。