22

OpenGLでスペースを作成することを理解しようとしています:

  1. オブジェクト空間

  2. ワールド空間

  3. カメラスペース

  4. 投影スペース


これらの段階に関する私の理解は正しいですか?

  1. 「立方体」は、直交座標系の中心に作成され、頂点座標を入力することでプログラム内に直接作成されます。

  2. 座標は「ワールド」内の座標に変換されます。つまり、画面上の任意の場所に移動します。

ええと、実際には、これら 2 つの用語についての私の理解を確認していただきたいと思います。


今、黒い画面に三角形を作成しています。openGL コードはこれらのスペースにどのように適合しますか?

GL_MODELVIEWデフォルトではフラグで動作しますが、それは第 2 段階のワールド空間です。これは、呼び出すとglVertex3f()オブジェクト空間に三角形が作成されるということですか?

ワールドスペース部分はどこですか?


また、最後の 2 つのスペースは、openGL パイプライン (またはそれが呼ばれるもの) の一部ではないことを読みました。ただし、OpenGL には、次のようなフラグが含まれていGL_PROJECTIONます。

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0, 0, w, h); // w - width, h - height
gluPerspective(45, ratio, 1, 100); // radio = w/h
glMatrixMode(GL_MODELVIEW);

このコードは何をしますか? それは視点を設定します。z軸を作成しますか?でも、もうオブジェクト空間部分じゃないですか。

4

1 に答える 1

44

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で操作できます)。glLoadMatrixglTranslateglRotateglScale


行ごとに、コードは次のことを行っています。

  1. すべての変換が射影行列に影響を与えるようになりました。
  2. 古い射影行列を消去し、恒等行列に置き換えます。
  3. 画面全体をビューポートとして使用します。
  4. 射影マトリックスを、縦横比 w/h の 45 度の垂直視野、近クリップ面 1 単位、遠クリップ面 100 単位の遠近法に設定します。
  5. すべての変換がモデル ビュー マトリックスに再び影響を与えるようになりました。

Z 軸は既に存在します。これは、パースペクティブを提供する射影行列を設定し、ウィンドウ全体を使用してレンダリングするよう OpenGL に指示するだけです。これはオブジェクト空間ではなく、オブジェクト空間を投影空間に変換する方法です。


また、補足として、あなたは本当に古い OpenGL (1992 年以前) を使用しています。glTranslate などはかなり前に廃止され、現在 API から削除されています。それらを引き続き使用できる唯一の理由は、ドライバーが互換性のためにそれらを保持しているためです。最新の (3.0+) OpenGL の使用を検討することをお勧めします。最新のグラフィックス パイプラインは、即時モード (glBegin、glVertex、glEnd) より数桁高速です。

于 2013-04-25T23:19:54.503 に答える