更新投影矩阵会重置相机的位置吗?

时间:2019-11-21 22:12:50

标签: java opengl lwjgl

我正在使用LWJGL3进行项目,并且正在将JOML用于我的数学库。我正在尝试更新正投影投影矩阵以向相机添加缩放以及处理窗口大小调整,但是当我重新计算投影矩阵时,它将使相机更新,因此这也阻止了放大或缩小时的移动。我不确定为什么要重置位置,因为我没有更改视图矩阵。

为什么会发生这种情况,我该如何解决?

Example Of Problem (GIF)

这是第一次设置后的投影矩阵:

 5.625E-1  0.000E+0  0.000E+0 -0.000E+0
 0.000E+0  1.000E+0  0.000E+0 -0.000E+0
 0.000E+0  0.000E+0 -1.000E+0 -0.000E+0
 0.000E+0  0.000E+0  0.000E+0  1.000E+0

这里是缩放一次后的地方:

2.812E-1  0.000E+0  0.000E+0 -0.000E+0
0.000E+0  5.000E-1  0.000E+0 -0.000E+0
0.000E+0  0.000E+0 -1.000E+0 -0.000E+0
0.000E+0  0.000E+0  0.000E+0  1.000E+0

在这里我设置投影矩阵以进行初始化和更改:

public void setProjection(float left, float right, float bottom, float top) {
    this.projectionMatrix = new Matrix4f().ortho(left, right, bottom, top, -1.0f, 1.0f);
    this.viewProjectionMatrix = projectionMatrix.mul(viewMatrix);
}

在这里,我在调整大小时在这里调用setProjection方法:

private void onResize(WindowResizeEvent e) {
    aspectRatio = e.getAspectRatio();
    camera.setProjection(-aspectRatio * zoomLevel, aspectRatio * zoomLevel, -zoomLevel, zoomLevel);
}

在这里,当放大或缩小时,我将其称为setProjection:

targetZoomLevel -= (float) Input.getScrollY();
if (targetZoomLevel != zoomLevel) {
    zoomLevel = targetZoomLevel;
    camera.setProjection(-aspectRatio * zoomLevel, aspectRatio * zoomLevel, -zoomLevel, zoomLevel);
}

我还尝试过像这样设置投影矩阵后重新计算视图矩阵,但最终仍然得到相同的结果:

public void setProjection(float left, float right, float bottom, float top) {
    this.projectionMatrix = new Matrix4f().ortho(left, right, bottom, top, -1.0f, 1.0f);
    recalculateViewMatrix();
}

private void recalculateViewMatrix() {
    Matrix4f transformationMatrix = new Matrix4f();
    transformationMatrix.identity();
    transformationMatrix.translate(position);
    transformationMatrix.rotate(rotation, new Vector3f(0, 0, 1));

    this.viewMatrix = transformationMatrix.invert();
    this.viewProjectionMatrix = projectionMatrix.mul(viewMatrix);
}

0 个答案:

没有答案