标签:
其运行效果如下所示:
存储粒子系统中的某个粒子物理信息的类:
public class SingleGrain { float vx;//x轴速度分量 float vy;//y轴速度分量 float vz;//z轴速度分量 float timeSpan=0;//累计时间 public SingleGrain(float vx,float vy,float vz) { this.vx=vx; this.vy=vy; this.vz=vz; } public void drawSelf() { MatrixState.pushMatrix(); //根据当前时间戳计算出粒子位置 float x=vx*timeSpan; float z=vz*timeSpan; float y=vy*timeSpan-0.5f*timeSpan*timeSpan*1.5f+3.0f; MatrixState.translate(x, y, z); //绘制粒子 GrainGroup.gfd.drawSelf(); MatrixState.popMatrix(); } }
代表粒子系统的类:
public class GrainGroup { //用于绘制的粒子 static GrainForDraw gfd; //所有粒子的列表 ArrayList<SingleGrain> al=new ArrayList<SingleGrain>(); static final float SPEED_SPAN=(float) (1.5f+1.5f*Math.random());//粒子初速度 static final float SPEED=0.02f;//粒子移动每一步的模拟时延,也就是时间戳间隔 public GrainGroup(MySurfaceView mv) { //初始化用于绘制的六个不同颜色的粒子 gfd=new GrainForDraw(4,1,1,1,mv); //随机添加粒子 for(int i=0;i<400;i++) { //随机产生粒子的方位角及仰角 double elevation=0.35f*Math.random()*Math.PI+Math.PI*0.15f;//仰角 double direction=Math.random()*Math.PI*2;//方位角 //计算出粒子在XYZ轴方向的速度分量 float vy=(float)(SPEED_SPAN*Math.sin(elevation)); float vx=(float)(SPEED_SPAN*Math.cos(elevation)*Math.cos(direction)); float vz=(float)(SPEED_SPAN*Math.cos(elevation)*Math.sin(direction)); //创建粒子对像并添加进粒子列表 al.add(new SingleGrain(vx,vy,vz)); } } long timeStamp=0; public void drawSelf() { long currTimeStamp=System.nanoTime()/1000000; if(currTimeStamp-timeStamp>10) { for(SingleGrain sp:al) {//扫描粒子列表,并修改粒子时间戳 sp.timeSpan=sp.timeSpan+SPEED; if(sp.timeSpan>10) { sp.timeSpan=0; } } timeStamp=currTimeStamp; } int size=al.size(); //循环扫描所有粒子的列表并绘制各个粒子 for(int i=0;i<size;i++) { try { al.get(i).drawSelf(); } catch(Exception e){} } } }
下载资源:高级收索——anzhongliu,即可下载。
标签:
原文地址:http://blog.csdn.net/anzhongliu/article/details/45869311