0
protected override void OnRenderFrame(FrameEventArgs e)
{
        base.OnRenderFrame(e);

        GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);

        Matrix4 modelview = Matrix4.LookAt(0, 0, 1, 
                                           0, 0, 0, 
                                           0, 1, 0);
        GL.MatrixMode(MatrixMode.Modelview);
        GL.LoadMatrix(ref modelview);

        GL.MatrixMode(MatrixMode.Projection);
        GL.LoadIdentity();
        GL.Ortho(0, 320, 0, 480, 1, 2);

        GL.Begin(BeginMode.Quads);

        GL.Color3(0f, .8f, 0f);

        GL.Vertex2(0, 10);
        GL.Vertex2(10, 10);
        GL.Vertex2(10, 0);
        GL.Vertex2(0, 0);

        GL.End();

        SwapBuffers();
    }

LootAt関数の呼び出しについての私の理解は、その後、私のカメラが原点の1ユニット上に浮いて、原点を真下に見下ろすということです。したがって、最初に緑色の正方形をレンダリングしたとき、原点がそこにあるため、ウィンドウの中央近くにあると予想しました(頂点の1つは(0,0)です)。しかし、そうではなく、左下隅のウィンドウにありました。したがって、LoadIdentityとOrthoroが呼び出されたため、すべての頂点がウィンドウの左下隅へのオフセットとしてレンダリングされ、目とカメラの概念が適用されなくなるのではないかと思いました。ただし、目の開始座標をたとえば(2,2)に配置すると、緑色の正方形が平行移動しているように見えます。だから、目/カメラのコンセプトはまだ当てはまると思います。

だから今私は混乱しています...

何が起こっているのか説明してもらえますか?

ありがとう

4

2 に答える 2

1

投影行列を正投影行列(GL.Ortho)に設定すると、パラメーターで指定された画面スペースにすべてがレンダリングされます。

(左、右、下、上、nearVal、farVal);

画面はおそらくこの領域よりも大きいので、これは画面の左下になり、カメラがこの正方形に見えるものをレンダリングします。カメラはその緑色の正方形しか見ることができず、正方形を平行移動するとカメラビューの外側に移動するため、この領域内に完全には描画されません。

画面の中央に描画したい場合は、パラメータを変更してビューポートを移動できます。

于 2011-04-05T02:51:02.723 に答える
0

中心からずれた正投影を作成しました。

   GL.Ortho(left, right, bottom, top, near, far);

   GL.Ortho(0, 320, 0, 480, 1, 2);

つまり、ウィンドウの原点 (0,0) は画面の左下にあります。中央に移動したい場合は、次のようにします。

   GL.Ortho(-160, 160, -240, 240, 1, 2);
于 2011-04-05T20:24:39.683 に答える