Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OpenGL透视矩阵不工作_Java_Opengl_Matrix_Lwjgl - Fatal编程技术网

Java OpenGL透视矩阵不工作

Java OpenGL透视矩阵不工作,java,opengl,matrix,lwjgl,Java,Opengl,Matrix,Lwjgl,我正在尝试使用LWJGL3在Java中用OpenGL渲染一个简单的三角形。 一切都很好,但投影矩阵(透视图)不起作用。在C++中,我只是应用了 GLM::PosithVIEW()/Cuth>方法,它的工作效果非常好。但是在Java中,我自己实现了它,因为没有像GLM这样的库来处理它。 下面是Java透视图的代码: public mat4 perspective(float fov, float aspect, float zNear, float zFar){ mat4 proj

我正在尝试使用LWJGL3在Java中用OpenGL渲染一个简单的三角形。 一切都很好,但投影矩阵(透视图)不起作用。在C++中,我只是应用了<代码> GLM::PosithVIEW()/Cuth>方法,它的工作效果非常好。但是在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];
            }
另一方面,
viewMatrix()。这是
lookAt()
方法的简单实现。 因此,当它位于
lookAtMatrix*modelMatrix*position
vec4位置时,结果是好的。
但是当我尝试为MVP添加投影矩阵时:
perspective*lookatMatrix*model*position
结果是什么都没有。 我在代码中这样做的地方:

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; 
    }
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着色器(用于顶点着色器):

我尝试了透视图的其他实现,但没有成功,所以我想我的错误在其他地方,但遗憾的是,我不知道在哪里。如果有人能帮忙,那就太好了!非常感谢。
如果您需要其他信息,请询问我,我将发布。

可能还有其他定义投影矩阵的方法。但至少与我通常在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; 
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;