1

我正在使用我在 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;
}

如果您需要我的代码的任何其他部分,请发表评论。

4

0 回答 0