0

次に、次のコードで OpenGL ビューを初期化します。

glLoadIdentity();
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glClearColor(0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);               
glOrtho(0.0, w, 0.0, h, -1.0, 10.0); 

そして、私はそれが見えるべきであるように見えます。
しかし、そのOthologicalビュー。そして、パースペクティブ ビューが必要です。だから私はそれを初期化しようとします:

glLoadIdentity();
glViewport(0, 0, w, h);
glMatrixMode(GL_MODELVIEW);
glClearColor(0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);               
gluPerspective(60, w/h, 0.1, 100);
glTranslatef(0.0,0.0,-5.0);
4

1 に答える 1

0

私は何を間違っていますか?

あなたの最初の誤解は、「初期化」の観点から考えていることです。OpenGL はステート マシンであり、プログラム全体で必要に応じてステートを設定する必要があります。「初期化」と呼ぶ呼び出しは、実際には描画コードに属します。

2番目:射影行列はOpenGLの一種の「レンズ」であるため、あらゆる種類の射影がそこに属し、そこにのみ適用されますgluPerspective(これはOpenGLの一部ではなく、サードパーティのライブラリであるGLUに適用され、最終的には を呼び出しますglFrustum) .

元のコードでは、オルソ リミットをビューポート サイズに設定しました。つまり、ワールド空間座標レート (0,0) から (幅、高さ) を表示します。そのワールド空間ボリューム内のすべてがビューを埋め尽くします。パースペクティブの場合、Z 軸を中心に対称的に表示ボリュームが得られ、近平面と遠平面に応じて、通常は (-near*aspect, -near) から (+near*aspect, near) のようなものをカバーします。クリッピング プレーンの近く。あなたの場合、それは -0.1,-0.1 から 0.1,0.1 のようなものになります。これは非常に小さなボリュームであり、画像を大幅に拡大するだけです。

これを修正する方法は?

  1. OpenGL の仕組みを理解する
  2. カーゴ カルト プログラミングを停止します。つまり、何が起こっているのかを本当に理解せずに、チュートリアルからコードをコピーして適切に見える場所に貼り付けるだけです。

あなたの場合、実際にその「ここに画像をドロップ」背景の遠近法が必要であると強く疑っていますが、これの上に描かれているものに対してのみです。OpenGL はステート マシンだと言ったことを覚えていますか? その理由は次のとおりです。これら 2 つの描画段階の間で投影を切り替える必要があるためです。

  1. 正投影を使用して背景を描画します
  2. 上に透視投影を使用して、他に必要なものを描画します。
于 2012-07-23T08:39:00.687 に答える