用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实现上传图片前的预览(TX的面试题)
Aug 14 Javascript
浅谈jQuery中对象遍历.eq().first().last().slice()方法
Nov 26 Javascript
JS锚点的设置与使用方法
Sep 05 Javascript
Javascript 链式作用域详细介绍
Feb 23 Javascript
vue2.0结合DataTable插件实现表格动态刷新的方法详解
Mar 17 Javascript
JavaScript纯色二维码变成彩色二维码
Jul 23 Javascript
详解在React里使用&quot;Vuex&quot;
Apr 02 Javascript
使用javascript函数编写简单银行取钱存钱流程
May 26 Javascript
解决vue axios的封装 请求状态的错误提示问题
Sep 25 Javascript
详解使用React制作一个模态框
Mar 14 Javascript
使用 webpack 插件自动生成 vue 路由文件的方法
Aug 20 Javascript
js 判断当前时间是否处于某个一个时间段内
Sep 19 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
索尼SONY ICF-SW7600GR电路分析与改良
2021/03/02 无线电
php读取文件内容至字符串中,同时去除换行、空行、行首行尾空格(Zjmainstay原创)
2012/07/31 PHP
PHP大批量插入数据库的3种方法和速度对比
2014/07/08 PHP
PHP中UNIX时间戳和日期间的转换与计算实例
2014/11/19 PHP
php实现utf-8转unicode函数分享
2015/01/06 PHP
PHP动态柱状图实现方法
2015/03/30 PHP
整理php防注入和XSS攻击通用过滤
2015/09/13 PHP
thinkPHP实现多字段模糊匹配查询的方法
2016/12/01 PHP
javascript基础知识大集锦(二) 推荐收藏
2011/01/13 Javascript
Prototype源码浅析 String部分(一)之有关indexOf优化
2012/01/15 Javascript
js 窗口抖动示例
2013/09/04 Javascript
JS的location.href跳出框架打开新页面的方法
2014/09/04 Javascript
javascript实现3D变换的立体圆圈实例
2015/08/06 Javascript
理解javascript异步编程
2016/01/27 Javascript
javascript html5移动端轻松实现文件上传
2020/03/27 Javascript
javascript 判断是否是微信浏览器的方法
2016/10/09 Javascript
js实现增加数字显示的环形进度条效果
2017/02/05 Javascript
Angular实现购物车计算示例代码
2017/02/21 Javascript
利用canvas实现的加载动画效果实例代码
2017/07/05 Javascript
React进阶学习之组件的解耦之道
2017/08/07 Javascript
JS实现利用两个队列表示一个栈的方法
2017/12/13 Javascript
在vue中使用v-bind:class的选项卡方法
2018/09/27 Javascript
说说如何利用 Node.js 代理解决跨域问题
2019/04/22 Javascript
javaScript 实现重复输出给定的字符串的常用方法小结
2020/02/20 Javascript
js实现九宫格抽奖
2020/03/19 Javascript
[06:43]2018DOTA2国际邀请赛寻真——VGJ.Thunder
2018/08/11 DOTA
Python中用字符串调用函数或方法示例代码
2017/08/04 Python
美国求婚钻戒网站:Super Jeweler
2016/08/27 全球购物
SOA的常见陷阱或者误解是什么
2014/10/05 面试题
老公保证书范文
2014/04/29 职场文书
白银帝国观后感
2015/06/17 职场文书
新店开张宣传语
2015/07/13 职场文书
养成教育主题班会
2015/08/13 职场文书
奶茶店的创业计划书该怎么写?
2019/07/15 职场文书
详细聊聊vue中组件的props属性
2021/11/02 Vue.js
Python OpenCV形态学运算示例详解
2022/04/07 Python