1. 程式人生 > >使用Android OpenGL ES 2.0繪圖之五:新增運動

使用Android OpenGL ES 2.0繪圖之五:新增運動

        在螢幕上繪製圖像對於OpenGL來說只是一個非常基本的功能,你也可以使用其它的Android圖形框架類來實現,比如使用Canvas和Drawable物件。但是OpenGL ES確有過人之處,它支援在三維空間上移動和變換繪製物件,或以其它獨特的方式來創造極好的使用者體驗。

        在這一節中,將介紹如何使用OpenGL ES為繪製的形狀新增一個旋轉運動的功能。

1旋轉一個形狀

        使用OpenGL ES 2.0旋轉繪製物件也很簡單。先建立另一個變換矩陣(一個旋轉矩陣),然後將它合併到投影和相機檢視變換矩陣就可以了:
private float[] mRotationMatrix = new float[16];  
public void onDrawFrame(GL10 gl) {  
    ...  
    // 為三角形建立一個旋轉變換  
    long time = SystemClock.uptimeMillis() % 4000L;  
    float angle = 0.090f * ((int) time);  
    Matrix.setRotateM(mRotationMatrix, 0, mAngle, 0, 0, -1.0f);  
  
    // 將旋轉矩陣合併到投影和相機檢視矩陣  
    Matrix.multiplyMM(mMVPMatrix, 0, mRotationMatrix, 0, mMVPMatrix, 0);  
  
    // 繪製三角形  
    mTriangle.draw(mMVPMatrix);  
}  
        在對程式做了這些改動之後,如果三角形還是轉不起來,請確認一下是否把GLSurfaceView.RENDERMODE_WHEN_DIRTY設定註釋掉了,其中的緣由將在下一節中描述。

2啟用持續渲染

        說到這裡,你應該在程式碼中註釋掉了只有當資料發生改變時才渲染的渲染模式的程式碼。否則,OpenGL只能旋轉一次,然後等待GLSurfaceView的容器呼叫requestRender()方法:
private float[] mRotationMatrix = new float[16];  
public void onDrawFrame(GL10 gl) {  
    ...  
    // 為三角形建立一個旋轉變換  
    long time = SystemClock.uptimeMillis() % 4000L;  
    float angle = 0.090f * ((int) time);  
    Matrix.setRotateM(mRotationMatrix, 0, mAngle, 0, 0, -1.0f);  
  
    // 將旋轉矩陣合併到投影和相機檢視矩陣  
    Matrix.multiplyMM(mMVPMatrix, 0, mRotationMatrix, 0, mMVPMatrix, 0);  
  
    // 繪製三角形  
    mTriangle.draw(mMVPMatrix);  
}  
        除非你不想讓繪製的物件與使用者互動,否則啟用這個渲染模式是一個很好的做法。現在準備解除去它的註釋了,因為在下一節中會再次用到它。