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 函数调用的理解是,之后我的相机将在原点上方浮动一个单位,直视原点。所以当我第一次渲染我的绿色方块时,我希望它靠近我的窗口的中心,因为那是原点的位置(它的一个顶点是(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 回答