OpenGL ES (9): OpenGL ES 新增運動效果-旋轉
阿新 • • 發佈:2018-12-15
1.介紹
上一篇文章講到投影檢視矩陣和相機檢視變換,結合成新的矩陣mMVPMatrix傳入給Triangle進行繪製。如下
private final float[] mMVPMatrix = new float[16]; //投影和相機結合的矩陣 private final float[] mProjectionMatrix = new float[16]; //投影矩陣 private final float[] mViewMatrix = new float[16]; //相機檢視變換
這一次新增的旋轉運動效果其實程式碼步驟和上面差不多,這次在渲染器中,再多新增一個新的變換矩陣(旋轉矩陣),然後把它與你的投影與相機檢視變換矩陣合併到一起。
//旋轉矩陣 private float[] mRotationMatrix = new float[16]; public void onDrawFrame(GL10 gl) { //上一篇文章的三個矩陣 Matrix.setLookAtM(mViewMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f); Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0); //新的結合矩陣 float[] scratch = new float[16]; //旋轉的角度 long time = SystemClock.uptimeMillis() % 4000L; float angle = 0.1f * ((int) time); Matrix.setRotateM(mRotationMatrix, 0, angle, 0, 0, -1.0f); //把旋轉矩陣和之前的結合矩陣mMVPMatrix結合生成新的結合矩陣scratch Matrix.multiplyMM(scratch, 0, mMVPMatrix, 0, mRotationMatrix, 0); //傳入新的結合矩陣,並繪製 mTriangle.draw(scratch); }
mTriangle.draw()方法不變,還是和之前一樣。
public void draw(float[] mvpMatrix) { GLES20.glUseProgram(mProgram); mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition"); GLES20.glEnableVertexAttribArray(mPositionHandle); GLES20.glVertexAttribPointer( mPositionHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, vertexStride, vertexBuffer); mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor"); GLES20.glUniform4fv(mColorHandle, 1, color, 0); //處理新的矩陣變換 mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix"); GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0); GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount); GLES20.glDisableVertexAttribArray(mPositionHandle); }
執行程式,可以看到一個不停轉動的三角形.