用p5.js制作烟花特效的示例代码


Posted in Javascript onMarch 21, 2018

前言

之前看过一篇文章,使用processing制作烟花特效。效果如下

用p5.js制作烟花特效的示例代码

fireworks 网上调查了一圈了,发现processing是一个互动编程软件,java语言发展而来。而且动画效果是跑在processing专门的模拟器上。 不过好在也有对应的web扩展语言,有processing.js和p5.js。 processing.js在github上已经好几年没有人维护了,一些processing的特性支持不了。为此踩了不少坑, 本文就集中讲解如何用p5.js写烟花特效。

代码讲解

processing风格

function setup() { //processing初始化设置
 createCanvas(window.innerWidth, window.innerHeight);
 frameRate(50);
 imageMode(CENTER);
}

function draw() { //循环执行,达成画面渲染效果
 background(0, 0, 40);
 for (var i = 0; i < fireworks.length; i++) {
  fireworks[i].display();
  fireworks[i].update();
  if (fireworks[i].needRemove()) {
   fireworks.splice(i, 1);
  }
 }
}

烟花效果

function Fireworks(radius) {
 var num = 512; //一发烟花里,有多少个点 (比较吃机器)
 var centerPosition = new p5.Vector(random(width / 8, width * 7 / 8), random(height / 2, height * 4 / 5), random(-100, 100)); //烟花的中心位置
 var velocity = new p5.Vector(0, -22, 0);
 var accel = new p5.Vector(0, 0.4, 0);
 var img;
 var firePosition = [];
 var cosTheta;
 var sinTheta;
 var phi;
 var colorChange = random(0, 5);

 for (var i = 0; i < num; i++) {
  cosTheta = random(0, 1) * 2 - 1;
  sinTheta = sqrt(1 - cosTheta * cosTheta);
  phi = random(0, 1) * 2 * PI;
  firePosition[i] = new p5.Vector(radius * sinTheta * cos(phi), radius * sinTheta * sin(phi), radius * cosTheta); //1发烟花里各个点的位置计算
  firePosition[i] = p5.Vector.mult(firePosition[i], 1.12);
 }

 //调整烟花随机颜色,使其更亮丽
 if(colorChange>=3.8){
  img=createLight(0.9,random(0.2,0.5),random(0.2,0.5));
 }else if(colorChange>3.2){
  img=createLight(random(0.2,0.5),0.9,random(0.2,0.5));
 }else if(colorChange>2){
  img=createLight(random(0.2,0.5),random(0.2,0.5),0.9);
 } else {
  img=createLight(random(0.5,0.8),random(0.5,0.8),random(0.5,0.8));
 }


 this.display = function () {
  for (var i = 0; i < num; i++) {
   push();
   translate(centerPosition.x, centerPosition.y, centerPosition.z);
   translate(firePosition[i].x, firePosition[i].y, firePosition[i].z);
   blendMode(ADD); //各个小点(发光源遮罩效果)
   image(img, 0, 0);
   pop();

   firePosition[i] = p5.Vector.mult(firePosition[i], 1.015); //更新小点(发光源)扩散位置
  } 
 }

 this.update = function () { //模拟重力加速度
  radius = dist(0, 0, 0, firePosition[0].x, firePosition[0].y, firePosition[0].z);
  centerPosition.add(velocity);
  velocity.add(accel);
 }

 this.needRemove = function () {
  if (centerPosition.y - radius > height) {
   return true;
  } else {
   return false;
  }
 }
}

随机发光源图片生成

function createLight(rPower, gPower, bPower) {
 var side = 64;
 var center = side / 2.0;
 var img = createImage(side, side);
 img.loadPixels();
 for (var y = 0; y < side; y++) {
  for (var x = 0; x < side; x++) {
   var distance = (sq(center - x) + sq(center - y)) / 10.0;
   var r = int((255 * rPower) / distance);
   var g = int((255 * gPower) / distance);
   var b = int((255 * bPower) / distance);
   // img.pixels[x + y * side] = color(r, g, b);
   img.set(y, x, color(r, g, b));
  }
 }

 img.updatePixels();
 return img;
}

接收键盘和屏幕触碰事件

function keyPressed() { //每事件添加一发烟花
 fireworks.push(new Fireworks(80)); //80为烟花初始半径
}

function touchStarted() { //每事件添加一发烟花
 fireworks.push(new Fireworks(80));
 return false;
}

Github

