用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 相关文章推荐
ext form 表单提交数据的方法小结
Aug 08 Javascript
关于jQuery UI 使用心得及技巧
Oct 10 Javascript
JS完成代码前最好对其做5件事
Apr 07 Javascript
详解jQuery中的元素的属性和相关操作
Aug 14 Javascript
jQuery给元素添加样式的方法详解
Dec 30 Javascript
jquery判断checkbox是否选中及改变checkbox状态的实现方法
May 26 Javascript
Bootstrap+jfinal实现省市级联下拉菜单
May 30 Javascript
jQuery实现立体式数字滚动条增加效果
Dec 21 Javascript
使用JavaScript为一张图片设置备选路径的方法
Jan 04 Javascript
vue多页面开发和打包正确处理方法
Apr 20 Javascript
VSCode 配置uni-app的方法
Jul 11 Javascript
Three.js实现雪糕地球的使用示例详解
Jul 07 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
从零开始的异世界生活:第二季延期后,B站上架了第二部剧场版
2020/05/06 日漫
Yii结合CKEditor实现图片上传功能
2014/06/13 PHP
CodeIgniter配置之config.php用法实例分析
2016/01/19 PHP
Yii CFileCache 获取不到值的原因分析
2017/02/08 PHP
thinkphp5.0整合phpsocketio完整攻略(绕坑)
2018/10/12 PHP
[原创]js获取数组任意个不重复的随机数组元素
2010/03/15 Javascript
基于jquery实现的可以编辑选择的下拉框的代码
2010/11/19 Javascript
jquery 之 $().hover(func1, funct2)使用方法
2012/06/14 Javascript
兼容Firefox的Javascript XSLT 处理XML文件
2014/12/31 Javascript
基于jQuery实现的旋转彩圈实例
2015/06/26 Javascript
JavaScript的类型、值和变量小结
2015/07/09 Javascript
很棒的Bootstrap选项卡切换效果
2016/07/01 Javascript
分享JS数组求和与求最大值的方法
2016/08/11 Javascript
jQuery模拟Marquee实现无缝滚动效果完整实例
2016/09/29 Javascript
基于vue.js实现侧边菜单栏
2017/03/20 Javascript
thinkjs 文件上传功能实例代码
2017/11/08 Javascript
加载 vue 远程代码的组件实例详解
2017/11/20 Javascript
JS隐藏号码中间4位代码实例
2019/04/09 Javascript
微信小程序页面滚动到指定位置代码实例
2019/09/07 Javascript
[02:40]2018年度DOTA2最佳新人-完美盛典
2018/12/16 DOTA
请不要重复犯我在学习Python和Linux系统上的错误
2016/12/12 Python
Python global全局变量函数详解
2018/09/18 Python
python文本数据处理学习笔记详解
2019/06/17 Python
python自定义时钟类、定时任务类
2021/02/22 Python
python-web根据元素属性进行定位的方法
2019/12/13 Python
python对execl 处理操作代码
2020/06/22 Python
HTML table 表格边框的实现思路
2019/10/12 HTML / CSS
美国精品家居用品网站:US-Mattress
2016/08/24 全球购物
香港迪士尼乐园酒店预订:Hong Kong Disneyland Hotels
2017/05/02 全球购物
历史学专业毕业生求职信
2013/09/27 职场文书
服装设计专业自荐书范文
2013/12/30 职场文书
2014年企业员工工作总结
2014/12/09 职场文书
数学备课组工作总结
2015/08/12 职场文书
Python爬虫之爬取最新更新的小说网站
2021/05/06 Python
Java方法重载和方法重写的区别到底在哪?
2021/06/11 Java/Android
将MySQL的表数据全量导入clichhouse库中
2022/03/21 MySQL