用P5 JS绘制动态绚丽烟花——动态篇

2023-11-03

上一节我们探究了绘制静态图像手绘与码绘的差异,但是万事万物,变化万千,有很多东西仅仅用静态是无法描述的。
正如恩格斯所言:“整个自然界,从最小的东西到最大的东西,从沙粒到太阳,从原生生物到人,都处于永恒的产生和消灭中,处于不断的流动中,处于无休止的运动和变化中。”世间万物都是出于永不停歇的运动状态,因为有了运动,我们才会有丰富多彩的各种变换。

让我们来看看几组动态图像作品感受一下动态的魅力

水墨画

在这里插入图片描述

流淌的河流
在这里插入图片描述

飘落的雪花
在这里插入图片描述

看完以上作品,动态真是能够很贴切很形象的展现事物的美感了

这次要绘制的也是动态的作品——烟火,辛弃疾有诗:“东风夜放花千树。更吹落,星如雨。”动态的烟火转瞬即逝,它所求只是在人们眼前短暂的停留几秒,带来美的愉悦与享受,喜欢烟火的那一瞬间,把最美的,霎那间的光辉,留在了短暂的夜空。诗人笔下写出了多少烟花的绚烂,画家手中又描绘出多少烟花的色彩,在烟花绽放的一瞬间,他的生命也随之消失在无边的黑夜之中。烟火的绘制不仅仅是一种美的欣赏,也是对转瞬即逝的事物的感慨,一片片烟花绽放、消失,但开得很是灿烂、很是尽情,仿佛要把自己整个生命中的光芒在一瞬间展示出来。洋溢出生命的活力与激情、很是振奋人心,给人以无穷地感染力。那我们用画笔和代码实现烟花的动态绘制岂不妙哉。

花了一番功夫,实现了烟花的手绘和码绘,先来展现一下最终成果图吧

手绘作品

在这里插入图片描述

要点

烟火的手绘过程:先建立参考线,围绕参考线中心点周围做圆形状的点状分布,密度情况按照自己想制作的烟花的密度情况而定。然后旋转图像角度,用滤镜来实现飘落的轨迹,然后调整一下色彩的明度和对比度就OK啦。

码绘作品

(有交互性,其实还对粒子添加了爆炸声,但无法上传视频……)
在这里插入图片描述

要点

烟花:是粒子上升到一定的高度,然后在距离爆炸中心点一定范围内随机产生随机颜色的爆炸粒子而形成的轨迹。它的的逼真在于其颜色的多彩变幻和运行轨迹的合理性。从现象上看,一道光柱逐渐上升,到达一定高度时停止,同时出现多个粒子以一定半径散开并逐渐下降。随着烟花绽放的时间增加,其颜色逐渐暗淡,最终消逝不见。

1.粒子属性初始化
x, y代表运行轨迹的当前坐标。控制运动的代码部分只需要负责计算并更新x和y的值

  this.firework = firework;
  this.lifespan = 255;
  this.pos = createVector(x,y);
  

2.色彩的随机
不仅每一个烟花之间的颜色是不一样的,而且同一个烟花在炸的过程中,它会变颜色。在程序中,通过随机数*RGB来实现。

function randombinary(){
    x = random(1);
    if(x<0.5){
      return 1;
    } else {
      return 0;
    }
  }
  
  //调整烟花随机颜色,使其更亮丽
  this.colorR = 255*randombinary();
  this.colorG = 255*randombinary();
  this.colorB = 255*randombinary();
  
  if (this.colorR+this.colorG+this.colorB == 0){
    this.colorR = 255*randombinary();
    this.colorG = 255*randombinary();
    this.colorB = 255;
  }

3.粒子的更新和消亡
使用 update函数对粒子进行更新,done函数实现粒子的消亡,如此每一次清除画布将使原有的图形被最新的烟花轨迹覆盖,随着时间流逝,粒子最终消失在夜幕背景下,

  this.update = function() {
    
    if(!this.exploded){
      this.firework.applyForce(gravity);
      this.firework.update();
      
      if(this.firework.vel.y >= 0){
        this.exploded = true;
        this.explode();
      }
    }
    
     for(var i = this.particles.length-1; i>=0; i--){
      this.particles[i].applyForce(gravity);
      this.particles[i].update();
      
      if(this.particles[i].done()){
        this.particles.splice(i,1);
      }
    }
  };
  
