package com.example.zp.rotatestartdemo; import android.opengl.GLSurfaceView; import java.nio.FloatBuffer; import java.nio.IntBuffer; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; /** * Created by lenovo on 2016/9/6. */ public class GLRender implements GLSurfaceView.Renderer{ private int numberStarts =50; private Start [] starts = new Start[numberStarts]; private float deep = 6f; private float maxDist = 4f;//屏幕在deep层能显示的最大横坐标,这里表示的是离原点的最大值 private void init() { //初始化星星 for(int i = 0 ; i < numberStarts ; i++) { float dis = 0.2f*i; int r = (int)(Math.random()*256); int g = (int)(Math.random()*256); int b = (int)(Math.random()*256); float angle =(float)(Math.random())*2f*(float)Math.PI; float rotateSelf = (float)(Math.random())*2f*(float)Math.PI/8f; float rotateElse = (float)(Math.random())*2f*(float)Math.PI/16f; starts[i] = new Start(dis , r , g , b , angle,rotateSelf,rotateElse); } } //三角形 FloatBuffer vertices = BufferUtil.floatToBuffer(new float[]{ -0.025f,0.05f,0f, -0.1f,0.05f,0f, -0.05f,-0.025f,0f, -0.1f,-0.1f,0f, 0f,-0.05f,0f, 0.1f,-0.1f,0f, 0.05f,-0.025f,0f, 0.1f,0.05f,0f, 0.025f,0.05f,0f, 0f,0.1f,0f, -0.025f,0.05f,0f }); //五边形 FloatBuffer vertices2 = BufferUtil.floatToBuffer(new float[]{ -0.025f,0.05f,0f, -0.05f,-0.025f,0f, 0f,-0.05f,0f, -0.025f,0.05f,0f, 0f,-0.05f,0f, 0.025f,0.05f,0f, 0f,-0.05f,0f, 0.05f,-0.025f,0f, 0.025f,0.05f,0f }); @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { gl.glShadeModel(GL10.GL_SMOOTH); // 黑色背景 gl.glClearColor(0, 0, 0, 0); // 设置深度缓存 gl.glClearDepthf(1.0f); // gl.glEnable(GL10.GL_CULL_FACE);//启用这个后,当目前图片转到背面时候就看不到了,意思就是画一个面,只能从正面看到这个面,从背面就看不到,因此不能随便加 // 启用阴影平滑 // 启用深度测试 gl.glEnable(GL10.GL_DEPTH_TEST); gl.glDepthFunc(GL10.GL_LEQUAL); // 告诉系统对透视进行修正 gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); init(); } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { float ratio = (float) width / height; //设置OpenGL场景的大小 gl.glViewport(0, 0, width, height); //设置投影矩阵 gl.glMatrixMode(GL10.GL_PROJECTION); //重置投影矩阵 gl.glLoadIdentity(); // 设置视口的大小 gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10); // 选择模型观察矩阵 gl.glMatrixMode(GL10.GL_MODELVIEW); // 重置模型观察矩阵 gl.glLoadIdentity(); } @Override public void onDrawFrame(GL10 gl) { // 清除屏幕和深度缓存 gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); for(int i = 0 ; i < numberStarts ; i++) { drawStart(gl, starts[i]); } gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); } // float rotateSpeed = 0.3f ; float rotateY = 0; public void drawStart(GL10 gl , Start start) { gl.glLoadIdentity(); gl.glTranslatef(0f, 0.0f, -deep); gl.glRotatef(start.angle, 0f , 0f, 1f);//rotateZ gl.glTranslatef(start.dist*(float)Math.cos(start.angle),start.dist*(float)Math.sin(start.angle), 0); gl.glRotatef(rotateY , 1f , 0f, 0f); float r = (float)(start.r)/255f; float g = (float)start.g/255f; float b = (float)start.b/255f; gl.glColor4f(r,g,b,1f); gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertices); for(int i = 0 ; i <5 ; i ++) { gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,i*2,3); } gl.glFinish(); gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertices2); for(int i = 0 ; i <3 ; i ++) { gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,i*3,3); } gl.glFinish(); if(start.dist>=maxDist) start.IsBigging = false; if(start.dist<=0) start.IsBigging = true; //此处的0.01f代表的是星星公转时候离心和向心运动的速度,即dist的变化速率
if(start.IsBigging) start.dist=start.dist + 0.01f; else start.dist=start.dist - 0.01f; rotateY = rotateY + start.rotateSelf; start.angle = start.angle +start.rotateElse; } }
|
|