随机波浪波纹动画效果
代码语言:html
所属分类:背景
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <style> body { margin: 0; } canvas { display: block; } </style> </head> <body translate="no"> <canvas id="canvas"></canvas> <script type="text/javascript" src="http://repo.bfw.wiki/bfwrepo/js/three.109.js"></script> <script type="text/javascript" src="http://repo.bfw.wiki/bfwrepo/js/chroma.min.js"></script> <script > function App() { const conf = { nx: 40, ny: 100, cscale: chroma.scale(['#2175D8', '#DC5DCE', '#CC223D', '#F07414', '#FDEE61', '#74C425']).mode('lch'), darken: -1, angle: Math.PI / 3, timeCoef: 0.1 }; let renderer, scene, camera; let width, height; const { randFloat: rnd } = THREE.Math; const uTime = { value: 0 },uTimeCoef = { value: conf.timeCoef }; const polylines = []; init(); function init() { renderer = new THREE.WebGLRenderer({ canvas: document.getElementById('canvas'), antialias: true }); camera = new THREE.PerspectiveCamera(); updateSize(); window.addEventListener('resize', updateSize, false); document.body.addEventListener('click', initRandomScene); initScene(); requestAnimationFrame(animate); } function initScene() { scene = new THREE.Scene(); const vertexShader = ` uniform float uTime, uTimeCoef; uniform float uSize; uniform mat2 uMat2; uniform vec3 uRnd1; uniform vec3 uRnd2; uniform vec3 uRnd3; uniform vec3 uRnd4; uniform vec3 uRnd5; attribute vec3 next, prev; attribute float side; varying vec2 vUv; vec2 dp(vec2 sv) { return (1.5 * sv * uMat2); } void main() { vUv = uv; vec2 pos = dp(position.xy); // Well... I know I should update geometry instead... // Computing normal here is not needed // vec2 sprev = dp(prev.xy); // vec2 snext = dp(next.xy); // vec2 tangent = normalize(snext - sprev); // vec2 normal = vec2(-tangent.y, tangent.x); // float dist = length(snext - sprev); // normal *= smoothstep(0.0, 0.02, dist); vec2 normal = dp(vec2(1, 0)); normal *= uSize; float time = uTime * uTimeCoef; vec3 rnd1 = vec3(cos(time * uRnd1.x + uRnd3.x), cos(time * uRnd1.y + uRnd3.y), cos(time * uRnd1.z + uRnd3.z)); vec3 rnd2 = vec3(cos(time * uRnd2.x + uRnd4.x), cos(time * uRnd2.y + uRnd4.y), cos(time * uRnd2.z + uRnd4.z)); normal *= 1.0 + uRnd5.x * (cos((position.y + rnd1.x) * 20.0 * rnd1.y) + 1.0) + uRnd5.y * (sin((position.y + rnd2.x) * 20.0 * rnd2.y) + 1.0) + uRnd5.z * (cos((position.y + rnd1.z) * 20.0 * rnd2.z) + 1.0); pos.xy -= normal * side; gl_Position = vec4(pos, 0.0, 1.0); } `; const fragmentShader = ` uniform vec3 uColor1; uniform vec3 uColor2; varying vec2 vUv; void main() { gl_FragColor = vec4(mix(uColor1, uColor2, vUv.x), 1.0); } `; const dx = 2 / conf.nx,dy = -2 / (conf.ny - 1); const ox = -1 + dx / 2,oy = 1; const mat2 = Float32Array.from([Math.cos(conf.angle), -Math.sin(conf.angle), Math.sin(conf.angle), Math.cos(conf.angle)]); for (let i = 0; i < conf.nx; i++) { const points = []; for (let j = 0; j < conf.ny; j++) { const x = ox + i * dx,y = oy + j * dy; points.push(new THREE.Vector3(x, y, 0)); } const polyline = new Polyline({ points }); polylines.push(polyline); const material = new THREE.ShaderMaterial({ uniforms: { uTime, uTimeCoef, uMat2: { value: mat2 }, uSize: { value: 1.5 / conf.nx }, uRnd1: { value: new THREE.Vector3(rnd(-1, 1), rnd(-1, 1), rnd(-1, 1)) }, uRnd2: { value: new THREE.Vector3(rnd(-1, 1), rnd(-1, 1), rnd(-1, 1)) }, uRnd3: { value: new THREE.Vector3(rnd(-1, 1), rnd(-1, 1), rnd(-1, 1)) }, .........完整代码请登录后点击上方下载按钮下载查看
网友评论0