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);
3
  • Have you tried reversing the order? mMVPMatrix = modelMatrix * mMVPMatrix? Commented Nov 11, 2015 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 modelviewprojection but you have projection*model. When multiplying matrices order matters. Commented Nov 11, 2015 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? Commented Nov 11, 2015 at 20:27

1 Answer 1

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);
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.