1. 程式人生 > >初學Android,OpenGL ES之旋轉圖形(八十一)

初學Android,OpenGL ES之旋轉圖形(八十一)

圖形旋轉比較簡單,需要呼叫方法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;
	}
}