1

我正在尝试在 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]

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

编辑:经过大量检查后,我缩小了我面临的问题。最大的问题是 z 轴似乎没有重新映射到我指定的范围(n 到 f)。当我沿 z 轴平移任何对象时,它只会放大或缩小一点,然后在超出范围 [-1, 1] 时弹出。我想这也让我更加困惑。我将我的远平面设置为 100,将我的近平面设置为 0.1,它的行为就像其他任何东西一样。

4

1 回答 1

1

正如预期的那样,这两者都提供了相同的效果

虽然第二个投影矩阵形式非常标准,但第一个给出了不同的效果。如果你有z==1w==0,投影将是:

矩阵 1:-f/(f-n) / -f*n/(f-n) = f / f*n = 1 / n

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

结果明显不同。您应该始终使用第二种形式。

如果我将其中任何一个乘以模型视图矩阵,然后乘以一个顶点 (10, 10, 0, 1),它就会得到 aw=0。这本身就是一个很大的打击

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

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

在哪里

w = z / d

如果你有z==0这意味着你想投影一个已经在眼睛里的点,只有超出的点d是可见的。在实践中,该点将被剪裁,因为z不在n(近)和f(远)范围内(n预计为正常数)

于 2013-09-08T02:22:46.477 回答