エフェクト
sticky-plane

Sticky-plane


デモ

ソースコード

import gsap from "gsap";
import { PlaneGeometry, Float32BufferAttribute } from "three";

import { Ob, utils } from "negl";
import vertexShader from "./vertex.glsl";
import fragmentShader from "./fragment.glsl";
export default class extends Ob {
  setupGeometry() {
    const wSeg = 30,
      hSeg = 30;
    const geometry = new PlaneGeometry(
      this.rect.width,
      this.rect.height,
      wSeg,
      hSeg
    );

    // 対角線上に詰められた遅延時間用の頂点データ
    // Vertex data for latency packed along the diagonal.
    const delayVertices = utils.getDiagonalVertices(hSeg, wSeg, getValue, 0);
    // utils.printMat(delayVertices, wSeg + 1, "遅延時間行列");

    // 0~1までの値をstep毎に返す
    // Returns values from 0 to 1 in increments of each step.
    function getValue(previousValue, currentIndex) {
      let step = 1 / (hSeg + 1) / (wSeg + 1);
      return previousValue + step;
    }

    geometry.setAttribute(
      "aDelay",
      new Float32BufferAttribute(delayVertices, 1)
    );

    return geometry;
  }
  setupVertex() {
    return vertexShader;
  }
  setupFragment() {
    return fragmentShader;
  }
  debug(folder) {
    folder
      .add(this.uniforms.uProgress, "value", 0, 1, 0.1)
      .name("progess")
      .listen();

    const datData = { next: !!this.uniforms.uProgress.value };
    folder.add(datData, "next").onChange(() => {
      gsap.to(this.uniforms.uProgress, {
        value: +datData.next,
        duration: 2,
        ease: "power2.inOut",
      });
    });
  }
}

利用方法

⚠️

ダウンロードしたコードをプロジェクトに配置し、以下のコードを記述してください。

index.html

<img class="screen" data-webgl="sticky-plane"  data-tex-1="/sample1.jpg"></img>

使用画像・動画

  • こちらを参考にダウンロードした各ファイルを配置してください。