this.done = function(){
    if(this.exploded && this.particles.length === 0){
      return true;
    } else {
      return false;
    }
  };

4.粒子的爆炸轨迹
烟花轨迹模拟的核心是模拟物体在物理力作用下的运行状态。在此我们主要考虑方向、速度、重力的影响。烟花在爆炸时向四面八方散开,体现在2D画布上就是0~360度随机方向。我们假想在爆炸的一瞬间冲击力最大,速度最大,然后受阻力影响速度逐渐减小。此外我们需要考虑重力的影响,使其最终大致呈自由落体运动。这里使用了p5.js的粒子系统类来实现对粒子施加力的效果以及重力效果。

  this.explode = function() {
    
    explode.setVolume(0.1);
    explode.play();
    
    for(var i = 0; i<250; i++){
      var p = new Particle(this.firework.pos.x, this.firework.pos.y, false, this.colorR, this.colorG, this.colorB);
      this.particles.push(p);
    }
  };

5.用户与界面交互的实现
用户鼠标在界面滑动,生成不同颜色大小的烟花。

    fireworks.push(new Firework(mouseX, mouseY));

6.将编写的程序挂载到网页

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="user-scalable=no,initial-scale=1,maximum-scale=1,minimum-scale=1,width=device-width">
  <script language="javascript" type="text/javascript" src="libraries/p5.js"></script>
  <script language="javascript" src="libraries/p5.dom.js"></script>
  <script language="javascript" src="libraries/p5.sound.js"></script>
  <script language="javascript" type="text/javascript" src="particle.js"></script>
  <script language="javascript" type="text/javascript" src="firework.js"></script>
  <script language="javascript" type="text/javascript" src="main.js"></script>

  <style> body {padding: 0; margin: 0;} </style>
</head>

<body>
</body>
</html>


接下来我们从不同的几个方面来谈谈手绘与码绘的异同。

(1)技法

手绘是一门精细的具有实际用途的学问,需要一种活跃又不失严谨的思维状态以及实际操作去学习以及领悟。当然,既然手绘作为一种手上技能,那么肯定需要足够多的实际动手操作才能越画越好。烟火的手绘是比较简单的,你只需要绘制一个烟火,然后改变形状和颜色,使其置于合适的位置,然后调整一下色彩的明度和对比度就OK啦。码绘时,烟花的各种属性都要考虑进去,比如爆炸范围、色彩变化、重力的调节,这些都是为了使作品的体现比较生动形象。还有不同函数的调用,比较关键的是几个循环函数和随机函数,它可以使烟火的绘制更自然。

(2)工具

手绘使用的工具是Photoshop:它主要处理以像素所构成的数字图像。使用其众多的编修与绘图工具,可以有效地进行图片编辑工作。
码绘使用的工具是p5.js :它是一个库配上许多工具,它让编程爱好者、艺术家、设计师们轻松使用 JavaScript 语言进行创意编程。编辑代码的工具是vs code 2017,你也可以直接在P5 js的官网上https://p5js.org/进行编辑,作为一种简单而友善的环境,p5.js 提供了一种通过创建交互式图形来学习编程的方法,这也大大降低了学习 JavaScript 的难度。
为什么选择JavaScript脚本语言来编写呢,其优势在于 JavaScript 广泛的可用性和无处不在的支持——每个 Web 浏览器都内置了 JavaScript 解释器,也就意味着 p5.js 程序通常可以在任何Web浏览器中运行。有人把它看作是 Processing 的 Web 版本。这也并不无道理。它们都在构建草图和原型方面有着无可替代的优势,既好玩又方便,让我们在很短的时间内能探索更多的想法。

(3)创作理念

绘画点点滴滴都是来自生活,无论是一棵树、一株草、一朵花、一块石头、一块木头、流水、山石、房屋,或者一个动作、一丝气息、一抹颜色等等,都是与我们的生活息息相关的,画面上的场景来自于生活而归于生活,只有了解了生活中的点点滴滴,才能准确地表现出物体与场景的形、色、构成,才能将自然的神、生活的韵以及画者的精神绘声绘色地表现在人们面前。本次实验的选材也是源于生活,传达出一种对美好的向往。

