zoukankan      html  css  js  c++  java
  • 粒子系统

    其运行效果如下所示:



    存储粒子系统中的某个粒子物理信息的类:

    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,即可下载。

  • 相关阅读:
    DELPHI加密字串(异或运算加密)
    delphi 浮点数float转换成十六进制字符串的方法(FloatToHex)
    delphi 浮点数转换成十六进制字符串的方法
    LRC CRC 纵向冗余码校验
    lrc 校验码 ascii 格式
    LRC的效验码的计算方法
    写给嵌入式程序员的循环冗余校验(CRC)算法入门引导
    CRC的校验原理
    CRC校验
    RTU模式与ASCII模式有什么不同
  • 原文地址:https://www.cnblogs.com/Anzhongliu/p/6092082.html
Copyright © 2011-2022 走看看