具有fovy和aspect的透视OpenGL投影矩阵

时间:2014-01-17 11:40:50

标签: java c++ opengl matrix

我正在制作我的自定义frustumperspective实施,部分原因是我可能需要自己做,没有库,将来,我想要打磨计算机考试前的图形技能。

我正在读一本书,我正在用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矩阵会导致我的对象更远吗?

1 个答案:

答案 0 :(得分:1)

你对视锥的实现似乎是正确的。

在你的透视实现中,fovy应该是fovy / 2。

请参阅此答案:https://stackoverflow.com/a/21064935/3146587