OpenGl\JOML: 缩放矩阵时防止不必要的平移

OpenGl\JOML: Preventing unwanted translation when scaling a matrix

我正在尝试使用 LWJGL 3 和 JOML 将 3D 对象放在 HUD 上。我只是有一个小问题,当我缩放对象时,它会移动。我想防止这种情况发生。

在此图像中,我的对象设置为 (0,0) 的位置(Z 始终设置为 0),比例为 100(所有比例均除以 100,因此比例的实际值为1 当应用于矩阵时。执行此操作的代码如下所示)。 https://i.imgur.com/f8wH7cm.png

然后当我将比例更改为 50(应用于矩阵时为 0.5),显示如下:
https://i.imgur.com/SXWM8nE.png

我希望对象仍然位于屏幕的左上角。

这是我给出真实比例和位置的代码(屏幕尺寸为 1080 x 720)

    public Vector3f getTruePos(){
        return new Vector3f(((position.x/1080) - 0.5), ((position.y/720) + (0.5)), 0);
    }

    public float getTrueScale(){
        return scale/100;
    }

这是我渲染对象的代码。

    public void renderHUD(List<UIObject> objects){
        hudShaderProgram.bind();
        for(UIObject object : objects){
            Mesh mesh = object.getMesh();
            hudShaderProgram.setUniform("projection", transformation.getOrthoProjectionMatrix());
            hudShaderProgram.setUniform("model", transformation.buildModelViewMatrixUI(object));
            mesh.render();
        }
        hudShaderProgram.unbind();
    }

下面是处理对象转换的代码:

    public Matrix4f buildModelViewMatrixUI(UIObject gameItem) {
        Quaternionf rotation = gameItem.getRotation();
        Matrix4f modelMatrix = new Matrix4f();
        modelMatrix.translationRotateScale(gameItem.getTruePos().x, gameItem.getTruePos().y, 0, rotation.x, rotation.y, rotation.z, rotation.w, gameItem.getTrueScale(),
                gameItem.getTrueScale(), gameItem.getTrueScale());
        return modelMatrix;
    }

然后getOrthoProjectionMatrix()returns这样设置的值:

transformation.updateProjectionMatrix(FOV, window.getWidth(), window.getHeight(), Z_NEAR, Z_FAR);

public Matrix4f updateOrthoProjectionMatrix(float left, float right, float bottom, float top, float zNear, float zFar) {
        orthoProjMatrix.identity();
        orthoProjMatrix.setOrtho(left, right, bottom, top, zNear, zFar);
        return orthoProjMatrix;
    }

我不确定我需要做什么才能实现我的愿望。任何帮助将不胜感激。

可在此处找到上述片段的完整代码:
The UIObject class
The Rendering Class
The Transformation class

如果这还不够,请告诉我,我很乐意提供更多。

我设法解决了这个问题。我真的只需要更新我的正投影矩阵。

    public Matrix4f buildOrtho(float left, float right, float bottom, float top){
        Matrix4f orthoProjMatrix = new Matrix4f();
        orthoProjMatrix.setOrtho(left, right, bottom, top, -100, 1000);
        return orthoProjMatrix;
    }

然后我将渲染方法更改为:

    public void renderHUD(Window window, List<UIObject> objects){
        hudShaderProgram.bind();
        Matrix4f orthoProjection = transformation.buildOrtho(0, window.getWidth(), window.getHeight(), 0);
        for(UIObject object : objects){
            Mesh mesh = object.getMesh();
            hudShaderProgram.setUniform("ortho",  orthoProjection);
            hudShaderProgram.setUniform("model", transformation.buildModelViewMatrixUI(object));
            mesh.render();
        }
        hudShaderProgram.unbind();
    }

此外,由于我现在使用的是正确的正射投影,因此我不再需要 getTrueScale()getTruePositon() 方法。