【问题标题】:Setting up OpenGL camera设置 OpenGL 相机
【发布时间】:2016-01-28 07:51:57
【问题描述】:

我无法在 3D 空间中设置相机。

这是我的代码:

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();
    }

【问题讨论】:

  • 仅供参考:SetupViewPort 中的所有内容都属于绘图代码。 OpenGL 的状态机允许您在其他地方设置视口和投影,但从长远来看,这样做只会让人头疼。
  • 一切?我会认为从大约第 5 行向下属于绘图代码。
  • 一切!特别是设置视口。在调整大小处理程序中设置视口是您想要使用帧缓冲区对象时最难的事情。作为一般规则,总是在您需要在绘图代码中设置之前进行完整的视口和投影设置。没有任何相关的成本,因为无论如何都必须为每个绘图批次发送相关的 GPU 命令。
  • 好的,谢谢 datenwolf。知道为什么我会黑屏吗?
  • 很难从您的代码中看出。有几件事浮现在脑海。如果您启用了逆时针背面剔除,那么您指定三角形顶点的顺序将剔除三角形。那么当然loaded 可能是假的。您的近剪切平面位于 z_near=0,您的顶点的 z 坐标也位于 0,这也可能会剪切它们(解决此问题的方法是在 [-1, 1] 中正交 z)

标签: c# opengl graphics 3d opentk


【解决方案1】:

正交投影矩阵和lookAt 视图矩阵不能很好地配合使用。由于您正在绘制 2D,因此只需将 lookAt 矩阵排除在外并使用单位矩阵。

【讨论】:

  • 这个程序是一个测试,因为我打算在更大的 3D 世界中使用这个想法。我真的需要从 3 个维度来解决这个问题 - 抱歉!
  • 好,那就用透视矩阵作为投影矩阵。应该有一个 GLU 的 C# 端口,其函数 gluPerspective 可以解决问题。
  • 我需要使用正交视图来解决我正在解决的问题。我已经用透视矩阵完成了整个事情,但这还不够。
猜你喜欢
  • 2010-12-12
  • 1970-01-01
  • 2013-08-03
  • 1970-01-01
  • 1970-01-01
  • 2017-06-07
  • 1970-01-01
  • 2011-06-06
  • 1970-01-01
相关资源
最近更新 更多