我正在使用我在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' s 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;
}
如果您需要我的代码的任何其他部分,请发表评论。