java - 用于 fovy 和 aspect 透视的 OpenGL 投影矩阵

标签 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 矩阵会导致我的对象离得更远吗?

最佳答案

您的视锥体实现似乎是正确的。

在您的透视图实现中,fovy 应该改为 fovy/2。

查看此答案:https://stackoverflow.com/a/21064935/3146587

关于java - 用于 fovy 和 aspect 透视的 OpenGL 投影矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21185076/

相关文章:

ios - 在 swift OpenGL 中使用哪种类型的 float ?

c++ - 如何在 GLSL 中使用 RGBA16?

java - 使用 javassist + spring + tomcat 在运行时更改类

java - 显示一个 ArrayList?

c++ - 在 CGAL 中使用时从 geomview 窗口中删除几何对象

c++ - Curl 和 Macosx 10.12

c++ - 在 Visual Studio 2010 中使用 OpenGL - 错误 LNK2019 : unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup

java - 通过蓝牙接听来自 PC 的安卓电话

java - 子类不能应用于父类(super class) Java

python - while (cin >> var) 在 python 中的等价物是什么?