互动应用开发p5.js——Perlin噪声生成烟雾(柏林噪声)

简介: Perlin噪声生成烟雾一、实验内容: 和鼠标交互结合生成Perlin Noise的烟雾效果要求使用p5.js实现烟雾随机生成效果:流场利用Perlin噪声实现;(30分)粒子按照流场运动;(30分)速度、数量等可由参数控制;(15分)(HTML页面交互传递参数8分,代码中变量控制7分)使用类来实现粒子;(15分)文档和注释清楚;(10分)提交工程目录压缩的zip或者rar,以及一个readme.txt简要说明实现思路和重要参数的功能

Perlin噪声生成烟雾

 

一、实验内容:

和鼠标交互结合生成Perlin Noise的烟雾效果

要求使用p5.js实现烟雾随机生成效果:

    1. 流场利用Perlin噪声实现;(30分)
    2. 粒子按照流场运动;(30分)
    3. 速度、数量等可由参数控制;(15分)(HTML页面交互传递参数8分,代码中变量控制7分)
    4. 使用类来实现粒子;(15分)
    5. 文档和注释清楚;(10分)

    提交工程目录压缩的zip或者rar,以及一个readme.txt简要说明实现思路和重要参数的功能

    二、实验说明:

    所有实验是通过 Visual Studio Code引入p5.js包编写,所以首先要去p5.js官网下载相关包,或是在联网状态下把html中引入包的代码改成例如<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.1.9/p5.js"></script>等。

    三、实验代码:

     

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="utf-8">
      <title>噪声提交</title>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.1.9/p5.js"></script>
    </head>
    <body>
      <input type="text" id="inputBox" placeholder="输入数量1-5000">
      <!-- <input type="submit" id="submit"> -->
      <input type="text" id="inputBox2" placeholder="输入速度1-10">
      <!-- <input type="submit" id="submit2"> -->
      <input type="submit" id="submit"  value="确认" >
      <script src="sketch.js"></script>
    </body>
    </html>

    image.gif

    var scl=10;//每行每列格子数量
    var inc=0.1;
    var rows,cols;
    var zoff=0;
    var particles=[];
    var flowfield;
    var speed=1;//速度
    //数量
    let input = document.getElementById("inputBox");
    //速度
    let input_1 = document.getElementById("inputBox2");
    //按钮
    let submit = document.getElementById("submit");
    submit.onmousedown = function (e) {
      //速度
      speed=parseInt(input_1.value);
      //清空数组
      particles.splice(0,particles.length);
      for(var i=0;i<parseInt(input.value);i++){
        particles[i]=new Particle();
      }
      clear();
    }
    function setup() {
      createCanvas(400,400);
      cols=floor(width/scl);
      rows=floor(height/scl);
      flowfield=new Array(cols*rows);      
      //  for(var i=0;i<500;i++){
      //    particles[i]=new Particle();
      //  }
      background(255);
    }
    function draw() {
      var yoff=0;
      for(var y=0;y<rows;y++){
      var xoff=0;
      for(var x=0;x<cols;x++){
        var index=x+y*cols;
        //乘4是为了放大噪声生成的angle值可以使粒子更加的分散
        var angle=noise(xoff,yoff,zoff)*TWO_PI*4;
        var v=p5.Vector.fromAngle(angle);
        v.setMag(2);
        flowfield[index]=v;
        xoff+=inc;
      }  
      yoff+=inc;
      zoff+=0.0005;
      }
      for(var i=0;i<particles.length;i++){
      particles[i].follow(flowfield);
      particles[i].update();
      particles[i].edges();
      particles[i].show();
      }
    }
    function Particle(){
      this.pos=createVector(random(width),random(height));//起始位置
      this.vel=createVector(0,0);//初速度
      this.acc=createVector(0,0);//初加速度
      this.maxspeed=speed;//速度上限
      this.prevPos=this.pos.copy();
      this.update=function(){
        this.vel.add(this.acc);  
        this.vel.limit(this.maxspeed);    
        this.pos.add(this.vel);     
        this.acc.mult(0);             
      }
      this.follow=function(vectors){
        var x=floor(this.pos.x/scl);
        var y=floor(this.pos.y/scl);
        var index=x+y*cols;
        var force=vectors[index];
        this.applyForce(force);
      }
      this.applyForce=function(force){
        this.acc.add(force);
      }
      this.show=function(){
        stroke(0,5);
        strokeWeight(1);
        //用线连接粒子
        line(this.pos.x,this.pos.y,this.prevPos.x,this.prevPos.y);
        this.updataPrev();
      }
      //更新上一粒子位置
      this.updataPrev=function(){
          this.prevPos.x=this.pos.x;
          this.prevPos.y=this.pos.y;
      }
      //使粒子在画布范围内
      this.edges=function(){
        if(this.pos.x<0)
        {
          this.pos.x=width;
          this.updataPrev();
        }
        if(this.pos.x>width)
        {
          this.pos.x=0;
          this.updataPrev();
        }
        if(this.pos.y<0)
        {
          this.pos.y=height;
          this.updataPrev();
        }
        if(this.pos.y>height)
        {
          this.pos.y=0;
          this.updataPrev();
        }
      }
    }

    image.gif

    四、实验结果:

    image.gif编辑

    image.gif编辑

    image.gif编辑

    根据实验代码,先实现普通随机生成的网格色块,再实现柏林噪声生成的网格色块。

    为每个方格绘制方向线,再为绘制方向线变化赋予一个柏林噪声,让方向线动起来。

    然后构造Particle类来实现烟雾效果。

    根据上个实验思路,添加输入框及按钮,可以赋予不同的数量以及生成烟雾的速度。

    添加按钮功能,以及draw函数中使用Particles类中函数的补写。

    各个代码的作用在代码中有注释。

    相关文章
    |
    7月前
    |
    弹性计算 开发框架 JavaScript
    SAP UI5 应用开发教程之五十五 - 如何将本地 SAP UI5 应用通过 Node.js Express 部署到公网上试读版
    SAP UI5 应用开发教程之五十五 - 如何将本地 SAP UI5 应用通过 Node.js Express 部署到公网上试读版
    69 0
    |
    7月前
    |
    Web App开发 JavaScript 前端开发
    SAP UI5 应用开发教程之四十 - 如何制作包含了 component-preload.js 在内的 SAP UI5 发布版本
    SAP UI5 应用开发教程之四十 - 如何制作包含了 component-preload.js 在内的 SAP UI5 发布版本
    31 0
    |
    传感器 监控 JavaScript
    JavaScript 轻应用开发|学习笔记
    快速学习 JavaScript 轻应用开发
    139 0
    JavaScript 轻应用开发|学习笔记
    |
    前端开发
    互动应用开发p5.js——WebGL太阳系
    WebGL太阳系 一、实验内容: 完成一个太阳系场景,其中至少有三个球体,一个表示太阳,一个表示地球,一个表示月亮;地球不停地绕太阳旋转,月亮绕地球旋转,星球本身有自转。可添加纹理,纹理自行从网络搜寻。画上星球运动的轨道线,并加上适当的光照效果。提交代码(如有纹理则需要提交纹理图片)和文档,要求简要说明功能点和实现方法; 评分标准: 星球的自转和公转运动准确;(30分) 光照效果合理;(30分) 场景丰富美观,可自由增加其他物体和光照,如飞船等;(20分) 编码规范,文档说明准确清楚;(20分)
    246 0
    互动应用开发p5.js——WebGL太阳系
    |
    前端开发 UED
    互动应用开发p5.js——网页小游戏——贪吃蛇
    贪吃蛇 一、实验内容: 基于课件改进贪吃蛇或者太空大战的小游戏,可以加入新的视觉效果,比如区分蛇头和蛇身;为食物增加特效;分数排行榜;行进改成可以循环等等; 尽可能丰富游戏的玩法。 评分标准: 游戏界面及功能 (70分) 用户体验 (10分) 代码规范(20分)
    159 0
    互动应用开发p5.js——网页小游戏——贪吃蛇
    |
    数据可视化 前端开发
    互动应用开发p5.js——音视频交互
    音视频交互 一、实验内容: 音频可视化,是指一种以视觉为核心,以音频为载体,以大众为诉求对象,借助多种新媒体技术等传播媒介,通过画面、影像来诠释音乐内容的、视听结合的大众化传播方式。它能为理解、分析和比较音频作品形态的表现力和内外部结构提供的一种直观视觉呈现的技术。 将麦克风获取到的声音转变成图像 获取所需的目标音频信息 将振幅转化为波形与环形的振幅 其他的是通过声音的大小,获取音频的振幅信息,向绘制圆形的大小参数传递声音振幅的值,以达到不同声音大小的圆形。 通过获取音频的振幅信息,将振幅信息传参到小球跳
    377 0
    互动应用开发p5.js——音视频交互
    |
    前端开发
    互动应用开发p5.js——星星的运动
    星星的运动 一、实验内容: 按照章节要求使用p5.js实现星星随机向画布边界运动的效果: 星星近大远小;(20分) 能拖出尾迹;(30分) 速度、星星数量等可由参数控制;(20分)(HTML页面交互传递参数20分,代码中变量控制10分) 使用类来实现;(30分) 提交工程目录压缩的zip或者rar,以及一个readme.txt简要说明实现思路和重要参数的功能
    256 0
    互动应用开发p5.js——星星的运动
    |
    数据可视化 前端开发
    互动应用开发p5.js——冒泡排序可视化
    冒泡排序可视化 一、实验内容 实验要求: 实现10个数以上的冒泡排序可视化 体现两两交换过程 动画速度可由变量控制 代码注释完整 可选:已排好的序列颜色有所区分 解题思路: 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
    194 0
    互动应用开发p5.js——冒泡排序可视化
    |
    前端开发
    互动应用开发p5.js——弹跳小球
    互动应用开发p5.js——弹跳小球 编程实现小球在画布中运动产生反弹的效果
    205 0
    互动应用开发p5.js——弹跳小球
    |
    弹性计算 开发框架 JavaScript