java - 我的投影矩阵会出现什么问题,导致立方体完全消失?

标签 java opengl projection-matrix

我一直在关注 YouTube 用户“thebennybox”策划的游戏引擎教程系列,但遇到了问题。立方体网格应该显示在屏幕上,在这个特定的情节中,目标是修复由于不方形的纵横比而导致的对象拉伸(stretch)。然而,当我尝试实现相同的代码时,立方体完全分散了。我已经多次查看了这些 Material ,所以问题要么出在代码的其他部分,要么我还没有发现复制代码时的错误[来自此视频: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;
}

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

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

编辑:我使用 OpenGL 进行渲染,使用 JFrame 作为窗口管理器。

最佳答案

设置矩阵最后一行时出现拼写错误。您应该使用索引 [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;

关于java - 我的投影矩阵会出现什么问题,导致立方体完全消失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56878517/

相关文章:

java - 向 JFrame 上图形中的字符串添加下标和字体

c++ - OpenGL 3.1 上下文创建后的 GL_INVALID_ENUM/GL_INVALID_OPERATION

python - 如何在 python 中计算 OpenCV 相机投影矩阵

ios - 投影矩阵有什么用?

c++ - 带相机旋转的 3d 透视投影

java - 使用传出 HTTP 请求测试 void 方法

java - GZIPInputStream 无法在接收方解码(设置的代码长度无效)

java - 返回与数据结构中存储的时间最接近的时间

c++ - 设置 glutBitmapCharacter() 的颜色?

opengl - 什么是GPU驱动的渲染?