【问题标题】:Java OpenGL Perspective matrix not workingJava OpenGL透视矩阵不起作用
【发布时间】:2015-03-24 22:55:01
【问题描述】:

我正在尝试使用 LWJGL3 在 Java 中使用 OpenGL 渲染一个简单的三角形。 一切都很好,但投影矩阵(透视)不起作用。在 C++ 中,我只是使用了 glm::perspective() 方法,效果很好。但是在 Java 中,我自己实现了它,因为没有像 GLM 这样的库来处理它。 所以这里是Java透视图的代码:

public mat4 perspective(float fov, float aspect, float zNear, float zFar){
        mat4 projection = new mat4();

        float halfTanFov = (float) Math.tan(Math.toRadians(fov / 2));
        float frustum = zNear - zFar; 

        projection.m[0][0] = 1f / halfTanFov * aspect; 
        projection.m[1][1] = 1f / halfTanFov; 
        projection.m[2][2] = - ((zNear + zFar) / frustum); 
        projection.m[2][3] = 2 * zFar * zNear / frustum; 
        projection.m[3][2] = 1; 

        return projection; 
    }

我创建了mat4 类,这就是我应用乘法的方式:

for(int i=0; i<4; i++)
            for(int j=0; j<4; j++){
                result.m[i][j] = matrix.m[i][0] * m[0][j] + 
                                 matrix.m[i][1] * m[1][j] +
                                 matrix.m[i][2] * m[2][j] +
                                 matrix.m[i][3] * m[3][j];
            }

当然,我测试了这个乘法,并将结果与​​我的 TI 输出进行了比较,效果很好。 其他信息,mat4 类的默认 constructor 将所有值设置为 0。 这是代码:

public void setZero(){
        m[0][0] = 0; m[0][1] = 0; m[0][2] = 0; m[0][3] = 0; 
        m[1][0] = 0; m[1][1] = 0; m[1][2] = 0; m[1][3] = 0; 
        m[2][0] = 0; m[2][1] = 0; m[2][2] = 0; m[2][3] = 0; 
        m[3][0] = 0; m[3][1] = 0; m[3][2] = 0; m[3][3] = 0; 
    }

另一方面,viewMatrix() 运行良好。这是lookAt() 方法的简单实现。 所以当lookAtMatrix * modelMatrix * positionvec4 position 时,结果很好。 但是当我尝试为 MVP 添加投影矩阵时:perspective * lookatMatrix * model * position 结果什么都没有。 在这里我在代码中执行此操作:

public mat4 getViewProjection() {
    mViewProjection = Transform.getInstance().lookAt(mPosition, mPosition.add(mDirection), mUp);
    return mViewProjection;
}
public mat4 getMVP(mat4 model){
    return mPerspective.mult(getViewProjection()).mult(model);
}  

这是我的简单 GLSL 着色器(用于顶点着色器):

#version 430

layout(location=0) in vec3 position; 
uniform mat4 MVP;

void main(void){
    gl_Position = MVP * vec4(position, 1); 
}

我尝试了其他视角的实现但没有成功,所以我猜我的错误在其他地方,但很遗憾,我不知道在哪里。如果有人可以提供帮助,那就太好了!谢谢。 如果你有其他信息,请询问我,我会发布它。

【问题讨论】:

    标签: java opengl matrix lwjgl


    【解决方案1】:

    可能还有其他定义投影矩阵的方法。但至少与我通常与 OpenGL 一起使用的投影矩阵相比,你有几个倒置的符号。在此:

    projection.m[0][0] = 1f / halfTanFov * aspect; 
    projection.m[1][1] = 1f / halfTanFov; 
    projection.m[2][2] = - ((zNear + zFar) / frustum); 
    projection.m[2][3] = 2 * zFar * zNear / frustum; 
    projection.m[3][2] = 1; 
    

    如果您希望相机朝眼睛坐标空间中的 z 轴方向看,这些标志实际上可能没问题。让相机向下看 z 轴更为常见。

    更重要的是,看起来您的矩阵已转置。至少只要您按列主要顺序指定矩阵,这是通常使用 OpenGL 完成的方式,并且看起来与您发布的代码一致。

    有了这两个更正,代码应该是:

    projection.m[0][0] = 1f / halfTanFov * aspect; 
    projection.m[1][1] = 1f / halfTanFov; 
    projection.m[2][2] = (zNear + zFar) / frustum; 
    projection.m[3][2] = 2 * zFar * zNear / frustum; 
    projection.m[2][3] = -1f; 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      • 1970-01-01
      相关资源
      最近更新 更多