Processing其乐无穷② 类与粒子系统

今天分享Processing中类的使用和简易粒子系统的案例。在Processing可以先定义一个类,然后调用它,这样的优点在于对于同一个功能的实现,我们可以反复调用,而且可以设置不同的参数互不影响,使代码高效精简。Processing与Java类似使用class来定义一个类。首先去到processing官网的reference找到类class,其给的案例是两根“相互追赶”的线。

//定义一个类 包含两个参数,线所处的y值ypos和线移动的速度speed

class HLine { 

  float ypos, speed;    //定义参数类型

  HLine (float y, float s) {  

    ypos = y; 

    speed = s;

  } 

  void update() { 

    ypos += speed;   

// 持续增加speed的量保持线向下移动

    if (ypos > height) { 

      ypos = 0;

    } 

    stroke(255);

    line(0, ypos, width, ypos);

  }

// 从类HLine声明并构造两个对象(h1,h2)

HLine h1 = new HLine(20, 2.0);  

//设置h1的初始位置在y=20,下降速度为2.0

HLine h2 = new HLine(50, 2.5); 

 //设置h2的初始位置在y=50,下降速度为2.5

void setup() 

{

  size(640, 360);

  frameRate(30);

}

void draw() { 

  background(0);

  h1.update(); 

  h2.update();

粒子系统表示三维计算机图形学中模拟一些特定的模糊现象的技术,而这些现象用其它传统的渲染技术难以实现真实感的物理运动规律。我第一次觉得Processing很酷就是因为看到粒子系统的模拟。在processing官网的Examples中可以找到Daniel Shiffman做的一个粒子系统的案例;粒子是通过draw()在每个循环中生成的,随着重力的下落而逐渐消失,ParticleSystem对象管理可变大小(ArrayList)的粒子列表。

 代码链接

https://www.processing.org/examples/simpleparticlesystem

通过对上面两个案例的研究我计划做一个带色彩并且能与我互动的粒子系统。基本的想法是系统中的粒子是大小不一、颜色不一、而且具有不定向的运动性,如果鼠标点击屏幕,所有的粒子聚集起来,然后散开随机运动,碰到画布边界后无损反弹。

int numPoints; //定义变量粒子的数量

Particle []particles; //引用到类

void setup()

{

  size(800, 500);

  numPoints = 300;

  particles = new Particle[ numPoints];

  for (int i = 0; i <  numPoints; i++)   

 //循环连续产生粒子直到预设数量

  {

    particles[i] = new Particle();

  }

}

void draw()

{

  background(0);

  for (int i = 0; i <  numPoints; i++) 

  { 

    particles[i].draw();   //绘出粒子

  }

}

//定义类Particle 

class Particle

{

  float xPosition;   //定义参数点位置的x值

  float yPosition;  //定义参数点位置的y值

  float size;     //定义参数粒子的大小

  float speedx;   //定义参数粒子移动的速度

  float speedy;    

  Particle()

  {

    xPosition = random(0, width);      

    yPosition = random(0, height);       

//粒子在画布中随机产生点

    size = random(2, 8);      

//随机产生粒子大小的区间为(2,8)

    speedx = random(-2, 2);

    speedy = random(-2, 2);  

 // 随机产生粒子运动的速度值区间为(-2, 2)

  }

  void draw()

  {

    if (size < 5)

    {

      fill(#FFFFFF);     

//如果粒子的size < 5 就填充淡蓝色

    }

    if (7.0 < size & size <8)

    {

      fill(#FF4B4B); 

 //如果粒子的7 < size & size <8 就填充淡红色

    } else 

    {

      fill(125, 240, 240);     //其它大小的粒子填充蓝色

    }

    if (dist(xPosition, yPosition, mouseX, mouseY) < 80)

    {

      fill(#FFE600);    

// 如果粒子在距离鼠标范围80之内就会变成黄色

    }

    noStroke();

    ellipse(xPosition, yPosition, size, size);

    xPosition += speedx;

    yPosition += speedy;   //赋予粒子运动的速度

    if (xPosition < 0  )

    {

      xPosition = 0 ;

      speedx = -1 * speedx;

    }

    if (xPosition > width  )

    {

      xPosition = width ;

      speedx = -1 * speedx;

    }

    if (yPosition < 0 )

    {

      yPosition = 0 ;

      speedy = -1 * speedy;

    }

    if (yPosition > height )

    {

      yPosition = height ;

      speedy = -1 * speedy;      

 //设定如果粒子碰到画布的边界就会无损反弹

    }

    if (mousePressed)

    {

      float xdist = xPosition - mouseX;

      float ydist = yPosition - mouseY;

      xPosition -= xdist;

      yPosition -= ydist;    

 //如果鼠标点击画布界面所有的粒子聚集起来

    }

  }

}

效果如下:

如上生成简单的粒子系统是很容易的,但是要生成模拟物理粒子系统或特别炫酷的大神作品需要给简单的粒子系统增加更多的限定条件和属性,当然还需要耐心的调整参数。路漫漫其修远兮,吾将上下而求索。

  福利获取:

文章中案例的程序包可以在公众号回复”P3.02"免费获得

欢迎关注CrossSpace

Processing其乐无穷① 物体与音乐灯光互动

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,820评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,648评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,324评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,714评论 1 297
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,724评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,328评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,897评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,804评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,345评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,431评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,561评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,238评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,928评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,417评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,528评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,983评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,573评论 2 359