👏

マウスに追従するノイズをつくりたい【canvas2D】

2023/02/23に公開

完成イメージ

ノイズの集合がマウスについてきてくれて楽しい。
noiseの大きさとかcolorパターンを操作すれば使い所もありそう
(さりげなく背景演出に仕込みたいですね〜)

円形にノイズを配置する

getRandomNoise = (radius) => {
 //set pos
 let x = this.getRandomNum(radius, radius * -1);
 let ymax = Math.sqrt(Math.pow(radius, 2) - Math.pow(x, 2));
 let ymin = ymax * -1;
 let y = this.getRandomNum(ymax, ymin);
 //set alpha
 let alpha = radius / Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)) - 1;
 //set rgb
 let rgb =
    this.noiseColorArr[
       Math.floor(Math.random() * this.noiseColorArr.length)
    ];
 return { x: x, y: y, alpha: alpha, rgb: rgb };
};

三平方の定理使う時いちいち図を書かないといけないので、もっと慣れていきたいです。(ど文系)
中心から遠くなるほど透過率が高くなるようにしてます

マウスに追従させる

/*===============================================
mouse follower
===============================================*/
this.mouseFollow = (e) => {
 if (!e) return;
 gsap.to(this.noiseParams, {
    x: e.offsetX,
    y: e.offsetY,
    duration: follow.duration,
    ease: follow.ease,
 });
};
/*===============================================
touch follower
===============================================*/
this.touchFollow = (e) => {
 if (!e) return;
 gsap.to(this.noiseParams, {
    x: e.changedTouches[0].clientX,
    y: e.changedTouches[0].clientY,
    duration: follow.duration,
    ease: follow.ease,
 });
};

fpsのたびに描画させてるので、マウスムーブでposを変化させてあげれば、移動してくれます。
スマホの場合はタッチスタートに仕込んでみてます。

初期化

const noiseFollower = new NoiseFollower(document.getElementById("js_canvas"), {
  fps: 5,
  noise: {
    size: 2,
    num: 10000,
    radius: 80,
    colorArr: [
      { r: 255, g: 0, b: 0 },
      { r: 0, g: 255, b: 0 },
      { r: 0, g: 0, b: 255 }
    ]
  },
  follow: {
    duration: 10,
    ease: "power2.out"
  },
  spread: { vol: 2, duration: 1, ease: "power2.out" }
});
noiseFollower.init();

カラーのパターン、fpsなどなど結構自由に使いまわせるようにしました。

お気に入りポイント

this.spreadAnim = () => {
 gsap.to(this.noiseParams, {
    radius: this.noiseParams.radius * spread.vol,
    duration: spread.duration,
    ease: spread.ease,
 });
};

ここで拡大できるようになってるとこが好み。
遷移アニメーションとかに仕込んだりしたい。

まとめ

直近で似たような演出をする案件があったので、汎用性高いように作ってみました。
二度と使うことはないかもだけど、、笑
まあ、やっぱり使い所の分からん演出つくるのが一番楽しいですね!

Discussion