如何在第一人称视角中绘制近似物体?(像枪一样)
本文关键字:一样 第一人称视角 绘制 | 更新日期: 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();