js实现屏幕粒子效果

7 篇文章 1 订阅
6 篇文章 0 订阅

js实现屏幕粒子效果

效果如下:
在这里插入图片描述
vue如下:

<template>
  <canvas id="theCanvas"></canvas>
</template>
<script>
export default {
  data() {
    return {};
  },
  mounted() {
    this.dragBox();
  },
  methods: {
    dragBox() {
      const theCanvas = document.getElementById("theCanvas"),
        ctx = theCanvas.getContext("2d"),
        current_point = {
          x: null, //当前鼠标x
          y: null, //当前鼠标y
          max: 20000,
        };

      let canvas_width = (theCanvas.width =
          window.innerWidth ||
          document.documentElement.clientWidth ||
          document.body.clientWidth),
        canvas_height = (theCanvas.height =
          window.innerHeight ||
          document.documentElement.clientHeight ||
          document.body.clientHeight),
        random_points = [],
        all_points = [];

       theCanvas.style =
      "position: fixed; top: 0px; left: 0px;pointer-events: none;";

      function draw() {
        //清屏
        ctx.clearRect(0, 0, canvas_width, canvas_height);
        let i, pi, x_dist, y_dist, dist, w;

        //遍历点集合绘制线条,类似于握手问题,两个点只绘制一条线
        random_points.forEach((p, index) => {
          (p.x += p.xa), //按指定速度移动
            (p.y += p.ya),
            //小球碰撞则速度取相反数
            (p.xa *= p.x > canvas_width || p.x < 0 ? -1 : 1),
            (p.ya *= p.y > canvas_height || p.y < 0 ? -1 : 1),
            ctx.fillRect(p.x - 0.5, p.y - 0.5, 1, 1); //绘制点

          for (i = index + 1; i < all_points.length; i++) {
            pi = all_points[i];
            if (pi.x !== null && pi.y !== null) {
              x_dist = p.x - pi.x;
              y_dist = p.y - pi.y;
              dist = x_dist * x_dist + y_dist * y_dist;
              //当两点距离小于极限距离时会产生连线,当第二个点是鼠标所产生点时,第一个点在范围内会产生向鼠标点的速度,产生吸附效果
              dist < pi.max &&
                pi === current_point &&
                dist >= pi.max / 2 &&
                ((p.x -= 0.03 * x_dist), (p.y -= 0.03 * y_dist));
              //根据距离计算连线的透明度,使过度效果流畅
              w = (pi.max - dist) / pi.max;
              ctx.beginPath();
              ctx.lineWidth = w / 2;
              ctx.strokeStyle = `rgba(255, 72, 14,${w + 0.2})`;
              ctx.moveTo(p.x, p.y);
              ctx.lineTo(pi.x, pi.y);
              ctx.stroke();
            }
          }
        }),
          requestAnimationFrame(draw);
      }

      //绑定事件,判断是否添加鼠标这个点
      window.onmousemove = (e) => {
        e = e || window.event;
        current_point.x = e.clientX;
        current_point.y = e.clientY;
      };
      window.onmouseout = () => {
        current_point.x = null;
        current_point.y = null;
      };

      //随机生成100个点
      for (let i = 0; i < 100; i++) {
        let x = Math.random() * canvas_width, //初始坐标
          y = Math.random() * canvas_height,
          xa = 2 * Math.random() - 1, //x速度
          ya = 2 * Math.random() - 1, //y速度
          max = 6000; //会产生连线的距离的平方

        random_points[i] = { x, y, xa, ya, max };
      }
      //将鼠标的点添加至点集合中
      all_points = [...random_points, current_point];

      //只是背景特效-所以延迟执行
      setTimeout(draw, 100);
    },
  },
};
</script>
<style scoped>
</style>
Three.js是一个基于WebGL的JavaScript库,用于创建和展示3D图形。它提供了丰富的功能和工具,可以轻松地实现各种动态粒子特效。 要实现动态粒子特效,可以按照以下步骤进行: 1. 创建场景(Scene):使用Three.js创建一个场景,用于容纳所有的物体和效果。 2. 创建相机(Camera):选择适合你需求的相机类型,例如透视相机(PerspectiveCamera)或正交相机(OrthographicCamera)。设置相机的位置和朝向,以便正确地观察场景。 3. 创建渲染器(Renderer):创建一个渲染器,将场景和相机渲染到屏幕上。可以选择使用WebGLRenderer或者CanvasRenderer,具体取决于你的需求。 4. 创建粒子(Particle):使用Particle或者Points等对象创建粒子。可以设置粒子的位置、大小、颜色等属性。 5. 创建材质(Material):为粒子创建材质,可以使用PointsMaterial或者ShaderMaterial等。设置材质的颜色、透明度、纹理等属性。 6. 创建动画(Animation):使用Tween.js或者自定义的动画库来实现粒子的动态效果。可以通过改变粒子的位置、大小、颜色等属性来实现动画效果。 7. 添加光源(Light):根据需要添加光源,例如环境光(AmbientLight)、平行光(DirectionalLight)或点光源(PointLight)等。光源可以影响粒子的明暗效果。 8. 渲染场景:在每一帧中,使用渲染器将场景和相机渲染到屏幕上。可以使用requestAnimationFrame来实现动画效果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值