用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 相关文章推荐
syntaxhighlighter 使用方法
Jul 02 Javascript
分页栏的web标准实现
Nov 01 Javascript
基于mouseout和mouseover等类似事件的冒泡问题解决方法
Nov 18 Javascript
JavaScript获取XML数据附示例截图
Mar 05 Javascript
JS实现鼠标点击展开或隐藏表格行的方法
Mar 03 Javascript
微信中一些常用的js方法汇总
Mar 12 Javascript
jQuery实现表格展开与折叠的方法
May 04 Javascript
什么是JavaScript中的结果值?
Oct 08 Javascript
微信小程序 input输入框详解及简单实例
Jan 10 Javascript
JS+HTML实现的圆形可点击区域示例【3种方法】
Aug 01 Javascript
实例介绍JavaScript中多种组合继承
Jan 20 Javascript
说说如何使用Vuex进行状态管理(小结)
Apr 14 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
PHPMyAdmin 快速配置方法
2009/05/11 PHP
phpword插件导出word文件时中文乱码问题处理方案
2014/08/19 PHP
ThinkPHP 404页面的设置方法
2015/01/14 PHP
PHP中的Trait 特性及作用
2016/04/03 PHP
JavaScript中的History历史对象
2008/01/16 Javascript
JQuery 构建客户/服务分离的链接模型中Table中的排序分析
2010/01/22 Javascript
jQeury淡入淡出需要注意的问题
2010/09/08 Javascript
浅析IE10兼容性问题(frameset的cols属性)
2014/01/03 Javascript
创建js对象和js类的方法汇总
2014/12/24 Javascript
javascript实现回车键提交表单方法总结
2015/01/10 Javascript
Python脚本后台运行的几种方式
2015/03/09 Javascript
javascript实现鼠标拖动改变层大小的方法
2015/04/30 Javascript
javascript实现简单的页面右下角提示信息框
2015/07/31 Javascript
JavaScript中的this使用详解
2016/07/27 Javascript
微信小程序 加载 app-service.js 错误解决方法
2016/10/12 Javascript
JS中Array数组学习总结
2017/01/18 Javascript
详解promise.then,process.nextTick, setTimeout 以及 setImmediate的执行顺序
2018/11/21 Javascript
Nodejs技巧之Exceljs表格操作用法示例
2019/11/06 NodeJs
element 动态合并表格的步骤
2020/12/31 Javascript
[02:51]2014DOTA2 TI小组赛总结中国军团全部进军钥匙球馆
2014/07/15 DOTA
Python标准库os.path包、glob包使用实例
2014/11/25 Python
Python模拟登陆实现代码
2017/06/14 Python
详解Python里使用正则表达式的ASCII模式
2017/11/02 Python
解决Python requests库编码 socks5代理的问题
2018/05/07 Python
对python指数、幂数拟合curve_fit详解
2018/12/29 Python
Python绘图Matplotlib之坐标轴及刻度总结
2019/06/28 Python
pytorch方法测试详解——归一化(BatchNorm2d)
2020/01/15 Python
Python利用逻辑回归分类实现模板
2020/02/15 Python
CentOS 7如何实现定时执行python脚本
2020/06/24 Python
HTML5 通信API 跨域门槛将不再高、数据推送也不再是梦
2013/04/25 HTML / CSS
用HTML5制作一个简单的桌球游戏的教程
2015/05/12 HTML / CSS
canvas绘制图片drawImage使用方法
2020/09/15 HTML / CSS
《十六年前的回忆》教学反思
2014/02/14 职场文书
学雷锋演讲稿汇总
2014/05/10 职场文书
2016学雷锋优秀志愿者事迹材料
2016/02/25 职场文书
原生JS中应该禁止出现的写法
2021/05/05 Javascript