我的渲染引擎或多或少被弄清楚了。但是我需要添加一些功能来渲染一个固定在相机旁边的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),并且无法找到该对象。
答案 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();