2016-01-25 69 views
1

我在3D空间中设置我的相机时遇到问题。设置OpenGL相机

这里是我的代码:

private void SetupViewPort() 
    { 
     GL.Viewport(0, 0, glControl1.Width, glControl1.Height); 
     GL.MatrixMode(MatrixMode.Projection); 
     GL.LoadIdentity(); 
     GL.Ortho(0, 1000,0,1000, 0, 1); 

     GL.MatrixMode(MatrixMode.Modelview); 
     GL.LoadIdentity(); 

     Vector3d eyePos = new Vector3d(0, 0, 1); 
     Vector3d point = new Vector3d(500, 500, 0.01); 
     Vector3d up = new Vector3d(0, 0 , 1); 
     Matrix4d mat = Matrix4d.LookAt(eyePos, point, up); 
     //mat.Invert(); 
     GL.LoadMatrix(ref mat); 

    } 

我期待看到我画到2D平面形状。但我每次都会看到一个空白屏幕。

这里就是我的形状绘制代码:

private void glControl1_Paint(object sender, PaintEventArgs e) 
    { 
     if (!loaded) 
      return; 
     GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); 
     GL.Enable(EnableCap.DepthTest); 
     GL.DepthMask(true); 
     GL.ClearDepth(1.0); 
     GL.Color3(Color.Yellow); 
     GL.Begin(PrimitiveType.Triangles); 

     GL.Vertex2(0, 0); 
     GL.Vertex2(0, 600); 
     GL.Vertex2(600, 600); 
     GL.Vertex2(100, 100); 
     GL.Vertex2(50, 70); 
     GL.Vertex2(200, 100); 

     GL.End(); 

     glControl1.SwapBuffers(); 
    } 
+0

供参考:您在'SetupViewPort'中拥有的所有东西都属于绘图代码。 OpenGL的状态机能让你在其他地方设置视口和投影,但从长远来看,这只会让人头疼。 – datenwolf

+0

一切?我想从第5行开始往下看是属于绘图代码的。 –

+0

一切!尤其是设置视口。在调整大小处理程序中设置视口是您想要使用帧缓冲区对象时最困难的部分。作为一般规则,*总是*在您需要在绘图代码中设置完整视口和投影设置之前。没有任何成本与其相关,因为无论如何,必须为每个绘图批次发送相关的GPU命令。 – datenwolf

回答

0

的正交投影矩阵和的lookAt视图矩阵不玩好起来。由于您正在绘制2D,只需将lookAt矩阵留出并使用单位矩阵。参考文献:

+0

这个程序是一个测试,因为我打算在更大的3D世界中使用这个想法。我真的需要从三个方面来理解 - 对不起! –

+0

好的,然后使用透视矩阵作为投影矩阵。 应该有一个GLU的C#端口的功能gluPerspective这个技巧。 – FLUXparticle

+0

我需要对正在解决的问题使用拼字法视图。我已经用透视矩阵完成了整个事情,但这不够。 –