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

3
我正在尝试在屏幕上定位我的文本模型网格。使用以下代码,它以代码建议的方式绘制网格;将网格的左边绘制于屏幕中心。但是,我想将其定位于屏幕左侧边缘,这就是我卡住的地方。如果取消注释Matrix.translateM行,我认为位置现在将位于屏幕左侧,但似乎位置被缩放了(!?)。
我尝试了一些场景:
a.) 仅Matrix.scaleM(没有Matrix.translateM)= 网格的左侧位置为0.0f(屏幕中心),比例正确。
b.) 仅Matrix.TranslateM(没有Matrix.scaleM)= 网格的左侧位置在屏幕左侧正确地定位为-1.77f,但比例不正确。
c.) 先Matrix.TranslateM然后Matrix.scaleM,或先Matrix.scaleM然后Matrix.TranslateM = 比例正确,但位置不正确。看起来位置被缩放,并且非常接近中心而不是靠近屏幕左侧。
我正在使用OpenGL ES 2.0,在Android Studio编写Java程序。
屏幕边界(从Matrix.orthoM设置) left:-1.77,right:1.77(中心为0.0),top:-1.0,bottom: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);

你尝试过倒序吗?mMVPMatrix = modelMatrix * mMVPMatrix。 - Ed Halferty
在你的情况下,翻译绝对是优先考虑的。正如已经提到的,乘法顺序似乎是错误的。正如MVP的名称所暗示的那样,它是模型视图投影,但你却有投影*模型。当矩阵相乘时,顺序很重要。 - Matic Oblak
谢谢你们两个。Matic,我将其更改为Matrix.translateM,然后是Matrix.scaleM,并且也颠倒了我之前使用的MVP,现在它运行得很好!现在,如何给予应有的荣誉呢? - CoryU
1个回答

3

谢谢Ed Halferty和Matic Oblak,你们都是正确的。正如Matic建议的那样,我现在先放置Matrix.TranslateM,然后放置Matrix.scaleM。我还确保MVPMatrix确实是modelviewprojection,而不是projectionviewmodel

此外,现在使用Matrix.translateM将模型网格移到-1.0f,它位于屏幕左边缘,这比在任何情况下都要好的-1.77f。

正确的位置+缩放,谢谢!

    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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接