用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 相关文章推荐
javascript 导出数据到Excel(处理table中的元素)
Dec 18 Javascript
Exjs 入门篇
Apr 07 Javascript
实测jquery data()如何存值
Aug 18 Javascript
Js实现无刷新删除内容
Apr 29 Javascript
属于你的jQuery提示框(Tip)插件
Jan 20 Javascript
去除html代码里面的script正则方法
May 19 Javascript
js弹出框、对话框、提示框、弹窗实现方法总结(推荐)
May 31 Javascript
jquery点击切换背景色的简单实例
Aug 25 Javascript
简单了解node npm cnpm的具体使用方法
Feb 27 Javascript
微信小程序 云开发模糊查询实现解析
Sep 02 Javascript
p5.js实现故宫橘猫赏秋图动画
Oct 23 Javascript
js中script的上下放置区别,Dom的增删改创建操作实例分析
Dec 16 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
Wordpress php 分页代码
2009/10/21 PHP
php多个字符串替换成同一个的解决方法
2013/06/18 PHP
php中静态类与静态变量用法的区别分析
2015/01/15 PHP
php查询操作实现投票功能
2016/05/09 PHP
Js 获取HTML DOM节点元素的方法小结
2009/04/24 Javascript
JS request函数 用来获取url参数
2010/05/17 Javascript
js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)
2012/12/27 Javascript
setInterval与clearInterval的使用示例代码
2014/01/28 Javascript
node.js中的path.isAbsolute方法使用说明
2014/12/08 Javascript
详解JavaScript中数组的相关知识
2015/07/29 Javascript
JavaScript+html5 canvas绘制缤纷多彩的三角形效果完整实例
2016/01/26 Javascript
微信支付 JS API支付接口详解
2016/07/11 Javascript
AngularJS页面带参跳转及参数解析操作示例
2017/06/28 Javascript
Angular4学习笔记之新建项目的方法
2017/07/18 Javascript
详解nodejs通过代理(proxy)发送http请求(request)
2017/09/22 NodeJs
JS学习笔记之数组去重实现方法小结
2019/05/29 Javascript
IE11下CKEditor在Bootstrap Modal中下拉问题的解决
2019/09/25 Javascript
浅析微信小程序modal弹窗关闭默认会执行cancel问题
2019/10/14 Javascript
JS+Canvas实现五子棋游戏
2020/08/26 Javascript
简单的抓取淘宝图片的Python爬虫
2014/12/25 Python
Django中的Model操作表的实现
2018/07/24 Python
python-numpy-指数分布实例详解
2019/12/07 Python
Pytorch之Variable的用法
2019/12/31 Python
关于torch.optim的灵活使用详解(包括重写SGD,加上L1正则)
2020/02/20 Python
Keras保存模型并载入模型继续训练的实现
2021/02/20 Python
Canvas高级路径操作之拖拽对象的实现
2019/08/05 HTML / CSS
前端水印的简单实现代码示例
2020/12/02 HTML / CSS
请用Java实现列出某个目录下的所有文件
2013/09/23 面试题
工程测量与监理专业应届生求职信
2013/11/27 职场文书
安全生产中长期规划实施方案
2014/02/21 职场文书
公司慰问信范文
2015/03/23 职场文书
2015年大学班长个人工作总结
2015/04/24 职场文书
2015年污水处理厂工作总结
2015/05/26 职场文书
会议主持词结束语
2015/07/03 职场文书
pytorch 实现在测试的时候启用dropout
2021/05/27 Python
Python中如何处理常见报错
2022/01/18 Python