美文网首页
单个粒子

单个粒子

作者: 大龙10 | 来源:发表于2022-05-07 06:20 被阅读0次

书名:代码本色:用编程模拟自然系统
作者:Daniel Shiffman
译者:周晗彬
ISBN:978-7-115-36947-5
目录

4.2 单个粒子

  

1、单个粒子类

  • 粒子就是在屏幕中移动的对象,
  • 它有位置、速度和加速度变量,
  • 有构造函数用于内部变量的初始化,
  • 有display()函数用于绘制自身,
  • 还有update()函数用于更新位置。
class Particle {
    PVector location;   Particle对象是Mover对象的别名,它有位置、速度和加速度
    PVector velocity;
    PVector acceleration;
Particle(PVector l) {
    location = l.get();
    acceleration = new PVector();
    velocity = new PVector();
}
void update() {
    velocity.add(acceleration);
    location.add(velocity);
}
void display() {
    stroke(0);
    fill(175);
    ellipse(location.x,location.y,8,8);
}
}

2、生存期

这是一个很简单的粒子,我们可以继续完善这个粒子类:

  • 可以在类中加入applyForce()函数用于影响粒子的行为(后面的例子会实现这一特性);
  • 可以加入其他变量用于描述粒子的色彩和形状,或是用PImage对象绘制粒子。
  • 但现在,我们只想在类中加入一个额外的变量:生存期(lifespan)。

  典型的粒子系统中都有一个发射器,发射器是粒子的源头,它控制粒子的初始属性,包括位置、速度等。

  • 发射器发射的粒子可能是一股粒子,也可能是连续的粒子流,或是同时包含这两种发射方式。
  • 有一点非常关键:在一个典型的粒子系统中,粒子在发射器中诞生,但并不会永远存在。
  • 假设粒子永不消亡,系统中的粒子将越积越多,Sketch的运行速度也会越来越慢,最后程序会挂起。
  • 新的粒子不断产生,与此同时,旧的粒子应该不断消亡,只有这样,程序的性能才不会受到影响。
  • 决定粒子何时消亡的方法很多,
    比如,粒子可以和另一个粒子结合在一起,或在离开屏幕时消亡。
    这是本章的第一个粒子类(Particle),我希望它尽可能简单,因此用一个lifespan变量代表粒子的生存期,这个变量从255开始,逐步递减,递减到0时粒子消亡。

  加入生存期后的粒子类如下所示:

class Particle {
    PVector location;
    PVector velocity;
    PVector acceleration;
    float lifespan;   该变量用于管理粒子的“生存”时长
Particle(PVector l) {
    location = l.get();
    acceleration = new PVector();
    velocity = new PVector();
    lifespan = 255;  为了便于实现,我们从255开始递减 
  }
void update() {
    velocity.add(acceleration);
    location.add(velocity);
    lifespan -= 2.0;  递减生存期变量
  }
void display() {
    stroke(0, lifespan);  由于生存期的范围是255~0,我们可以把它当成alpha值
    fill(175,lifespan);
    ellipse(location.x,location.y,8,8);
  }
}

  为了便利,我们让生存期从255开始递减,直至减到0。因为我们让粒子的alpha透明度等于生存期,所以当粒子“消亡”时,会变得完全透明,这样它在屏幕中也就不可见了。

3、检查粒子函数

  • 有了lifespan变量之后,我们还需要添加另一个函数,
    它返回一个布尔值,用于检查粒子是否已经消亡。
  • 这个函数将在粒子系统类的实现中派上大用场。
    粒子系统的主要职责是管理粒子的列表。
  • 这个函数的实现非常简单,
    我们只需要检查lifespan变量是否小于0:如果小于0,就返回true;如果不小于0,就返回false。

4、示例

  在创建多个粒子对象之前,应该确保粒子类能够正常工作,我们可以用Sketch模拟单个粒子对象的运动情况。
  模拟代码如下所示,在其中加入了两个额外功能:

  • 首先,为了方便调用,在其中加入了run()函数,
    这个函数只是简单地调用了update()函数和display()函数;
  • 其次,为了模拟重力,
    我们为粒子对象赋予一个随机的初始速度和向下的加速度。

示例代码4-1 单个粒子

Particle p;

void setup() {
  size(640,360);
  p = new Particle(new PVector(width/2,20));
  background(255);
  smooth();
}

void draw() {
  background(255);
  
  p.run();
  if (p.isDead()) {
    p = new Particle(new PVector(width/2,20));
    //println("Particle dead!"); 
  }
}

Particle.pde

class Particle {
  PVector position;
  PVector velocity;
  PVector acceleration;
  float lifespan;

  Particle(PVector l) {
    acceleration = new PVector(0, 0.05);
    velocity = new PVector(random(-1, 1), random(-1, 0));
    position = l.get();
    lifespan = 255.0;
  }

  void run() {
    update();
    display();
  }

  // Method to update position
  void update() {
    velocity.add(acceleration);
    position.add(velocity);
    lifespan -= 2.0;
  }

  // Method to display
  void display() {
    stroke(0, lifespan);
    strokeWeight(2);
    fill(127, lifespan);
    ellipse(position.x, position.y, 12, 12);
  }

  // Is the particle still useful?
  boolean isDead() {
    if (lifespan < 0.0) {
      return true;
    } 
    else {
      return false;
    }
  }
}

5、运行结果

相关文章

  • 单个粒子

    书名:代码本色:用编程模拟自然系统作者:Daniel Shiffman译者:周晗彬ISBN:978-7-115-3...

  • 态叠加原理

    在单个粒子的双缝干涉实验中,我们看到单个粒子也能表现出波的特性。为了解释这种现象,量子力学中提出了一种“叠加态”的...

  • 12.有心力场中的运动

    两个粒子的运动,可以化为单个粒子在有心力场中的运动,所以总是要考察有心力场中粒子的运动。 将两个粒子的哈密顿量经过...

  • 上热门的“反物质”既是粒子又是波,到底是什么样?

    反物质不仅由反粒子构成,它还由波构成。现在我们知道,即使在单个反物质粒子的水平上,这也是成立的。 物理学家很早就知...

  • 粒子动画

    一个或多个CAEmitterCells:发射器电池可以看作是单个粒子的原型(例如,一个单一的粉扑在一团烟雾)。当散...

  • 粒子效果-烟花

    //分为3种粒子,子弹粒子,爆炸粒子,散开粒子 CAEmitterLayer *fireworksEmitter ...

  • 41 RS对象标签 曲线和粒子

    曲线 ———————— 粒子 支持原粒子 think-par粒子 和XP粒子

  • 关于量子波粒二象性的畅想

    上帝说有光,世界便有了光。 上帝赋予光既有粒子的属性,又有波的属性,简称波粒二象性。 可是上帝没有想到单个光子同样...

  • C4D TP粒子入门学习笔记-5:呲花炮

    【前言】 AE的粒子插件和XP粒子都有二次粒子设定,就是说,第一次粒子爆发后,每个粒子为粒子源再发射粒子。...

  • iOS-[QuartzCore框架](CAEmitterLaye

    在粒子系统中,CAEmitterLayer负责发射粒子(当然粒子也可以发射粒子),而这些所谓的粒子,就是CAEmi...

网友评论

      本文标题:单个粒子

      本文链接:https://www.haomeiwen.com/subject/ocgiyrtx.html