(4)创作体验

不要拿着笔就开始画。对一个空间进行刻画前。首先应该大体上了解这个空间的内部构造,以及空间内部主要的陈设,做到心中有数,能够合理在纸张上安排画面后才开始动笔。否则看到一部分就开始刻画,后面很可能会产生比例问题。我们不是大师,可以窥一发而知全身。我们当前要做的就是慢慢一步一个脚印的走。有时画出的画总是或多或少有比例上的问题。这主要还是基于观察不够以及练习不够的原因。观察不够,下笔匆忙自然没有过多的全局观,容易导致构图比例出现问题。而这些归根结底还是练习不够多的原因,所以对于构图的把握还不成熟,才容易出现这样的问题。码绘时,你会发现可能就是一个简单的扇形,你可能绘制都要花一番功夫,但好在前辈们已经打好了基础,你可以通过调用不同的函数库,加以修改和补充,就能绘制很多图案出来。对于不了解编程这方面的朋友们来说,也许你看到的只是一副简单的图画,但是其中包含的代码和心血超出你的想象,或许你用手绘几分钟就能搞定,但在写代码时,代码的逻辑性需要十分的严谨,一个不注意,可能会造成“车祸现场”(手动滑稽)。

(5)呈现效果

在呈现效果上,手绘可能更具有感染力和张力,你可以通过画笔表达你所想,将情感寄托于你自己的作品上,给人以触发。码绘虽然缺少一点感染力,但是通过不断地逻辑思考和函数的编写,呈现效果上可能会带来不一样的惊喜。

(6)交互性

在网络传播中,受者能够通过多种输入输出方式与系统或者其他受者在一定程度上进行直接双向交流的特性被称为网络交互性。从传播的基本模式来看它是这样的一个过程,传者发出讯息,并通过受者的反馈来确认传播的效果;而受者不但接收讯息,而且也会根据自己的理解做出相应的反馈。码绘的烟花就实现了与用户的交互,通过鼠标在屏幕滑动,产生不同的烟花粒子,给用户更有趣的体验。

(7)局限性

绘画中的光线是非常重要的,只有通过光影,才能产生体感,产生空间感,并且光影也是烘托某种气氛的重要元素,光影对于画面来说是非常重要的,真实的反应我们肉眼所能看到的实物,并用绘画手段将其本身在有光线情况下,将他固有的质感,形体表现出来。西方画家多采用光影画法来作为画面表达技法,利用光影来突出主体物,而中国画家又采用水彩光影表现技法这种技法也要求绘画者不能单纯从表象观察到光,而要在实际的构思中去灵活运用光。而码绘在光影效果的实现上比较复杂,不容易表现,实现需要较高的技术。

体会

通过以上对比我们可以发现,码绘和手绘各有所长,各有所短,毕竟事物都不是完美的,码绘和手绘本来就有许多相通的地方,只是一个用画笔画画,一个用代码画画罢了。不同工具的使用会带来不同的效果,虽然它们在创作时会给创作者不同的体验,但是从本质上来讲,它们都是为了绘制出更优质的作品服务的。不知道看到这里的朋友,更喜欢哪种绘画方式呢?

参考资料

1.用p5.js制作烟花特效
链接:https://www.huuinn.com/archives/146

2.以编程的思想来理解绘画—— (一)用”一笔画“表现“过程美”
链接: https://blog.csdn.net/magicbrushlv/article/details/82634189

3.用代码画画——搞艺术的学编程有啥用?
链接:https://blog.csdn.net/magicbrushlv/article/details/77922119

