OpenGL Matrix scale then Translate 仍在缩放我的位置

OpenGL Matrix scale then Translate is still scaling my position

我正在尝试在屏幕上定位我的文本模型网格。使用下面的代码,它按照代码建议绘制网格;网格的左侧位于屏幕的中央。但是,我想将它放在屏幕边缘的左侧,这就是我被卡住的地方。如果我取消注释 Matrix.translateM 行,我认为该位置现在将位于屏幕左侧,但似乎该位置正在缩放 (!?)

我尝试过的几个场景:

a.) Matrix.scaleM only (no Matrix.translateM) = 网格左侧位于 0.0f(屏幕中心),具有正确的规模。

b.) Matrix.TranslateM only (no Matrix.scaleM) = 网格左侧正确定位在屏幕左侧 -1.77f,但比例不正确。

c.) Matrix.TranslateM 然后 Matrix.scaleM,或者 Matrix.scaleM 然后 Matrix.TranslateM = 比例正确,但位置不正确。 位置似乎被缩放了,并且比屏幕左侧更靠近中心。

我在 Android Studio 编程 Java 中使用 OpenGL ES 2.0。

屏幕边界(来自 Matrix.orthoM 的设置) 左:-1.77,右:1.77(中心为 0.0),上:-1.0,下:1.0(中心为 0.0)

网格高度为1.0f,所以如果没有Matrix.scaleM,网格占据整个屏幕高度。

float ratio = (float) 1920.0f / 1080.0f;

float scale = 64.0f / 1080.0f; // 64px height to projection matrix

Matrix.setIdentityM(modelMatrix, 0);
Matrix.scaleM(modelMatrix, 0, scale, scale, scale); // these two lines
//Matrix.translateM(modelMatrix, 0, -ratio, 0.0f, 0.0f); // these two lines

Matrix.setIdentityM(mMVPMatrix, 0);
Matrix.orthoM(mMVPMatrix, 0, -ratio, ratio, -1.0f, 1.0f, -1.0f, 1.0f);

Matrix.multiplyMM(mMVPMatrix, 0, mMVPMatrix, 0, modelMatrix, 0);

谢谢 Ed Halferty 和 Matic Oblak,你们都是对的。正如 Matic 所建议的,我现在将 Matrix.TranslateM 放在第一位,然后是 Matrix.scaleM 第二位。我还确保 MVPMatrix 是 indeed modelviewprojection,而不是 投影视图模型.

此外,现在模型网格 Matrix.translateM 为 -1.0f,它位于屏幕的左边缘,无论如何都比 -1.77f 好。

Correct position + scale, thanks!

    float ratio = (float) 1920.0f / 1080.0f;

    float scale = 64.0f / 1080.0f;

    Matrix.setIdentityM(modelMatrix, 0);
    Matrix.translateM(modelMatrix, 0, -1.0f, 0.0f, 0.0f);
    Matrix.scaleM(modelMatrix, 0, scale, scale, scale);

    Matrix.setIdentityM(mMVPMatrix, 0);
    Matrix.orthoM(mMVPMatrix, 0, -ratio, ratio, -1.0f, 1.0f, -1.0f, 1.0f);

    Matrix.multiplyMM(mMVPMatrix, 0, modelMatrix, 0, mMVPMatrix, 0);