OpenGL自定义渲染管道:透视矩阵

时间:2013-09-08 00:30:53

标签: opengl matrix 3d lwjgl perspectivecamera

我正在尝试在LWJGL中使用我自己的矩阵显示一个简单的四边形。我一直在寻找一段时间,并找到了一些透视矩阵实现,特别是这两个:

[cot(fov/2)/a 0          0                  0]
[0            cot(fov/2) 0                  0]
[0            0          -f/(f-n)          -1]
[0            0          -f*n/(f-n)         0]

[cot(fov/2)/a 0          0                      0]
[0            cot(fov/2) 0                      0]
[0            0          -(f+n)/(f-n)          -1]
[0            0          -(2*f*n)/(f-n)         0]

这两者都提供了与预期相同的效果(分别来自herehere)。问题在于我理解如何将它乘以模型视图矩阵,然后是顶点,然后将每个x,y和z值除以其w值得到屏幕坐标。更具体地说,如果我将这些中的任何一个乘以模型视图矩阵然后乘以顶点(10,10,0,1),则它给出w = 0。这本身就是一个很大的问题。我总结说矩阵是错误的,或者我完全错过了一些东西。在我的实际测试程序中,顶点甚至不会在屏幕上结束,即使相机位置在(0,0,0)并且没有旋转也会如此。我甚至尝试了许多不同的z值,正面和负面,看它是否只是一个剪裁平面。我在这里错过了什么吗?

编辑:经过大量的检查,我已经缩小了我面临的问题。最大的问题是z轴似乎没有重新映射到我指定的范围(n到f)。当我沿着z轴平移它时,任何物体只是放大或缩小一点,然后当它移过范围[-1,1]时弹出不存在。我认为这也让我更加困惑。我将我的远程飞机设置为100,接近0.1,它的行为与其他任何东西相同。

1 个答案:

答案 0 :(得分:1)

  

这两者都提供了与预期相同的效果

虽然第二个投影矩阵形式非常标准,但第一个产生不同的效果。如果您有z==1w==0,则投影将为:

Matrix 1:-f/(f-n) / -f*n/(f-n) = f / f*n = 1 / n

Matrix 2:-(f+n)/(f-n) / -(2*f*n)/(f-n) = (f+n) / (2*f2n)

结果明显不同。你应该总是使用第二种形式。

  

如果我将这些中的任何一个乘以模型视图矩阵然后乘以顶点   (10,10,0,1),它给出w = 0。这本身就是一个很大的问题   面

对于焦距d,投影计算为(忽略纵横比):

x'= d*x/z = x / w
y'= d*y/z = y / w

其中

w = z / d

如果您有z==0,则表示您想要投射已经在眼中的点,并且只能看到d以外的点。在实践中,此点将被裁剪,因为z不在n(近)和f(远)范围内(n预期为正常数)