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

本文关键字:一样 第一人称视角 绘制 | 更新日期: 2023-09-27 18:30:33

我或多或少已经弄清楚了我的渲染引擎。但我需要添加功能来渲染固定在相机旁边的 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),但对象无处可寻。

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

我终于找到了解决方案。我必须为此创建第二个相机矩阵并应用它,并刷新 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();