2015-11-11 63 views
1

我想將我的文本模型網格放置在屏幕上。使用下面的代碼,它會根據代碼提示繪製網格;網格左側位於屏幕中央。但是,我想將它放在屏幕邊緣左側,這就是我卡住的地方。如果我對Matrix.translateM行取消註釋,我會認爲該位置現在位於屏幕的左側,但似乎該位置正在縮放(!?)OpenGL矩陣縮放然後翻譯仍然縮放我的位置

我嘗試過幾種情況:

a。)Matrix.scaleM only(no Matrix.translateM)=網格的左邊位於0.0f(屏幕的中心),具有正確的比例。

b。)Matrix.TranslateM only(no Matrix.scaleM)=網格的左側在屏幕左側正確定位-1.77f,但縮放不正確。

℃。)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.0 f,所以如果沒有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); 
+0

您是否嘗試過反向排序? mMVPMatrix = modelMatrix * mMVPMatrix? –

+0

翻譯絕對在你的案例中的規模之前。如前所述,乘法順序似乎是錯誤的。正如MVP這個名字表明它是model * view *投影,但是你有投影*模型。矩陣乘法的順序很重要。 –

+0

謝謝,你們倆。馬蒂奇,我將它改爲Matrix.translateM,然後是Matrix.scaleM,同時也扭轉了我的MVP,現在效果很好!現在,如何信貸,信貸到期? – CoryU

回答

0

謝謝你,Ed Halferty和Matic Oblak,你們都是對的。正如馬蒂奇所建議的那樣,我現在先把Matrix.TranslateM放到Matrix.scaleM的第二位。我也確保了MVPMatrix是確實模式視圖投影,而不是投影視圖模式

此外,現在將模型網格的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);