用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 相关文章推荐
使用Modello编写JavaScript类
Dec 22 Javascript
silverlight线程与基于事件驱动javascript引擎(实现轨迹回放功能)
Aug 09 Javascript
Javascript 面向对象(三)接口代码
May 23 Javascript
用js提交表单解决一个页面有多个提交按钮的问题
Sep 01 Javascript
使用jQuery.wechat构建微信WEB应用
Oct 09 Javascript
Javascript中arguments对象详解
Oct 22 Javascript
原生JavaScript实现动态省市县三级联动下拉框菜单实例代码
Feb 03 Javascript
JavaScript中的对象继承关系
Aug 01 Javascript
Node.js操作redis实现添加查询功能
May 25 Javascript
微信小程序websocket实现聊天功能
Mar 30 Javascript
vue实现表格过滤功能
Sep 27 Javascript
JS数据类型STRING使用实例解析
Dec 18 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 日期和时间的处理-郑阿奇(续)
2011/07/04 PHP
php+ajax制作无刷新留言板
2015/10/27 PHP
自适应高度框架 ----属个人收藏内容
2007/01/22 Javascript
JavaScript中的this,call,apply使用及区别详解
2016/01/29 Javascript
jQuery layui常用方法介绍
2016/07/25 Javascript
JavaScript 判断一个对象{}是否为空对象的简单方法
2016/10/09 Javascript
微信小程序 教程之小程序配置
2016/10/17 Javascript
JavaScript中最常用的10种代码简写技巧总结
2017/06/28 Javascript
Vue.js 单页面多路由区域操作的实例详解
2017/07/17 Javascript
轻松理解vue的双向数据绑定问题
2017/10/30 Javascript
详解vue 计算属性与方法跟侦听器区别(面试考点)
2018/04/23 Javascript
koa2 从入门到精通(小结)
2019/07/23 Javascript
浅析Vue 防抖与节流的使用
2019/11/14 Javascript
antd Select下拉菜单动态添加option里的内容操作
2020/11/02 Javascript
Python程序设计入门(4)模块和包
2014/06/16 Python
Python利用Nagios增加微信报警通知的功能
2016/02/18 Python
python 文件操作api(文件操作函数)
2016/08/28 Python
Python如何实现守护进程的方法示例
2017/02/08 Python
python PyTorch参数初始化和Finetune
2018/02/11 Python
redis数据库及与python交互用法简单示例
2019/11/01 Python
基于Python爬取股票数据过程详解
2020/10/21 Python
如何查看浏览器对html5的支持情况
2020/12/15 HTML / CSS
Missguided美国官网:英国时尚品牌
2018/01/18 全球购物
服装厂厂长岗位职责
2013/12/27 职场文书
公司委托书范本
2014/04/04 职场文书
收款委托书范本
2014/09/11 职场文书
孕妇离婚协议书范本
2014/11/20 职场文书
转让协议书
2015/01/27 职场文书
初中教师个人工作总结
2015/02/10 职场文书
2015驻村干部工作总结
2015/04/07 职场文书
新员工辞职信范文
2015/05/12 职场文书
售房协议书范本
2015/08/11 职场文书
小学课改工作总结
2015/08/13 职场文书
2016国培研修心得体会
2016/01/08 职场文书
nginx如何将http访问的网站改成https访问
2021/03/31 Servers
MySQL限制查询和数据排序介绍
2022/03/25 MySQL