使用fovy和aspect的透视OpenGL投影矩阵

3
我正在制作自己的截锥体(frustum)透视(perspective)实现,部分原因是将来可能需要在没有库的情况下自己完成,并且我想在考试前提高计算机图形技能。
我正在按照一本书上的例子将其从C++转换为Java/LWJGL,但其中一个例子让我困惑,那就是一个立方体的投影。我的立方体被投射得比他们的远得多(大约是两倍?),这很奇怪。
这是我按列主序进行的实现:
public static Matrix4f frustum(final float left, final float right, final float bottom, final float top, final float near, final float far) {
    return new Matrix4f(new float[] {
        2 * near / (right - left),          0.0f,                               0.0f,                           0.0f,   //X column
        0.0f,                               2 * near / (top - bottom),          0.0f,                           0.0f,   //Y column
        (right + left) / (right - left),    (top + bottom) / (top - bottom),    (near + far) / (near - far),    -1.0f,  //Z column
        0.0f,                               0.0f,                               2 * near * far / (near - far),  0.0f    //Z column
    });
}

public static Matrix4f perspective(final float fovy, final float aspect, final float near, final float far) {
    float y2 = near * (float)Math.tan(Math.toRadians(fovy));
    float y1 = -y2;
    float x1 = y1 * aspect;
    float x2 = y2 * aspect;
    return frustum(x1, x2, y1, y2, near, far);
}

我曾经在某个地方看到他们使用类似于我使用的y2,但将其除以2,但是我不想在不确切了解出错原因的情况下进行错误修复。

请有人验证我正在使用的perspective矩阵,并指出其他可能导致我的物体看起来更远的原因?

我已经正确完成了其他矩阵计算,并且只是通过(0f,0f,-4f)平移立方体并验证了这也是正确的。

错误实施的perspective矩阵会导致我的物体距离更远吗?


fovy通常是全景视角,因此0.5存在于此,以便在假定y范围从-tan(fov/2)到+tan(fov/2)时校正正切计算。 - Alnitak
1个回答

1

啊,没错,ymax = znear * tanf(fovyInDegrees * M_PI / 360.0);,我讨厌那个偷偷摸摸地加了 360.0 而不是通常的 180.0 - skiwi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接