分享

实现生成星星,让星星自转和绕原点公转的简单demo。

 imelee 2017-10-24
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;
 
}
 
 
 
}

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多