Matrix OpenGL矩阵缩放然后平移仍在缩放我的位置

Matrix OpenGL矩阵缩放然后平移仍在缩放我的位置,matrix,opengl-es,opengl-es-2.0,matrix-transform,Matrix,Opengl Es,Opengl Es 2.0,Matrix Transform,我试图在屏幕上定位我的文本模型网格。使用下面的代码,它按照代码的建议绘制网格;网格的左侧位于屏幕的中心。但是,我想把它放在屏幕边缘的左边,这就是我被卡住的地方。如果我取消对Matrix.translateM行的注释,我认为该位置现在将位于屏幕的左侧,但似乎该位置正在缩放(!?) 我尝试过几个场景: a、 )Matrix.scaleM only(无Matrix.translateM)=网格左侧的位置为0.0f(屏幕中心),具有正确的比例 b、 )Matrix.TranslateM only(无Ma

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

我尝试过几个场景:

a、 )Matrix.scaleM only(无Matrix.translateM)=网格左侧的位置为0.0f(屏幕中心),具有正确的比例

b、 )Matrix.TranslateM only(无Matrix.scaleM)=网格左侧在屏幕左侧的位置正确,但比例不正确

c、 )Matrix.TranslateM然后是Matrix.scaleM,或Matrix.scaleM然后是Matrix.TranslateM=比例正确,但位置不正确。看起来这个位置是按比例缩放的,比屏幕左侧更靠近中心

我正在用Java在Android Studio编程中使用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放在第二位。我还确保MVP矩阵确实是模型视图投影,而不是投影视图模型

另外,现在将模型网格的Matrix.translateM设置为-1.0f,它位于屏幕的左边缘,在任何情况下都优于-1.77f


你试过倒序吗?mMVPMatrix=modelMatrix*mMVPMatrix?在您的案例中,平移肯定在缩放之前。如前所述,乘法顺序似乎是错误的。正如MVP的名字所暗示的,它是modelviewprojection,但您有projection*model。当矩阵相乘时,顺序很重要。谢谢你们两位。Matic,我把它改成了Matrix.translateM,然后改成了Matrix.scaleM,还改变了我的MVP,现在效果很好!现在,如何给予信用,信用在哪里?
    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);