https://github.com/cangyan/TAV/tree/master/00003_P5_FIREWORKS

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Prototype中dom对象方法汇总
Sep 17 Javascript
javascript开发随笔一 preventDefault的必要
Nov 25 Javascript
jquery div 居中技巧应用介绍
Nov 24 Javascript
JSON.parse()和JSON.stringify()使用介绍
Jun 20 Javascript
jQuery实现在下拉列表选择时获取json数据的方法
Apr 16 Javascript
Javascript 闭包详解及实例代码
Nov 30 Javascript
Node.js+Express+MySql实现用户登录注册功能
Jul 10 Javascript
Angular实现的日程表功能【可添加及隐藏显示内容】
Dec 27 Javascript
详解Javascript中new()到底做了些什么?
Mar 29 Javascript
vue.js与element-ui实现菜单树形结构的解决方法
Apr 21 Javascript
angular多语言配置详解
May 16 Javascript
详解Vue项目引入CreateJS的方法(亲测可用)
May 30 Javascript
AngularJS监听ng-repeat渲染完成的方法
Mar 20 #Javascript
vue对storejs获取的数据进行处理时遇到的几种问题小结
Mar 20 #Javascript
webpack本地开发环境无法用IP访问的解决方法
Mar 20 #Javascript
解决vue-router中的query动态传参问题
Mar 20 #Javascript
vue数据传递--我有特殊的实现技巧
Mar 20 #Javascript
手写Node静态资源服务器的实现方法
Mar 20 #Javascript
JS 实现缓存算法的示例(FIFO/LRU)
Mar 20 #Javascript
You might like
PHP开启gzip页面压缩实例代码
2010/03/11 PHP
PHP中多维数组的foreach遍历示例
2014/06/13 PHP
PHP-Java-Bridge使用笔记
2014/09/22 PHP
安装ImageMagick出现error while loading shared libraries的解决方法
2014/09/23 PHP
PHP连接MSSQL时nvarchar字段长度被截断为255的解决方法
2014/12/25 PHP
如何解决PHP使用mysql_query查询超大结果集超内存问题
2016/03/14 PHP
PHP的mysqli_select_db()函数讲解
2019/01/23 PHP
php 实现银联商务H5支付的示例代码
2019/10/12 PHP
让iframe子窗体取父窗体地址栏参数(querystring)
2009/10/13 Javascript
JavaScript 变量作用域分析
2011/07/04 Javascript
jquery jqPlot API 中文使用教程(非常强大的图表工具)
2011/08/15 Javascript
让元素在网页中可拖动示例代码
2013/08/13 Javascript
js将当前时间格式转换成时间搓(自写)
2013/09/26 Javascript
js中的replace方法使用介绍
2013/10/28 Javascript
Javascript学习笔记之函数篇(四):arguments 对象
2014/11/23 Javascript
D3.js中data(), enter() 和 exit()的问题详解
2015/08/17 Javascript
javascript关于继承解析
2016/05/10 Javascript
AngularJS ng-repeat数组有重复值的解决方法
2016/10/23 Javascript
JavaScript注入漏洞的原理及防范(详解)
2016/12/04 Javascript
backbone简介_动力节点Java学院整理
2017/07/14 Javascript
详解vue中localStorage的使用方法
2018/11/22 Javascript
vue数据操作之点击事件实现num加减功能示例
2019/01/19 Javascript
使用zrender.js绘制体温单效果
2019/10/31 Javascript
jQuery 常用特效实例小结【显示与隐藏、淡入淡出、滑动、动画等】
2020/05/19 jQuery
Node.js API详解之 vm模块用法实例分析
2020/05/27 Javascript
使用FastCGI部署Python的Django应用的教程
2015/07/22 Python
浅谈python抛出异常、自定义异常, 传递异常
2016/06/20 Python
Python操作Access数据库基本步骤分析
2016/09/19 Python
简单了解python shutil模块原理及使用方法
2020/04/28 Python
美国葡萄酒网上商店:Martha Stewart Wine Co.
2019/03/17 全球购物
Clarks西班牙官方在线商店:clarks鞋
2019/05/03 全球购物
电子专业毕业生自我鉴定
2014/01/22 职场文书
《小壁虎借尾巴》教学反思
2014/02/16 职场文书
心得体会的写法
2014/09/05 职场文书
预备党员党支部意见
2015/06/02 职场文书
2016大学生社会实践单位评语
2015/12/01 职场文书