用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的事件触发器介绍的实现
Jun 05 Javascript
jQuery结合ajax实现动态加载文本内容
May 19 Javascript
jquery预加载图片的方法
May 27 Javascript
微信小程序 Button 组件详解及简单实例
Jan 10 Javascript
js图片延迟加载(Lazyload)三种实现方式
Mar 01 Javascript
Textarea输入字数限制实例(兼容iOS&amp;安卓)
Jul 06 Javascript
解析Vue.js中的组件
Feb 02 Javascript
webpack+vue-cli项目中引入外部非模块格式js的方法
Sep 28 Javascript
详解js 创建对象的几种方法
Mar 08 Javascript
arctext.js实现文字平滑弯曲弧形效果的插件
May 13 Javascript
小程序如何在不同设备上自适应生成海报的实现方法
Aug 20 Javascript
jquery插件实现搜索历史
Apr 24 jQuery
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学习之数组的定义和填充
2011/04/17 PHP
php中使用Akismet防止垃圾评论的代码
2011/06/10 PHP
使用PHP Socket 编程模拟Http post和get请求
2014/11/25 PHP
php有效防止图片盗用、盗链的两种方法
2016/11/01 PHP
一个简单的JavaScript数据缓存系统实现代码
2010/10/24 Javascript
Javascript实现关联数据(Linked Data)查询及注意细节
2013/02/22 Javascript
js工具方法弹出蒙版
2013/05/08 Javascript
SuperSlide2实现图片滚动特效
2014/06/20 Javascript
jquery的clone方法应用于textarea和select的bug修复
2014/06/26 Javascript
javascript实现2016新年版日历
2016/01/25 Javascript
javascript的replace方法结合正则使用实例总结
2016/06/16 Javascript
jquery 判断selection range 是否在容器中的简单实例
2016/08/02 Javascript
微信小程序 前端源码逻辑和工作流详解
2016/10/08 Javascript
html、css和jquery相结合实现简单的进度条效果实例代码
2016/10/24 Javascript
bootstrap插件treeview实现全选父节点下所有子节点和反选功能
2017/07/21 Javascript
Vim快速合并行及vim 将文件所有行合并到一行
2017/11/27 Javascript
Vue框架之goods组件开发详解
2018/01/25 Javascript
微信小程序实现底部导航
2018/11/05 Javascript
Vue中Axios从远程/后台读取数据
2019/01/21 Javascript
JavaScript switch语句使用方法简介
2019/12/30 Javascript
序列化模块json代码实例详解
2020/03/03 Javascript
JS删除对象中某一属性案例详解
2020/09/08 Javascript
给Python初学者的一些编程技巧
2015/04/03 Python
Python实现更改图片尺寸大小的方法(基于Pillow包)
2016/09/19 Python
浅谈Pandas 排序之后索引的问题
2018/06/07 Python
pycharm 解除默认unittest模式的方法
2018/11/30 Python
解决Python下imread,imwrite不支持中文的问题
2018/12/05 Python
在Python 中实现图片加框和加字的方法
2019/01/26 Python
详解用python自制微信机器人,定时发送天气预报
2019/03/25 Python
Debenhams百货英国官方网站:Debenhams UK
2016/07/12 全球购物
机械设计专业应届生求职信
2013/11/21 职场文书
《桂林山水》教学反思
2014/02/08 职场文书
爱心助学感谢信
2015/01/21 职场文书
《确定位置》教学反思
2016/02/18 职场文书
JS setTimeout与setInterval的区别
2022/04/20 Javascript
讲解Python实例练习逆序输出字符串
2022/05/06 Python