4.量化绘画:程序和绘画之间的化学反应
链接:https://36kr.com/p/5038073.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用P5 JS绘制动态绚丽烟花——动态篇 的相关文章

  • 开始第一张“码绘”——使用P5.JS画出旋转的爱心

    用P5 JS画出旋转的爱心 首先我们来看看想实现的原图 对这张图片进行观察可以发现图中一共有16颗相同的爱心在旋转 我们拿出其中一个爱心进行分析 我们可以发现 这个爱心是由27个正方体构成 此处应该注意的是 是正方体 而不是正方形 应该用b
  • 用P5.js实现一个动态的绘画系统

    摘要 通过一段时间的学习 我发现码绘的可能性比我想象的要更大 我们可以用码绘实现很多手绘很难达到的效果 比如创作一幅会动的 能进行交互的画作 如何通过类似画笔的东西在屏幕上创作出时刻在改变的 并且我们可以进行实时修改的像动画一样的作品 这就
  • 如何将 React 与 p5.js 结合使用

    我真的很喜欢p5 js和react js 所以我想知道如何将这两个结合在一起 但我无法做到这一点 所以我需要你的帮助 我真的无法为您提供一些代码示例 因为我不知道如何开始 所以我想做的是 1 创建反应应用程序 2 使用p5 js渲染画布 我
  • p5.j​​s 中的碰撞处理

    我一直在使用 p5 js 并且已经弄清楚如何让对象来检测碰撞 但我对如何处理这些碰撞感到非常困惑 我尝试将玩家速度设置为 0 但随后玩家卡住了 我也尝试过将碰撞分开到每一侧 但这也不起作用 这是我的带有碰撞函数的玩家构造函数 class P
  • 在 P5.js 中旋转网格内的对象

    我正在尝试使用合适的 OOP 方法来让对象在网格单元格内单独旋转 我当前的结果是围绕 0 0 参考点旋转所有对象 而不是每个对象在其自己的单元格内旋转 当然 需要的是一个正确的翻译函数 但是当我尝试在innerSquare函数中应用它时tr
  • 尝试使图像在点击时触发功能 - p5.js

    我正在做一个带有交互式画布的艺术课项目 我的目标是让小动物在被点击时发出声音并 移动 我尝试在不创建类的情况下执行此操作 因为由于某种原因我无法在类中使用图像 我正在尝试尽可能轻松地做到这一点 我所说的 移动 是指我试图让背景图像出现在它们
  • 如何让p5.js在特定位置创建画布[重复]

    这个问题在这里已经有答案了 我现在在 HTML CSS 方面确实有 1 小时的经验 并且对编程 例如 Java 脚本 有更深入的理解 所以 如果我对如何在这里做某事的想法为零 请原谅我 我想创建我的 p5 画布 它也遵守我的 CSS 规则
  • 如何在p5.js中识别圆弧内的光标? [关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我正在制作一个饼图 希望当光标移动到我的分段上时突出显示 然后在用户单击分段时展开 我看过很多关于如何让圆形或方形识别光标在其空间内的教程 但我无法理解任何可以根据输入值改变大小的弧线
  • 绘制到 p5.Image 而不是画布

    给定加载的 png 图像作为模板 我希望用户能够跟踪图像的元素 在 p5 中 这很简单 setup Load image var img loadImage image img 0 0 draw ellipse mouseX mouseY
  • 如何将 p5js 与 Webpack 一起使用

    我想写一个基于的库p5js https github com processing p5 js 所以在我的 Javascript 项目中我有Webpack作为开发依赖项安装 我将其写在start js import p5 from p5 p
  • 如何在javascript中获取频率值?

    我是一名意大利学生 我正在使用 p5 的库来创建一个网络吉他调音器 我想知道是否有办法获取麦克风输入的频率 图书馆链接 https p5js org reference libraries p5 sound https p5js org r
  • P5.js curveVertex 函数在某个点闭合

    我创建了一个噪声函数 它与一个圆函数配对 创建一个看起来很酷的随机噪声圆 我的问题是curveVertex除了第一个和最后一个顶点的连接之外 P5 js 中的函数工作正常 我的代码是 let start Array 50 fill 0 do
  • p5.j​​s 中的上下移动(并使用 WASD)

    在p5中如何使用键盘让角色移动 我的意思是 不仅仅是向左和向右 我还想使用 WASD 键 我用过这个 形状作为占位符 https editor p5js org TheDiamondfinderYT present 8ZqV2LsVB ht
  • 如何在合并排序期间“暂停”以可视化 JS p5js

    我正在使用 p5 js 开发排序可视化工具 我需要知道是否可以减慢合并排序 以便可以更慢地绘制它 我目前正在尝试使用下面的睡眠功能来减慢它们的合并功能 但我得到 未捕获的类型错误 a slice 不是函数 我只是犯了一个愚蠢的错误 还是我错
  • p5 使用十六进制字符串和 alpha 设置填充颜色

    我试图在 p5 js 中使用十六进制颜色值 但在使用它和同时使用 alpha 时遇到问题 我想用一个变量设置颜色 用另一个变量设置阿尔法 let myColor FF0000 let myAlpha 128 function setup c
  • 如何用圆圈替换光标,而不是在 p5.js 中将其绘制到画布上?

    问题 我正在尝试使用 p5 js 创建一个简单的绘图应用程序 我想在光标位置显示一个代表画笔大小的圆圈 而不是标准光标图像 可能的解决方案1 使用替换光标cursor p5 的原生函数 为什么它不起作用 The p5光标功能 https p
  • Angular 和 p5.js - p5.loadSound 不是函数

    当我想在我的 Angular 项目中使用 p5 js 时遇到问题 我使用 Angular CLI 将 p5 js 包含在我的 angular cli json file scripts node modules p5 lib p5 min
  • 在 p5js 中将画布导出为 GIF/PNG

    I use 原子编辑器 我要实现20 秒 GIF用我的画布 saveFrames 有一个限制 我猜 即使我输入 它也可以将 png 文件保存为短 gif 3 5 秒 saveFrames aa png 15 22 我发现了 CCapture
  • 在 p5.js 中放大时精灵模糊

    我试图将 p5 js 中精灵的大小放大一点 系数 2 但渲染时它们看起来很模糊 显然 放大通常不是一个好主意 但是我已经成功地使像素化精灵在原始 JavaScript 中看起来清晰 基于这篇文章 https nluqo github io
  • 在 p5js 中渲染骨架 glb

    所以我有办法渲染模型将动画模型从 Three js 渲染到 p5 js https stackoverflow com questions 75715609 rendering an animated model from three js

随机推荐

  • python-Django_根据数据库表反向生成Model

    Django 根据数据库表反向生成 Model 简介 Django 根据数据库表反向生成 Model 使用 inspectdb 反向生成 model 实体类 可以指定表名转换 python manage py inspectdb 命令参数解
  • html css js 一些记录.

    webstorm 的基本使用 webstorm 格式化 html 代码 Ctrl Alt L js html css 基本使用 注意 dom 的 innerHTML会刷新dom 所以里面包含的事件绑定可能无效 需要重新绑定 document
  • 存储过程分表

    DROP PROCEDURE IF EXISTS test sql create procedure test sql in start num int in end num int begin declare i int set i st
  • SpringBoot使用Jackson,全局反序列化去除字符串前后空格

    方法一 继承SimpleModule Component public class StringTrimModule extends SimpleModule private static final long serialVersionU
  • 字节流 FileInputStream和FileOutputStream类 三种读写方法对比概述

    文件操作 FileInputStream和FileOutputStream类 三种read方法对比概述 流 字节流 FileInputStream及FileOutputStream类的构造方法 代码测试read 以及write 三个方法各自
  • 【牛客SQL】SQL22 统计各个部门的工资记录数

    题目描述 描述 有一个部门表departments简况如下 有一个 部门员工关系表dept emp简况如下 有一个薪水表salaries简况如下 请你统计各个部门的工资记录数 给出部门编码dept no 部门名称dept name以及部门在
  • TensorFlow猫狗大战完整代码实现和详细注释

    运行环境 Windows10 TensorFlow1 10 GPU版本 python3 6 编译器pycharm 文件说明 1 data文件夹下包含test和train两个子文件夹 分别用于存放测试数据和训练数据 从官网上下载的数据直接解压
  • dod刷服务器文件,如何建立一个DOD服务器

    如何建立一个服务器 建立一个服务器让玩家来玩其实很简单 首先你要决定是否要从这台服务器机子本身玩DoD 或者建立一个纯服务器 你将不能用这台机子玩DoD 事实上一个纯服务器效率更高 服务器管理员并没有在服务器里玩 目前我们先讨论如何建立一个
  • 基于随机森林实现特征选择降维及回归预测(Matlab代码实现)

    目录 摘要 1 随机森林 2 随机森林的特征选取 3 基于Matlab自带的随机森林函数进行特征选取具体步骤 1 加载数据 2 首先建立随机森林并使用全部特征进行车辆经济性预测 3 使用随机森林进行特征选择 4 评价各个特征之间的相关性 5
  • 朴实无华地解决h5移动端开发软键盘输入时导致页面出现白块

    项目场景 项目场景 h5移动端开发 问题描述 登录页面在输入账密的时候 软键盘弹起的时候带出了白块在收起软键盘之前不会消失 原因分析 在页面中使用了相对定位 绝对定位属性以及margin属性 导致软键盘弹起时页面内容长度增加但不会自动收回
  • linux自启动程序

    嵌入式linux下有软件需要自启动 只需要在 etc init d rcS末尾添加所要启动的程序即可 开机就会自动运行 vi etc init d rcS在文件末尾添加 例
  • ubuntu16.10 lenovo拯救者笔记本无线网络开关修复方法(联想拯救者 + ubuntu16.04 + WIFI设置)

    问题一1 1 问题描述笔记本型号 Lenovo r720笔记本 i5 7300hq gtx1060 maxq 6g 默认装入Win10系统 然而当装入Ubuntu16 04双系统时 会出现无线网卡 型号 RTL8821AE 被hard bl
  • Composer中的curl引入

    Composer是php的主要扩展库 类似于npm pip等 可以安装很多优秀的php扩展 在使用短信验证码接入功能的时候 必须要引入这个扩展 1 从官网上引入composer地址 composer require curl curl 2
  • 问题:overflow 和 justify-content 同时使用出现内容被裁减的问题

    文章目录 开发的时候遇到如下问题 原因 解决 开发的时候遇到如下问题 当给一个容器的样式同时添加 justify content center 和 overflow x auto 属性 当内容长度超过容器的长度的时候会出现左侧内容被裁剪的问
  • springMVC 国际化 多语言

    springMVC 国际化 多语言 配置 系统有时需要考虑多国人员使用 比如中国人 美国人 日本人 韩国人 面向不同国家的使用者应该能方便地在不同语言之间进行切换 比如中文 英文 日文 韩文 常用的有两种方式 1 根据浏览器默认语言设置系统
  • ClickHouse中文官方文档

    什么是 ClickHouse ClickHouse 是一个面向列的数据库管理系统 DBMS 用于查询的在线分析处理 OLAP 在 正常 的面向行的 DBMS 中 数据按以下顺序存储 排 手表ID Java启用 标题 好活动 事件时间 0 8
  • SSL/CA 证书及其相关证书文件(pem、crt、cer、key、csr)

    数字证书是网络世界中的身份证 数字证书为实现双方安全通信提供了电子认证 数字证书中含有密钥对所有者的识别信息 通过验证识别信息的真伪实现对证书持有者身份的认证 数字证书可以在网络世界中为互不见面的用户建立安全可靠的信任关系 这种信任关系的建
  • 《关键对话,如何高效能沟通》读书笔记(上)

    读书使人进步 每天进步一点点 在工作中相关的能力可以分为七类核心能力 沟通表达能力 信息处理能力 运用科技的能力 计划组织的能力 解决问题的能力 团队合作的能力 数字概念的能力 其中把沟通表达能力列为七类核心能力之首 可见沟通表达能力在一个
  • 网络安全-Mysql注入知识点

    目录 注释 SQL语句 查询语句 UNION LIMIT ORDER BY information schema SCHEMATA TABLES COLUMNS 常用函数 基本函数 盲注 字符串处理函数 报错注入 时间盲注 本篇文章介绍sq
  • 用P5 JS绘制动态绚丽烟花——动态篇

    上一节我们探究了绘制静态图像手绘与码绘的差异 但是万事万物 变化万千 有很多东西仅仅用静态是无法描述的 正如恩格斯所言 整个自然界 从最小的东西到最大的东西 从沙粒到太阳 从原生生物到人 都处于永恒的产生和消灭中 处于不断的流动中 处于无休