(十三)利用processing模拟粒子系统

模拟粒子系统,粒子的组成,粒子系统的组成,粒子系统的多样性;

粒子的设计:

class Particle{
  PVector location;               //粒子的位置
  PVector velocity;               //粒子的速度
  PVector acceleration;           //粒子的加速度
  float mass;                     //粒子的质量
  float lifespan;                 //粒子的生命周期
  
  float R = random(255);          //粒子的颜色
  float G = random(255);
  float B = random(255);
  //粒子的初始化方式,给定位置的初始化,和随机位置的初始化
  Particle(){
    location = new PVector(random(width), random(height));
    velocity = new PVector(random(-1, 1), random(-2, 0));
    acceleration = new PVector(0, 0);
    mass = 1;
    lifespan = 255;
  }
  Particle(PVector l){
    location = l.get();
    acceleration = new PVector(0, 0);
    velocity = new PVector(random(-1, 1),random(-2, 0));
    mass = 1;
    lifespan = 255;
  }
  void applyForce(PVector force){
    acceleration.add(PVector.div(force, mass));
  }
  void update(){
    velocity.add(acceleration);
    location.add(velocity);
    acceleration.mult(0);
    lifespan -= 1.0;
  }
  void display(){
    stroke(R,G,B,lifespan);
    fill(R,G,B,lifespan);
    ellipse(location.x, location.y, 8, 8);
  }
  boolean isDead(){
    if(lifespan < 0.0){
      return true;
    }else{
      return false;
    }
  }
  void run(){
    update();
    display();
  }
}
粒子系统构造:

class ParticleSystem{
  ArrayList<Particle> particles;            //由粒子链表组成的粒子系统
  PVector origin;                                 //系统的初始位置
  float aliveTime;
  ParticleSystem(PVector location_){
    origin = location_.get();
    particles = new ArrayList<Particle>();
    aliveTime = 255;
  }
  void update(){
    origin = new PVector(mouseX, mouseY);
  }
  void addParticle(){                             //添加粒子
    float Rate = random(1);
    if(Rate < 0.5)
      particles.add(new Particle(origin));
    else
      particles.add(new Confetti(origin));
  }
  void run(){
    Iterator<Particle> it = particles.iterator();
    while(it.hasNext()){
      Particle p = it.next();
      p.run();
      if(p.isDead()){
        it.remove();
      }
    }
    aliveTime -= 1;
  }
  boolean isDead(){
    if(aliveTime <= 0){
      return true;
    }else{
      return false;
    }
  }
  void applyForce(PVector force){           //粒子受到力的作用
    for(Particle p: particles){
      p.applyForce(force);
    } 
  }
  void applyRepeller(Repeller re){          //粒子受到恒定物体的斥力
    for(Particle p: particles){
      PVector force = re.repel(p);
      p.applyForce(force);
    }
  }
}
继承实现粒子的多样性:

class Confetti extends Particle{
  float R = random(255);
  float G = random(255);
  float B = random(255);
  Confetti(PVector l){
    super(l);
  }
  void display(){
    stroke(R, G, B, lifespan);
    fill(R,G,B,lifespan);
    //ellipse(location.x, location.y, 8, 8);
    
    rect(location.x, location.y, 8, 8);
  }
}
作为排斥的物质
class Repeller{
  PVector location;
  float r = 10;
  float G = 100;
  Repeller(float x, float y){
    location = new PVector(x, y);
  }
  void display(){
    stroke(0);
    fill(0,0);
    ellipse(location.x, location.y, r*2, r*2);
  }
  PVector repel(Particle p){
    PVector dir = PVector.sub(location, p.location);
    float d = dir.mag();
    d = constrain(d, 5, 100);
    dir.normalize();
    float force = -1*G/(d*d);
    
    dir.mult(force);
    return dir;
  }
}
主窗口函数:

//粒子的随机运行
/*int total = 10;
Particale[] parray = new Particale[total];

void setup(){
  size(600, 600);
  background(255);
  smooth();
  for(int i = 0; i < parray.length; i++){
    parray[i] = new Particale();
  }
}
void draw(){
  for(int i = 0; i < parray.length; i++){
    parray[i].run();
  }
}*/
//组成链表的粒子的自然运行和消亡
 /*import java.util.*;
int total = 10;
ArrayList<Particale> plist = new ArrayList<Particale>();
void setup(){
  size(600, 600);
  smooth();
  background(255);
  frameRate(180);
}
void draw(){
  background(255);
  plist.add(new Particale(new PVector(random(width), random(height/2))));
  Iterator<Particale> it = plist.iterator();
  
  while(it.hasNext()){
    Particale p = it.next();
    p.run();
    if(p.isDead()){
      it.remove();
    }
  }
  println("plist.size:",plist.size());
}*/
//点击鼠标触发,单个粒子系统的运行
 /*import java.util.*;
ParticleSystem ps;
void mousePressed(){
  ps.update();
}
void setup(){
  size(600, 600);
  smooth();
  background(255);
  ps = new ParticleSystem(new PVector(width/2, height/2));
}
void draw(){1
  background(255);
  ps.run();
  ps.addParticle();
}*/
//多个粒子系统的在斥力的影响下自然消亡
 import java.util.*;
ArrayList<ParticleSystem> systems;
PVector gravity;
Repeller repeller;
void mousePressed(){
  systems.add(new ParticleSystem(new PVector(mouseX, mouseY)));
  //gravity = new PVector(0, 0.1);
}
void setup(){
  size(640, 240);
  systems = new ArrayList<ParticleSystem>();
  repeller = new Repeller(width/2-20, height/2);
}
void draw(){
 background(255);
 Iterator<ParticleSystem> it = systems.iterator();
 while(it.hasNext()){
   ParticleSystem p = it.next();
   gravity = new PVector(random(-0.1, 0.1), random(-0.1, 0.2));
   p.applyRepeller(repeller);
   p.applyForce(gravity);
   p.run();
   p.addParticle();
   if(p.isDead()){
     it.remove();
   }
 }
 repeller.display();
}



  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值