我正在使用我在 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() 是模型视图矩阵 obj.rotation、object.position 和 object.scale 都是 Vector3f 的 camera.matrix( matrix type ) 要么返回投影矩阵,要么返回视图矩阵
PS 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;
}
如果您需要我的代码的任何其他部分,请发表评论。