我的投影矩阵会导致多维数据集完全消失,这是什么问题?

时间:2019-07-03 22:11:53

标签: java opengl projection-matrix

我一直在关注YouTuber“ thebennybox”策划的Game Engine教程系列,但遇到了问题。应该在屏幕上显示一个立方体网格,并且在此特定情节中,目标是由于纵横比不固定而固定对象的延伸。但是,当我尝试实现相同的代码时,多维数据集将完全分散。我已多次阅读材料,所以问题出在代码的其他部分,或者我尚未发现我在复制代码方面的错误(来自此视频:https://youtu.be/cgaixZEaDCg]

实施矩阵透视图之前的代码:

public void render() 
{
    shader.bind();
    shader.setUniform("transform", transform.getTransformation());
    mesh.draw();
}

之后:

public void render() 
{
    shader.bind();
    shader.setUniform("transform", transform.getProjectedTransformation());
    mesh.draw();
} 

这个新的转换过程“ getPerspectiveTransformation()”看起来像 这个:

public Matrix4f getProjectedTransformation()
{
    Matrix4f transformationMatrix = getTransformation();
    Matrix4f projectionMatrix = new Matrix4f().initProjection(fov, width, height, zNear, zFar);

    return projectionMatrix.mul(transformationMatrix);
}

随后在Matrix4f上调用“ initProjection”以及我知道的正常“ getTransformation”过程就可以单独工作:

public Matrix4f initProjection(float fov, float width, float height, float zNear, float zFar)
{
    float ar = width/height;
    float tanHalfFOV = (float)Math.tan(Math.toRadians(fov / 2));
    float zRange = zNear - zFar;

    m[0][0] = 1.0f / (tanHalfFOV * ar); m[0][1] = 0;                    m[0][2] = 0;    m[0][3] = 0;
    m[1][0] = 0;                        m[1][1] = 1.0f / tanHalfFOV;    m[1][2] = 0;    m[1][3] = 0;
    m[2][0] = 0;                        m[2][1] = 0;                    m[2][2] = (-zNear - zFar)/zRange;   m[2][3] = 2 * zFar * zNear / zRange;
    m[2][0] = 0;                        m[2][1] = 0;                    m[2][2] = 1;    m[2][3] = 0;

    return this;
}

我不认为问题出在两个矩阵相乘并返回的顺序中(代码的第三块),而且我无法推断出问题出在代码的哪一部分源自。

如果您有调试建议或认为问题出在我未包括的基本代码中,那么我将提供其他任何块。

编辑:我正在使用OpenGL进行渲染,并使用JFrame进行窗口管理。

1 个答案:

答案 0 :(得分:0)

设置矩阵的最后一行时出现错字。您应该使用索引[3],但要重新使用索引[2]

您的矩阵应为:

m[0][0] = 1.0f / (tanHalfFOV * ar); m[0][1] = 0;                    m[0][2] = 0;    m[0][3] = 0;
m[1][0] = 0;                        m[1][1] = 1.0f / tanHalfFOV;    m[1][2] = 0;    m[1][3] = 0;
m[2][0] = 0;                        m[2][1] = 0;                    m[2][2] = (-zNear - zFar)/zRange;   m[2][3] = 2 * zFar * zNear / zRange;
m[3][0] = 0;                        m[3][1] = 0;                    m[3][2] = 1;    m[3][3] = 0;