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)处,绿色正方形似乎会翻译。所以这让我觉得眼睛/相机的概念仍然适用。
所以现在我只是困惑......
你能告诉我发生了什么吗?
由于
答案 0 :(得分:1)
如果您将Projection矩阵设置为正交矩阵(GL.Ortho),它会将所有内容渲染到由参数决定的屏幕空间:
(left,right,bottom,top,nearVal,farVal);
您的屏幕可能比这个区域大,所以这将是屏幕的左下角,它会呈现相机可以看到此方块的内容。我正在注意相机只能看到那个绿色方块,当你翻译方块时,它会移到相机视图之外,所以不能完全在这个区域内绘制。
如果要绘制到屏幕中间,可以通过更改参数来移动视口。
答案 1 :(得分: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);