1. 程式人生 > >OpenGL ES (9): OpenGL ES 新增運動效果-旋轉

OpenGL ES (9): OpenGL ES 新增運動效果-旋轉

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

執行程式,可以看到一個不停轉動的三角形.