3

I am trying to position my text model mesh on screen. Using the code below, it draws mesh as the code suggests; with the left of the mesh at the center of the screen. But, I would like to position it at the left of edge of the screen, and this is where I get stuck. If I un-comment the Matrix.translateM line, I would think the position will now be at the left of the screen, but it seems that the position is being scaled (!?)

A few scenarios I have tried:

a.) Matrix.scaleM only (no Matrix.translateM) = the left of the mesh is positioned 0.0f (center of screen), has correct scale.

b.) Matrix.TranslateM only (no Matrix.scaleM) = the left of the mesh is positioned -1.77f at the left of screen correctly, but scale incorrect.

c.) Matrix.TranslateM then Matrix.scaleM, or Matrix.scaleM then Matrix.TranslateM = the scale is correct, but position incorrect. It seems the position is scaled and is very much closer to the center than to the left of the screen.

I am using OpenGL ES 2.0 in Android Studio programming in Java.

Screen bounds (as setup from Matrix.orthoM) left: -1.77, right: 1.77 (center is 0.0), top: -1.0, bottom: 1.0 (center is 0.0)

Mesh height is 1.0f, so if no Matrix.scaleM, the mesh takes the entire screen height.

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);
genpfault
  • 51,148
  • 11
  • 85
  • 139
CoryU
  • 163
  • 9
  • Have you tried reversing the order? mMVPMatrix = modelMatrix * mMVPMatrix? – Ed Halferty Nov 11 '15 at 12:07
  • Translation is definitely before the scale in your case. And as already mentioned the multiplication order seems to be wrong. As the name MVP suggest it is model*view*projection but you have projection*model. When multiplying matrices order matters. – Matic Oblak Nov 11 '15 at 14:19
  • Thanks, both of you. Matic, I changed it to Matrix.translateM, then Matrix.scaleM and also reversed the MVP I had, it now works great! Now, how to give credit, where credit is due? – CoryU Nov 11 '15 at 20:27

1 Answers1

3

Thanks, Ed Halferty and Matic Oblak, you are both correct. As Matic suggested, I have now put the Matrix.TranslateM first, then Matrix.scaleM second. I have also ensured that the MVPMatrix is indeed modelviewprojection, and not projectionviewmodel.

Also, now with Matrix.translateM for the model mesh to -1.0f, it is to the left edge of the screen, which is better than -1.77f in any case.

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);
CoryU
  • 163
  • 9