用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 相关文章推荐
js 判断checkbox是否选中的操作方法
Nov 09 Javascript
JavaScript forEach()遍历函数使用及介绍
Jul 08 Javascript
SpringMVC框架下JQuery传递并解析Json格式的数据是如何实现的
Dec 10 Javascript
KnockoutJS 3.X API 第四章之表单value绑定
Oct 10 Javascript
浅谈js中function的参数默认值
Feb 20 Javascript
JavaScript数据结构中栈的应用之表达式求值问题详解
Apr 11 Javascript
jQuery模拟爆炸倒计时功能实例代码
Aug 21 jQuery
Node.js学习教程之HTTP/2服务器推送【译】
Oct 31 Javascript
基于vue,vue-router, vuex及addRoutes进行权限控制问题
May 02 Javascript
JavaScript中变量提升和函数提升的详解
Aug 07 Javascript
vue全局使用axios的操作
Sep 08 Javascript
Openlayers+EasyUI Tree动态实现图层控制
Sep 28 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 解决session死锁的方法
2013/06/20 PHP
php使用Jpgraph绘制饼状图的方法
2015/06/10 PHP
php使用CURL模拟GET与POST向微信接口提交及获取数据的方法
2016/09/23 PHP
php获取目录下所有文件及目录(多种方法)(推荐)
2019/05/14 PHP
jQuery 性能优化指南 (1)
2009/05/21 Javascript
自己做的模拟模态对话框实现代码
2012/05/23 Javascript
jquery css 设置table的奇偶行背景色示例
2014/06/03 Javascript
jquery获取及设置outerhtml的方法
2015/03/09 Javascript
jQuery实现鼠标滑过图片移动特效
2016/12/08 Javascript
jquery中each循环的简单回滚操作
2017/05/05 jQuery
Bootstrap Table使用整理(四)之工具栏
2017/06/09 Javascript
基于Vue框架vux组件库实现上拉刷新功能
2017/11/28 Javascript
Angular实现点击按钮后在上方显示输入内容的方法
2017/12/27 Javascript
详解如何在React组件“外”使用父组件的Props
2018/01/12 Javascript
通过vue-router懒加载解决首次加载时资源过多导致的速度缓慢问题
2018/04/08 Javascript
vue使用自定义icon图标的方法
2018/05/14 Javascript
React Router V4使用指南(精讲)
2018/09/17 Javascript
Vue2.x和Vue3.x的双向绑定原理详解
2020/11/05 Javascript
[02:52]DOTA2新手基础教程 米波
2014/01/21 DOTA
python更新列表的方法
2015/07/28 Python
python实现图书馆研习室自动预约功能
2018/04/27 Python
pycharm安装和首次使用教程
2018/08/27 Python
python实现批量修改服务器密码的方法
2019/08/13 Python
python使用协程实现并发操作的方法详解
2019/12/27 Python
Python模块的定义,模块的导入,__name__用法实例分析
2020/01/07 Python
python属于软件吗
2020/06/18 Python
pytorch 多分类问题,计算百分比操作
2020/07/09 Python
python中random模块详解
2021/03/01 Python
Myprotein意大利官网:欧洲第一运动营养品牌
2018/11/22 全球购物
俄罗斯在线手表和珠宝商店:AllTime
2019/09/28 全球购物
建筑专业毕业生自荐信
2014/05/25 职场文书
优秀班主任事迹材料
2014/12/16 职场文书
幼儿教师三分钟演讲稿
2019/06/21 职场文书
django如何自定义manage.py管理命令
2021/04/27 Python
利用js实现简单开关灯代码
2021/11/23 Javascript
对讲机知识
2022/04/07 无线电