1) オブジェクト空間は、オブジェクトの原点に対するオブジェクトの頂点です。1x1x1 の立方体の場合、頂点は次のようになります。
( 0.5, 0.5, 0.5)
(-0.5, 0.5, 0.5)
( 0.5, -0.5, 0.5)
(-0.5, -0.5, 0.5)
等
2) ワールド空間は、オブジェクトがワールド内にある場所です。この立方体を にしたい場合は(15, 10)
、変換行列を作成します。これを各頂点で乗算すると、頂点が を中心に配置されます(15, 10)
。たとえば、最初の頂点は になり(15.5, 10.5, 0.5)
ます。オブジェクトからワールド空間に移動する行列は、「モデル」行列と呼ばれます。
3) Eye Space (カメラ空間と呼ばれることもあります) は、視聴者の位置に相対的な世界です。これは、各頂点が乗算される行列でなければならないため、技術的にはカメラの向きの逆になります。つまり、 にカメラが必要な場合(0, 0, -10)
、「ビュー」行列は の翻訳でなければなりません(0, 0, 10)
。そうすれば、世界のすべてのオブジェクトが 10 単位前方にあるため、10 単位後方にいるように見えます。
4) 投影空間は、正しい遠近法をシーンに適用する方法です (正投影を使用していないと仮定します)。これはほとんどの場合、錐台によって表されます。この記事では、私よりもうまく説明できます。基本的に、3D 空間を別の歪んだ空間にマッピングしています。
次に、OpenGL がクリップ スペースとスクリーン スペースを処理します。
GL_MODELVIEW
デフォルトではフラグで動作しますが、それは第 2 段階のワールド空間です。これは、呼び出すとglVertex3f()
オブジェクト空間に三角形が作成されるということですか?
glVertex3f()
オブジェクト スペース内で常に頂点を設定します。(これは実際には非常に古くて遅い方法ですが、それは実際にはこの質問のポイントではありません)
を設定すると、モデル マトリックスが変更されるだけです (これは、、、などGL_MODELVIEW
で操作できます)。glLoadMatrix
glTranslate
glRotate
glScale
行ごとに、コードは次のことを行っています。
- すべての変換が射影行列に影響を与えるようになりました。
- 古い射影行列を消去し、恒等行列に置き換えます。
- 画面全体をビューポートとして使用します。
- 射影マトリックスを、縦横比 w/h の 45 度の垂直視野、近クリップ面 1 単位、遠クリップ面 100 単位の遠近法に設定します。
- すべての変換がモデル ビュー マトリックスに再び影響を与えるようになりました。
Z 軸は既に存在します。これは、パースペクティブを提供する射影行列を設定し、ウィンドウ全体を使用してレンダリングするよう OpenGL に指示するだけです。これはオブジェクト空間ではなく、オブジェクト空間を投影空間に変換する方法です。
また、補足として、あなたは本当に古い OpenGL (1992 年以前) を使用しています。glTranslate などはかなり前に廃止され、現在 API から削除されています。それらを引き続き使用できる唯一の理由は、ドライバーが互換性のためにそれらを保持しているためです。最新の (3.0+) OpenGL の使用を検討することをお勧めします。最新のグラフィックス パイプラインは、即時モード (glBegin、glVertex、glEnd) より数桁高速です。