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 LWJGL OpenGL投影矩阵_Java_Opengl_Glsl_Lwjgl_Projection Matrix - Fatal编程技术网

Java LWJGL OpenGL投影矩阵

Java LWJGL OpenGL投影矩阵,java,opengl,glsl,lwjgl,projection-matrix,Java,Opengl,Glsl,Lwjgl,Projection Matrix,我正在使用我在lwjgl wiki上为我的VBO多维数据集找到的投影矩阵 它在大多数情况下都很好,但是当谈到我认为的纵横比时,事情开始变得有趣起来 我的应用程序窗口分辨率为640 x 480。当我运行这个程序时,立方体会发生这种情况 你看到的面应该是完全正方形的,相反,它似乎随着纵横比的增加而拉伸 这是我的投影矩阵代码 public static Matrix4f perspective(float aspect, float fov, float near, float far) {

我正在使用我在lwjgl wiki上为我的VBO多维数据集找到的投影矩阵

它在大多数情况下都很好,但是当谈到我认为的纵横比时,事情开始变得有趣起来

我的应用程序窗口分辨率为640 x 480。当我运行这个程序时,立方体会发生这种情况

你看到的面应该是完全正方形的,相反,它似乎随着纵横比的增加而拉伸

这是我的投影矩阵代码

public static Matrix4f perspective(float aspect, float fov, float near, float far) {
    Matrix4f matrix = new Matrix4f();

    float y_scale = coTan(degToRad(fov/2f));
    float x_scale = y_scale / aspect;
    float frustum = far-near;

    matrix.m00 = x_scale;
    matrix.m11 = y_scale;
    matrix.m22 = -((far+near)/frustum);
    matrix.m23 = -1;
    matrix.m32 = -((2 * far * near)/frustum);
    matrix.m33 = 0;

    return matrix;
}
这里是我修改和翻译所有矩阵的地方

    Matrix4f.translate(camera.position, camera.matrix(Camera.VIEWMATRIX), 

    Matrix4f.scale(obj.scale, obj.matrix(), obj.matrix());
    Matrix4f.translate(obj.position, obj.matrix(), obj.matrix());
    Matrix4f.rotate(degToRad(obj.rotation.x), new Vector3f(1f,0f,0f), obj.matrix(), obj.matrix());
    Matrix4f.rotate(degToRad(obj.rotation.y), new Vector3f(0f,1f,0f), obj.matrix(), obj.matrix());
    Matrix4f.rotate(degToRad(obj.rotation.z), new Vector3f(0f,0f,1f), obj.matrix(), obj.matrix());
obj.matrix()是modelview矩阵 obj.rotation、object.position和object.scale都是矢量3f camera.matrix(矩阵类型)将返回投影矩阵或视图矩阵

p.S.degToRad和coTan是类似于Math.toRadians和Math.tan的方法

这是顶点着色器

#version 150 core

in vec4 in_Position;
in vec4 in_Color;
in vec2 in_TextureCoord;

uniform mat4 projection; 
uniform mat4 view;
uniform mat4 model;

out vec4 pass_Color;
out vec2 pass_TextureCoord;

void main(void) {
    gl_Position = projection * view * model * in_Position;

    pass_Color = in_Color;
    pass_TextureCoord = in_TextureCoord;
}

如果您需要我的代码的任何其他部分,请留下注释。

快速查看,您的投影矩阵应该正确处理该方面。您确定正确调用了该函数吗?一个常见的错误是将aspect计算为
width/height
,而不考虑这两个都是整数,因此执行整数除法,调用函数时只将结果转换为float,因此在您的场景中以1.0结尾。因此,我必须这样做。(浮动)宽度/(浮动)高度?谢谢,这似乎是问题所在,现在已经解决了