修改场景中的多个对象时出现Android OpenGL es 2.0错误

时间:2015-05-13 11:33:47

标签: android opengl-es opengl-es-2.0

我在使用OpenGL ES 2.0进行适当的场景操作时遇到了一些问题。在我的屏幕上,我想绘制一个矩形和一个立方体。矩形应移动到底部并缩放,而立方体应移动到顶部并缩放。还有什么,我想在所有3轴上旋转这个立方体。

这是我迄今为止所创造的:

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

问题在于,当我旋转立方体时,矩形也在移动。这与立方体的比例和平移是一样的 - 它正在拉动矩形。

对我而言,看起来矩阵在某处连接但我不知道在哪里,因为首先绘制矩形并稍后覆盖刮痕矩阵。

1 个答案:

答案 0 :(得分:2)

假设这是您的完整onDrawFrame()代码,scratchMatrix1等是类成员变量,这些变量在帧与帧之间持续存在。

这意味着来自一个帧的翻译将延续到下一个,因为Matrix.translateM()通过添加到现有矩阵变换将变换应用于现有矩阵变换,而不是将矩阵设置为给定的平移矩阵并覆盖之前的矩阵变换。值。因此翻译将累积几个帧。

这意味着当您翻译多维数据集时,下次scratchMatrix1被调用时,翻译仍将位于onDrawFrame,并且矩形翻译将被添加到其中而不是重新设置。

Matrix.scaleM()同样如此。

您可以通过在函数开始时初始化所有临时矩阵来进行标识,并在开始计算立方体变换矩阵之前再次对此进行纠正:

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