three+gsap实现照片粒子分解动画效果代码
代码语言:html
所属分类:粒子
代码描述:three+gsap实现照片粒子分解动画效果代码,点击试试。
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel='stylesheet' href='https://cdn.jsdelivr.net/gh/alphardex/aqua.css/dist/aqua.min.css'> <style> body { min-height: 100vh; margin: 0; background: #f7f7fd; } </style> </head> <body > <div class="relative w-screen h-screen"> <div class="absolute w-screen h-screen flex-center opacity-0"> <img src="//repo.bfw.wiki/bfwrepo/image/61de6e39623c8.png" class="w-60 cursor-pointer" alt="" crossorigin="anonymous" /> </div> <div class="particle-explode w-full h-full bg-black"></div> </div> <script type="module"> import * as THREE from "https://cdn.skypack.dev/three@0.124.0"; import { OrbitControls } from "https://cdn.skypack.dev/three@0.124.0/examples/jsm/controls/OrbitControls"; import { EffectComposer } from "https://cdn.skypack.dev/three@0.124.0/examples/jsm/postprocessing/EffectComposer"; import imagesLoaded from "https://cdn.skypack.dev/imagesloaded@4.1.4"; import { RenderPass } from "https://cdn.skypack.dev/three@0.124.0/examples/jsm/postprocessing/RenderPass.js"; import { UnrealBloomPass } from "https://cdn.skypack.dev/three@0.124.0/examples/jsm/postprocessing/UnrealBloomPass.js"; import gsap from "https://cdn.skypack.dev/gsap@3.6.0"; import { Maku, getScreenFov } from "https://cdn.skypack.dev/maku.js@1.0.1"; const calcAspect = (el) => el.clientWidth / el.clientHeight; const getNormalizedMousePos = (e) => { return { x: (e.clientX / window.innerWidth) * 2 - 1, y: -(e.clientY / window.innerHeight) * 2 + 1 }; }; const preloadImages = (sel = "img") => { return new Promise((resolve) => { imagesLoaded(sel, { background: true }, resolve); }); }; class MouseTracker { constructor() { this.mousePos = new THREE.Vector2(0, 0); this.mouseSpeed = 0; } // 追踪鼠标位置 trackMousePos() { window.addEventListener("mousemove", (e) => { this.setMousePos(e); }); window.addEventListener("touchstart", (e) => { this.setMousePos(e.touches[0]); }, { passive: false }); window.addEventListener("touchmove", (e) => { this.setMousePos(e.touches[0]); }); } // 设置鼠标位置 setMousePos(e) { const { x, y } = getNormalizedMousePos(e); this.mousePos.x = x; this.mousePos.y = y; } // 追踪鼠标速度 trackMouseSpeed() { // https://stackoverflow.com/questions/6417036/track-mouse-speed-with-js let lastMouseX = -1; let lastMouseY = -1; let mouseSpeed = 0; window.addEventListener("mousemove", (e) => { const mousex = e.pageX; const mousey = e.pageY; if (lastMouseX > -1) { mouseSpeed = Math.max(Math.abs(mousex - lastMouseX), Math.abs(mousey - lastMouseY)); this.mouseSpeed = mouseSpeed / 100; } lastMouseX = mousex; lastMouseY = mousey; }); document.addEventListener("mouseleave", () => { this.mouseSpeed = 0; }); } } const particleExplodeVertexShader = ` vec4 permute(vec4 x){return mod(((x*34.)+1.)*x,289.);} vec4 taylorInvSqrt(vec4 r){return 1.79284291400159-.85373472095314*r;} float snoise(vec3 v){ const vec2 C=vec2(1./6.,1./3.); const vec4 D=vec4(0.,.5,1.,2.); // First corner vec3 i=floor(v+dot(v,C.yyy)); vec3 x0=v-i+dot(i,C.xxx); // Other corners vec3 g=step(x0.yzx,x0.xyz); vec3 l=1.-g; vec3 i1=min(g.xyz,l.zxy); vec3 i2=max(g.xyz,l.zxy); // x0 = x0 - 0. + 0.0 * C vec3 x1=x0-i1+1.*C.xxx; vec3 x2=x0-i2+2.*C.xxx; vec3 x3=x0-1.+3.*C.xxx; // Permutations i=mod(i,289.); vec4 p=permute(permute(permute( i.z+vec4(0.,i1.z,i2.z,1.)) +i.y+vec4(0.,i1.y,i2.y,1.)) +i.x+vec4(0.,i1.x,i2.x,1.)); // Gradients // ( N*N points uniformly over a square, mapped onto an octahedron.) float n_=1./7.;// N=7 vec3 ns=n_*D.wyz-D.xzx; vec4 j=p-49.*floor(p*ns.z*ns.z);// mod(p,N*N) vec4 x_=floor(j*ns.z); vec4 y_=floor(j-7.*x_);// mod(j,N) vec4 x=x_*ns.x+ns.yyyy; vec4 y=y_*ns.x+ns.yyyy; vec4 h=1.-abs(x)-abs(y); vec4 b0=vec4(x.xy,y.xy); vec4 b1=vec4(x.zw,y.zw); vec4 s0=floor(b0)*2.+1.; vec4 s1=floor(b1)*2.+1.; vec4 sh=-step(h,vec4(0.)); vec4 a0=b0.xzyw+s0.xzyw*sh.xxyy; vec4 a1=b1.xzyw+s1.xzyw*sh.zzww; vec3 p0=vec3(a0.xy,h.x); vec3 p1=vec3(a0.zw,h.y); vec3 p2=vec3(a1.xy,h.z); vec3 p3=vec3(a1.zw,h.w); //Normalise gradients vec4 norm=taylorInvSqrt(vec4(dot(p0,p0),dot(p1,p1),dot(p2,p2),dot(p3,p3))); p0*=norm.x; p1*=norm.y; p2*=norm.z; p3*=norm.w; // Mix final noise value vec4 m=max(.6-vec4(dot(x0,x0),dot(x1,x1),dot(x2,x2),dot(x3,x3)),0.); m=m*m; return 42.*dot(m*m,vec4(dot(p0,x0),dot(p1,x1), dot(p2,x2),dot(p3,x3))); } vec3 snoiseVec3(vec3 x){ return vec3(snoise(vec3(x)*2.-1.), snoise(vec3(x.y-19.1,x.z+33.4,x.x+47.2))*2.-1., snoise(vec3(x.z+74.2,x.x-124.5,x.y+99.4)*2.-1.) ); } vec3 curlNoise(vec3 p){ const float e=.1; vec3 dx=vec3(e,0.,0.); vec3 dy=vec3(0.,e,0.); vec3 dz=vec3(0.,0.,e); vec3 p_x0=snoiseVec3(p-dx); vec3 p_x1=snoiseVec3(p+dx); vec3 p_y0=snoiseVec3(p-dy); vec3 p_y1=snoiseVec3(p+dy); vec3 p_z0=snoiseVec3(p-dz); vec3 p_z1=snoiseVec3(p+dz); float x=p_y1.z-p_y0.z-p_z1.y+p_z0.y; float y=p_z1.x-p_z0.x-p_x1.z+p_x0.z; float z=p_x1.y-p_x0.y-p_y1.x+p_y0.x; const float divisor=1./(2.*e); return normalize(vec3(x,y,z)*divisor); } uniform float uTime; uniform float uProgress; varying vec2 vUv; void main(){ vec3 noise=curlNoise(vec3(position.x*.02,position.y*.008,uTime*.05)); vec3 distortion=vec3(position.x*2.,position.y,1.)*noise*uProgress; vec3 newPos=position+distortion; vec4 modelPosition=modelMatrix*vec4(newPos,1.); vec4 viewPosition=viewMatrix*modelPosition; vec4 projectedPosition=projectionMatrix*viewPosition; gl_Position=projectedPosition; gl_PointSize=2.; vUv=uv; } `; const particleExplodeFragmentShader = ` uniform float uTime; uniform vec2 uMouse; uniform vec2 uResolution; uniform sampler2D uTexture; varying vec2 vUv; void main(){ vec4 color=texture2D(uTexture,vUv); if(color.r<.1&&color.g<.1&&color.b<.1){ discard; } gl_FragColor=color; } `; class Base { constructor(sel, debug = false) { this.debug = debug; this.container = document.querySelector(sel); this.perspectiveCameraParams = { fov: 75, near: 0.1, far: 100 }; this.orthographicCameraParams = { zoom: 2, near: -100, far: 1000 }; this.cameraPosition = new THREE.Vector3(0, 3, 10); this.lookAtPosition = new THREE.Vector3(0, 0, 0); this.rendererParams = { alpha: true, antialias: true }; this.mouseTracker = new MouseTracker(); } // 初始化 init() { this.createScene(); this.createPerspectiveCamera(); this.createRenderer(); this.createMesh({}); this.createLight(); this.createOrbitControls(); this.createDebugUI(); this.addListeners(); this.setLoop(); } // 创建场景 createScene() { const scene = new THREE.Scene(); this.scene = scene; } // 创建透视相机 createPerspectiveCamera() { const { perspectiveCameraParams, cameraPo.........完整代码请登录后点击上方下载按钮下载查看
网友评论0