如何在第一人称视角中绘制近物体? (像一把枪)

时间:2014-11-17 01:14:23

标签: c# opengl opentk

我的渲染引擎或多或少被弄清楚了。但是我需要添加一些功能来渲染一个固定在相机旁边的3d对象(就像拿着枪一样用fps)。

我首先尝试通过进行大量角度计算并将对象(在本例中为立方体)放置在相机将要查看的坐标处的世界中。这没有像我预期的那样有效。

然后我在网上搜索,人们建议在应用相机矩阵之前绘制对象。我一直试图这样做,但没有成功。该对象根本没有出现。

确切的代码段如下:

        camera_matrix = camera.Matrix;
        GL.ClearColor(Color.White);
        GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);

        GL.MatrixMode(MatrixMode.Modelview);
        GL.PushMatrix();
        GL.LoadMatrix(ref camera_matrix);

        foreach (var obj in farobjects)
        {
            GL.PushMatrix();
            GL.Translate(obj.Location);
            obj.Render(camera);
            GL.PopMatrix();
        }
        GL.PopMatrix();

        GL.MatrixMode(MatrixMode.Modelview);
        foreach (var obj in nearobjects)
        {
            GL.PushMatrix();
            GL.LoadIdentity();
            GL.Translate(obj.Location);
            obj.Render(camera);
            GL.PopMatrix();
        }

关于我做错的任何想法?我放置的物体根本没有出现。我尝试将它移动到(1,0,1),(0,0,1)和(1,0,0),并且无法找到该对象。

1 个答案:

答案 0 :(得分:0)

我终于找到了解决方案。我必须为此创建第二个相机矩阵并应用它,以及刷新z缓冲区。

        camera_matrix = camera.Matrix;
        GL.ClearColor(Color.White);
        GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
        GL.MatrixMode(MatrixMode.Modelview);

        GL.PushMatrix();
        GL.LoadMatrix(ref camera_matrix);
        foreach (var obj in farobjects)
        {
            GL.PushMatrix();
            GL.Translate(obj.Location);
            obj.Render(camera);
            GL.PopMatrix();
        }
        GL.PopMatrix();

        GL.Clear(ClearBufferMask.DepthBufferBit);

        GL.PushMatrix();
        Matrix4 modelview = Matrix4.LookAt(Vector3.Zero, Vector3.UnitZ, Vector3.UnitY);
        GL.LoadMatrix(ref modelview);

        foreach (var obj in nearobjects)
        {
            GL.PushMatrix();
            GL.Translate(obj.Location);
            obj.Render(camera);
            GL.PopMatrix();
        }
        GL.PopMatrix();