我在使用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);
}
问题在于,当我旋转立方体时,矩形也在移动。这与立方体的比例和平移是一样的 - 它正在拉动矩形。
对我而言,看起来矩阵在某处连接但我不知道在哪里,因为首先绘制矩形并稍后覆盖刮痕矩阵。
答案 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);