初學Android,OpenGL ES之旋轉圖形(八十一)
阿新 • • 發佈:2019-01-31
圖形旋轉比較簡單,需要呼叫方法glRotatef(float angle,float x,float y,float z),angle是旋轉角度,x,y,z是指的三軸
這個例子在上篇基礎上增加了旋轉,在onDrawFrame(GL10 gl)中增加旋轉角度,圖形就可以不斷的旋轉了
public class MyRenderer implements Renderer { float[] triangleData = new float[] { 0.1f, 0.6f , 0.0f , // 上頂點 -0.3f, 0.0f , 0.0f , // 左頂點 0.3f, 0.1f , 0.0f // 右頂點 }; int[] triangleColor = new int[] { 65535, 0, 0, 0, // 上頂點紅色 0, 65535, 0, 0, // 左頂點綠色 0, 0, 65535, 0 // 右頂點藍色 }; float[] rectData = new float[] { 0.4f, 0.4f , 0.0f, // 右上頂點 0.4f, -0.4f , 0.0f, // 右下頂點 -0.4f, 0.4f , 0.0f, // 左上頂點 -0.4f, -0.4f , 0.0f // 左下頂點 }; int[] rectColor = new int[] { 0, 65535, 0, 0, // 右上頂點綠色 0, 0, 65535, 0, // 右下頂點藍色 65535, 0, 0, 0, // 左上頂點紅色 65535, 65535, 0, 0 // 左下頂點黃色 }; // 依然是正方形的四個頂點,只是順序交換了一下 float[] rectData2 = new float[] { -0.4f, 0.4f , 0.0f, // 左上頂點 0.4f, 0.4f , 0.0f, // 右上頂點 0.4f, -0.4f , 0.0f, // 右下頂點 -0.4f, -0.4f , 0.0f // 左下頂點 }; float[] pentacle = new float[]{ 0.4f , 0.4f , 0.0f, -0.2f , 0.3f , 0.0f, 0.5f , 0.0f , 0f, -0.4f , 0.0f , 0f, -0.1f, -0.3f , 0f }; FloatBuffer triangleDataBuffer; IntBuffer triangleColorBuffer; FloatBuffer rectDataBuffer; IntBuffer rectColorBuffer; FloatBuffer rectDataBuffer2; FloatBuffer pentacleBuffer; private float rotate; public MyRenderer() { // 將頂點位置資料陣列包裝成FloatBuffer; triangleDataBuffer = FloatBuffer.wrap(triangleData); rectDataBuffer = FloatBuffer.wrap(rectData); rectDataBuffer2 = FloatBuffer.wrap(rectData2); pentacleBuffer = FloatBuffer.wrap(pentacle); // 將頂點顏色資料陣列包裝成IntBuffer; triangleColorBuffer = IntBuffer.wrap(triangleColor); rectColorBuffer = IntBuffer.wrap(rectColor); } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { // 關閉抗抖動 gl.glDisable(GL10.GL_DITHER); // 設定系統對透視進行修正 gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); gl.glClearColor(0, 0, 0, 0); // 設定陰影平滑模式 gl.glShadeModel(GL10.GL_SMOOTH); // 啟用深度測試 gl.glEnable(GL10.GL_DEPTH_TEST); // 設定深度測試的型別 gl.glDepthFunc(GL10.GL_LEQUAL); } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { // 設定3D視窗的大小及位置 gl.glViewport(0, 0, width, height); // 將當前矩陣模式設為投影矩陣 gl.glMatrixMode(GL10.GL_PROJECTION); // 初始化單位矩陣 gl.glLoadIdentity(); // 計算透視視窗的寬度、高度比 float ratio = (float) width / height; // 呼叫此方法設定透視視窗的空間大小。 gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10); } // 繪製圖形的方法 @Override public void onDrawFrame(GL10 gl) { // 清除螢幕快取和深度快取 gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); // 啟用頂點座標資料 gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); // 啟用頂點顏色資料 gl.glEnableClientState(GL10.GL_COLOR_ARRAY); // 設定當前矩陣堆疊為模型堆疊, gl.glMatrixMode(GL10.GL_MODELVIEW); // --------------------繪製第一個圖形--------------------- // 重置當前的模型檢視矩陣 gl.glLoadIdentity(); gl.glTranslatef(-0.32f, 0.35f, -1f); // 設定頂點的位置資料 gl.glVertexPointer(3, GL10.GL_FLOAT, 0, triangleDataBuffer); // 設定頂點的顏色資料 gl.glColorPointer(4, GL10.GL_FIXED, 0, triangleColorBuffer); // 根據頂點資料繪製平面圖形 gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3); // --------------------繪製第二個圖形--------------------- // 重置當前的模型檢視矩陣 gl.glLoadIdentity(); gl.glTranslatef(0.6f, 0.8f, -1.5f); gl.glRotatef(rotate, 0f, 0f, 0.1f); // 設定頂點的位置資料 gl.glVertexPointer(3, GL10.GL_FLOAT, 0, rectDataBuffer); // 設定頂點的顏色資料 gl.glColorPointer(4, GL10.GL_FIXED, 0, rectColorBuffer); // 根據頂點資料繪製平面圖形 gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); // --------------------繪製第3個圖形--------------------- // 重置當前的模型檢視矩陣 gl.glLoadIdentity(); gl.glTranslatef(-0.4f, -0.5f, -1.5f); gl.glRotatef(rotate, 0f, 0.2f, 0f); // 設定頂點的位置資料(依然使用之前的頂點顏色) gl.glVertexPointer(3, GL10.GL_FLOAT, 0, rectDataBuffer2); // 根據頂點資料繪製平面圖形 gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); // --------------------繪製第4個圖形--------------------- // 重置當前的模型檢視矩陣 gl.glLoadIdentity(); gl.glTranslatef(0.4f, -0.5f, -1.5f); gl.glRotatef(rotate, 0.2f, 0.2f, 0.2f); // 設定使用純色填充 gl.glColor4f(1.0f, 0.2f, 0.2f, 0.0f); gl.glDisableClientState(GL10.GL_COLOR_ARRAY); // 設定頂點的位置資料 gl.glVertexPointer(3, GL10.GL_FLOAT, 0, pentacleBuffer); // 根據頂點資料繪製平面圖形 gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 5); // 繪製結束 gl.glFinish(); gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); rotate+=1; } }