OpenGL:如何进行透视投影,其中z=0在视觉上等同于正交投影

OpenGL:如何进行透视投影,其中z=0在视觉上等同于正交投影,opengl,Opengl,假设我有一个2D OpenGL应用程序,它使用一个简单的正交投影,其中(0,0,0)对应于屏幕的左下角,(480640,0)对应于右上角 现在,假设我想让我的2D应用程序有点3D,也就是说,引入一些3D效果,比如从屏幕上方落下的东西。要做到这一点,我需要一个透视投影,在这个透视投影中,通常渲染平面(z=0)上的所有内容看起来都与使用正交投影时相同 有人知道如何创建这样的投影吗?我似乎有点搞不懂数学。大概我希望截头体的远平面是z=0,其中(0,0,0)对应于左下角的像素,但是glFrustum()

假设我有一个2D OpenGL应用程序,它使用一个简单的正交投影,其中(0,0,0)对应于屏幕的左下角,(480640,0)对应于右上角

现在,假设我想让我的2D应用程序有点3D,也就是说,引入一些3D效果,比如从屏幕上方落下的东西。要做到这一点,我需要一个透视投影,在这个透视投影中,通常渲染平面(z=0)上的所有内容看起来都与使用正交投影时相同


有人知道如何创建这样的投影吗?我似乎有点搞不懂数学。大概我希望截头体的远平面是z=0,其中(0,0,0)对应于左下角的像素,但是glFrustum()等人只允许我指定近平面的坐标。如何选择合理的近距离值和远距离值?我尝试过使用glFrustum()和gllookat()从屏幕上方的某个点查看原点,但如何选择眼点呢?

我想我已经解决了。下面的例子对我有用

esMatrixLoadIdentity(projMatrix);
esMatrixLoadIdentity(modelViewMatrix);
float w = screen.width;  // 480
float h = screen.height; // 640
int height = 20;
float nw = w/height;  // width of near plane
float nh = h/height;  // height of near plane
esFrustum(projMatrix, -nw/2, nw/2, -nh/2, nh/2, 1.0f, 1.0f + height);
esMatrixLookAt(modelViewMatrix, 0,0, height, // eye = above the origin 
               0,0, 0,                    // looking at the midpoint on the plane Z=0
               0,1, 0);
esTranslate(modelViewMatrix, -w/2, -h/2, 0); // adjust so (0,0,0) is now bottom left pixel and on the far plane z=0