Java LWJGL OpenGL投影矩阵
我正在使用我在lwjgl wiki上为我的VBO多维数据集找到的投影矩阵 它在大多数情况下都很好,但是当谈到我认为的纵横比时,事情开始变得有趣起来 我的应用程序窗口分辨率为640 x 480。当我运行这个程序时,立方体会发生这种情况 你看到的面应该是完全正方形的,相反,它似乎随着纵横比的增加而拉伸 这是我的投影矩阵代码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) {
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结尾。因此,我必须这样做。(浮动)宽度/(浮动)高度?谢谢,这似乎是问题所在,现在已经解决了