Android:OpenGL ES现实3D动画_小安空间_新浪博客,小安空间,
</blockquote> <blockquote>public class GLRender implements Renderer { <wbr />public static final int <wbr />num <wbr />= 50; <wbr /> <wbr /> <wbr /> <wbr /> <wbr />// 星星数目 <wbr />boolean <wbr /> <wbr /> <wbr /> <wbr /> <wbr />twinkle = true; <wbr /> <wbr /> <wbr /> <wbr /> <wbr />// 闪烁的星星 <wbr />boolean <wbr /> <wbr /> <wbr /> <wbr /> <wbr />key; <wbr />public Star[] <wbr /> <wbr /> <wbr />star <wbr /> <wbr />= new Star[num]; <wbr />// 存放星星的数组 <wbr />float <wbr /> <wbr /> <wbr /> <wbr /> <wbr />zoom <wbr /> <wbr />= -10.0f; <wbr /> <wbr /> <wbr /> <wbr />// 星星离观察者的距离 <wbr />float <wbr /> <wbr /> <wbr /> <wbr /> <wbr />tilt <wbr /> <wbr />= 90.0f; <wbr /> <wbr /> <wbr /> <wbr />// 星星的倾角 <wbr />float <wbr /> <wbr /> <wbr /> <wbr /> <wbr />spin; <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr />// 闪烁星星的自转 <wbr /> <wbr />int one = 0x10000; <wbr />Random random = new Random(); <wbr />int <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr />texture; <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr />// 纹理 <wbr /> <wbr />IntBuffer coord = IntBuffer.wrap(new int[]{ <wbr /> <wbr /> <wbr />0,0, <wbr /> <wbr /> <wbr />one,0, <wbr /> <wbr /> <wbr />one,one, <wbr /> <wbr /> <wbr />0,one, <wbr />}); <wbr />IntBuffer vertexs = IntBuffer.wrap(new int[]{ <wbr /> <wbr /> <wbr />-one,-one,0, <wbr /> <wbr /> <wbr />one,-one,0, <wbr /> <wbr /> <wbr />one,one,0, <wbr /> <wbr /> <wbr />-one,one,0, <wbr />}); <wbr />ByteBuffer indices = ByteBuffer.wrap(new byte[]{ <wbr /> <wbr /> <wbr />1, 0, 2, 3 <wbr />}); <wbr /> <wbr />@Override <wbr />public void onDrawFrame(GL10 gl) <wbr />{ <wbr /> <wbr /> <wbr /> <wbr />gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);// 清除屏幕和深度缓存 <wbr /> <wbr />gl.glBindTexture(GL10.GL_TEXTURE_2D, texture); <wbr /> <wbr />// 选择纹理 <wbr /> <wbr />for (int i=0; i<num; i++) <wbr /> <wbr /> <wbr /> <wbr />// 循环设置所有的星星 <wbr /> <wbr />{ <wbr /> <wbr /> <wbr />gl.glLoadIdentity(); <wbr /> <wbr /> <wbr /> <wbr />// 绘制每颗星星之前,重置模型观察矩阵 <wbr /> <wbr /> <wbr />gl.glTranslatef(0.0f,0.0f,zoom); <wbr /> <wbr /> <wbr />// 深入屏幕里面 <wbr /> <wbr /> <wbr />gl.glRotatef(tilt,1.0f,0.0f,0.0f); <wbr /> <wbr /> <wbr />// 倾斜视角 <wbr /> <wbr /> <wbr />gl.glRotatef(star[i].angle,0.0f,1.0f,0.0f); <wbr />// 旋转至当前所画星星的角度 <wbr /> <wbr /> <wbr />gl.glTranslatef(star[i].dist,0.0f,0.0f); <wbr />// 沿X轴正向移动 <wbr /> <wbr /> <wbr />gl.glRotatef(-star[i].angle,0.0f,1.0f,0.0f); <wbr />// 取消当前星星的角度 <wbr /> <wbr /> <wbr />gl.glRotatef(-tilt,1.0f,0.0f,0.0f); <wbr /> <wbr />// 取消屏幕倾斜 <wbr /> <wbr /> <wbr />//设置定点数组 <wbr /> <wbr /> <wbr />gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); <wbr /> <wbr /> <wbr />//设置颜色数组 <wbr /> <wbr /> <wbr />gl.glEnableClientState(GL10.GL_COLOR_ARRAY); <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr />gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr />if (twinkle) <wbr /> <wbr /> <wbr /> <wbr /> <wbr />// 启用闪烁效果 <wbr /> <wbr /> <wbr />{ <wbr /> <wbr /> <wbr /> <wbr />// 使用byte型数值指定一个颜色 <wbr /> <wbr /> <wbr /> <wbr />gl.glColor4f((float)star[(num-i)-1].r/255.0f,(float)star[(num-i)-1].g/255.0f,(float)star[(num-i)-1].b/255.0f,1.0f); <wbr /> <wbr /> <wbr /> <wbr />gl.glVertexPointer(3, GL10.GL_FIXED, 0, vertexs); <wbr /> <wbr /> <wbr /> <wbr />gl.glTexCoordPointer(2, GL10.GL_FIXED, 0, coord); <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr />{ <wbr /> <wbr /> <wbr /> <wbr /> <wbr />coord.position(0); <wbr /> <wbr /> <wbr /> <wbr /> <wbr />vertexs.position(0); <wbr /> <wbr /> <wbr /> <wbr /> <wbr />indices.position(0); <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr />gl.glDrawElements(GL10.GL_TRIANGLE_STRIP, 4, GL10.GL_UNSIGNED_BYTE, indices); <wbr /> <wbr /> <wbr /> <wbr />} <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> //绘制结束 <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> gl.glFinish(); <wbr /> <wbr /> <wbr />} <wbr /> <wbr /> <wbr />gl.glRotatef(spin,0.0f,0.0f,1.0f); <wbr /> <wbr /> <wbr />// 绕z轴旋转星星 <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr />// 使用byte型数值指定一个颜色 <wbr /> <wbr /> <wbr />gl.glColor4f((float)star[(num-i)-1].r/255.0f,(float)star[(num-i)-1].g/255.0f,(float)star[(num-i)-1].b/255.0f,1.0f); <wbr /> <wbr /> <wbr />gl.glVertexPointer(3, GL10.GL_FIXED, 0, vertexs); <wbr /> <wbr /> <wbr />gl.glTexCoordPointer(2, GL10.GL_FIXED, 0, coord); <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr />{ <wbr /> <wbr /> <wbr /> <wbr />coord.position(0); <wbr /> <wbr /> <wbr /> <wbr />vertexs.position(0); <wbr /> <wbr /> <wbr /> <wbr />indices.position(0); <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr />gl.glDrawElements(GL10.GL_TRIANGLE_STRIP, 4, GL10.GL_UNSIGNED_BYTE, indices); <wbr /> <wbr /> <wbr />} <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> //绘制正方形结束 <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> gl.glFinish(); <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> gl.glDisableClientState(GL10.GL_COLOR_ARRAY); <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> //取消顶点数组 <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr />spin+=0.01f; <wbr /> <wbr /> <wbr /> <wbr /> <wbr />// 星星的公转 <wbr /> <wbr /> <wbr />star[i].angle+=(float)(i)/(float)num; <wbr /> <wbr />// 改变星星的自转角度 <wbr /> <wbr /> <wbr />star[i].dist-=0.01f; <wbr /> <wbr /> <wbr /> <wbr />// 改变星星离中心的距离 <wbr /> <wbr /> <wbr />if (star[i].dist<0.0f) <wbr /> <wbr /> <wbr />// 星星到达中心了么 <wbr /> <wbr /> <wbr />{ <wbr /> <wbr /> <wbr /> <wbr />star[i].dist+=5.0f; <wbr /> <wbr /> <wbr />// 往外移5个单位 <wbr /> <wbr /> <wbr /> <wbr />star[i].r=random.nextInt(256); <wbr /> <wbr />// 赋一个新红色分量 <wbr /> <wbr /> <wbr /> <wbr />star[i].g=random.nextInt(256); <wbr /> <wbr />// 赋一个新绿色分量 <wbr /> <wbr /> <wbr /> <wbr />star[i].b=random.nextInt(256); <wbr /> <wbr />// 赋一个新蓝色分量 <wbr /> <wbr /> <wbr />} <wbr /> <wbr />} <wbr />} <wbr />@Override <wbr />public void onSurfaceChanged(GL10 gl, int width, int height) <wbr />{ <wbr /> <wbr />float ratio = (float) width / height; <wbr /> <wbr />//设置OpenGL场景的大小 <wbr /> <wbr />gl.glViewport(0, 0, width, height); <wbr /> <wbr />//设置投影矩阵 <wbr /> <wbr />gl.glMatrixMode(GL10.GL_PROJECTION); <wbr /> <wbr />//重置投影矩阵 <wbr /> <wbr />gl.glLoadIdentity(); <wbr /> <wbr />// 设置视口的大小 <wbr /> <wbr />gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10); <wbr /> <wbr />// 选择模型观察矩阵 <wbr /> <wbr />gl.glMatrixMode(GL10.GL_MODELVIEW); <wbr /> <wbr /> <wbr />// 重置模型观察矩阵 <wbr /> <wbr />gl.glLoadIdentity(); <wbr />} <wbr />@Override <wbr />public void onSurfaceCreated(GL10 gl, EGLConfig config) <wbr />{ <wbr /> <wbr />gl.glShadeModel(GL10.GL_SMOOTH); <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr />// 启用阴影平滑 <wbr /> <wbr />gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); <wbr /> <wbr /> <wbr /> <wbr /> <wbr />// 黑色背景 <wbr /> <wbr />gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); <wbr /> <wbr /> <wbr />// 告诉系统对透视进行修正 <wbr /> <wbr /> <wbr /> <wbr />IntBuffer buffer = IntBuffer.allocate(1); <wbr /> <wbr />// 创建一个纹理 <wbr /> <wbr />gl.glGenTextures(1, buffer); <wbr /> <wbr />texture = buffer.get(); <wbr /> <wbr />// 创建一个线性滤波纹理 <wbr /> <wbr />gl.glBindTexture(GL10.GL_TEXTURE_2D, texture); <wbr /> <wbr />gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); <wbr /> <wbr />gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); <wbr /> <wbr />GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, GLImage.mBitmap, 0); <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr />gl.glEnable(GL10.GL_TEXTURE_2D); <wbr /> <wbr /> <wbr /> <wbr />// 启用纹理映射 <wbr /> <wbr />gl.glShadeModel(GL10.GL_SMOOTH); <wbr /> <wbr /> <wbr /> <wbr />// 启用阴影平滑 <wbr /> <wbr />gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f); <wbr /> <wbr /> <wbr />// 黑色背景 <wbr /> <wbr />gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); <wbr />// 真正精细的透视修正 <wbr /> <wbr />gl.glBlendFunc(GL10.GL_SRC_ALPHA,GL10.GL_ONE); <wbr /> <wbr /> <wbr />// 设置混色函数取得半透明效果 <wbr /> <wbr />gl.glEnable(GL10.GL_BLEND); <wbr /> <wbr /> <wbr /> <wbr /> <wbr />// 启用混色 <wbr /> <wbr />for (int i=0; i<num; i++) <wbr /> <wbr /> <wbr /> <wbr />// 创建循环设置全部星星 <wbr /> <wbr />{ <wbr /> <wbr /> <wbr />Star starTMP = new Star(); <wbr /> <wbr /> <wbr />starTMP.angle=0.0f; <wbr /> <wbr /> <wbr /> <wbr />// 所有星星都从零角度开始 <wbr /> <wbr /> <wbr />starTMP.dist=((float)(i)/(float)num)*5.0f; <wbr /> <wbr />// 计算星星离中心的距离 <wbr /> <wbr /> <wbr />starTMP.r=random.nextInt(256); <wbr /> <wbr /> <wbr />// 为star[loop]设置随机红色分量 <wbr /> <wbr /> <wbr />starTMP.g=random.nextInt(256); <wbr /> <wbr /> <wbr />// 为star[loop]设置随机红色分量 <wbr /> <wbr /> <wbr />starTMP.b=random.nextInt(256); <wbr /> <wbr /> <wbr />// 为star[loop]设置随机红色分量 <wbr /> <wbr /> <wbr />star[i] = starTMP; <wbr /> <wbr />} <wbr />} <wbr />public boolean onKeyUp(int keyCode, KeyEvent event) <wbr />{ <wbr /> <wbr />twinkle=!twinkle; <wbr /> <wbr />return false; <wbr />} } class Star { <wbr />int <wbr /> <wbr />r, g, b; <wbr />// 星星的颜色 <wbr />float <wbr />dist; <wbr /> <wbr />// 星星距离中心的距离 <wbr />float <wbr />angle <wbr />= 0.0f;// 当前星星所处的角度 } <wbr /> public class MainActivity extends Activity { <wbr />GLRender render = new GLRender(); <wbr />@Override <wbr />public void onCreate(Bundle savedInstanceState) <wbr />{ <wbr /> <wbr />super.onCreate(savedInstanceState); <wbr /> <wbr />GLImage.load(this.getResources()); <wbr /> <wbr />GLSurfaceView glView = new GLSurfaceView(this); <wbr /> <wbr /> <wbr /> <wbr />glView.setRenderer(render); <wbr /> <wbr />setContentView(glView); <wbr />} } class GLImage { <wbr />public static Bitmap mBitmap; <wbr />public static void load(Resources resources) <wbr />{ <wbr /> <wbr />mBitmap = BitmapFactory.decodeResource(resources, R.drawable.star); <wbr />} }