2015-05-13 40 views
0

我在使用OpenGL ES 2.0進行適當的場景操作時遇到了一些問題。在我的屏幕上,我想繪製一個矩形和一個立方體。應將矩形移至底部並縮放,同時將立方體移至頂部並縮放。更重要的是,我想在所有3軸上旋轉這個立方體。修改場景中的多個對象時的Android OpenGL es 2.0錯誤

這是我創建至今:

@Override 
    public void onDrawFrame(GL10 gl) { 
     float[] scratch = new float[16]; 
     GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); 

     Matrix.setLookAtM(viewMatrix, 0, 0, 0, -6, 0f, 0f, 0f, 0f, 1.0f, 0.0f); 
     Matrix.multiplyMM(MVPMatrix, 0, projectionMatrix, 0, viewMatrix, 0); 

     Matrix.translateM(scratchMatrix1, 0, 0, -1.1f, 0); 
     Matrix.scaleM(scratchMatrix3, 0, 0.5f, 0.5f, 0.5f); 
     Matrix.multiplyMM(scratchMatrix2, 0, scratchMatrix1, 0, scratchMatrix3, 0); 
     Matrix.multiplyMM(scratch, 0, scratchMatrix2, 0, MVPMatrix, 0); 
     rectangle.draw(scratch); 

     Matrix.setRotateM(scratchMatrix1, 0, angleXVal, 1.0f, 0, 0); 
     Matrix.setRotateM(rotationMatrix, 0, angleYVal, 0, 1.0f, 0); 
     Matrix.multiplyMM(scratchMatrix2, 0, rotationMatrix, 0, scratchMatrix1, 0); 
     Matrix.setRotateM(rotationMatrix, 0, angleZVal, 0, 0, 1.0f); 
     Matrix.multiplyMM(scratchMatrix3, 0, rotationMatrix, 0, scratchMatrix2, 0); 

     Matrix.translateM(scratchMatrix1, 0, 0, 0.3f, 0); 
     Matrix.multiplyMM(scratchMatrix2, 0, scratchMatrix3, 0, scratchMatrix1, 0); 
     Matrix.scaleM(scratchMatrix1, 0, 0.8f, 0.8f, 0.8f); 
     Matrix.multiplyMM(scratchMatrix3, 0, scratchMatrix2, 0, scratchMatrix1, 0); 
     Matrix.multiplyMM(scratch, 0, scratchMatrix2, 0, MVPMatrix, 0); 

     cube.draw(scratch); 
    } 

的問題是,當我旋轉立方體也矩形移動。這與立方體的縮放和平移相同 - 它拉長矩形。

對我來說,它看起來像矩陣連接的地方,但我沒有看到在哪裏,因爲矩形首先被繪製,刮傷矩陣後來被覆蓋。

回答

2

假設您的完整onDrawFrame()代碼,scratchMatrix1等都是從幀到幀保持不變的類成員變量。

這意味着從一個幀的翻譯將繼續到下一個,因爲Matrix.translateM()通過添加到現有的矩陣變換應用翻譯,而不是將矩陣設置爲給定的翻譯矩陣並覆蓋以前的值。所以翻譯會累積多個幀。

這意味着當您翻譯立方體時,翻譯仍將位於scratchMatrix1下一次被調用,並且矩形翻譯將被添加到它而不是重新設置。

Matrix.scaleM()也是如此。

您可以通過在函數的開始初始化所有的劃痕矩陣身份整治,並再次開始多維數據集的計算變換矩陣前:

Matrix.setIdentityM(scratchMatrix1, 0); 
Matrix.setIdentityM(scratchMatrix2, 0); 
Matrix.setIdentityM(scratchMatrix3, 0); 
Matrix.setIdentityM(scratch, 0); 
+0

我不知道這是隻添加不會覆蓋它。那麼只有'Matrix.rotateM()'在這裏覆蓋? – sebap123

+1

multiplyMM和rotateM正在覆蓋。 translateM和scaleM應用於當前值。 – samgak