0


某音上很火的圣诞树分享

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

效果截图(这里不给动态了,某音到处都是了):
在这里插入图片描述
源代码:

<scriptsrc="https://cdn.jsdelivr.net/npm/[email protected]/build/three.min.js"></script><scriptsrc="https://cdn.jsdelivr.net/npm/[email protected]/examples/js/postprocessing/EffectComposer.js"></script><scriptsrc="https://cdn.jsdelivr.net/npm/[email protected]/examples/js/postprocessing/RenderPass.js"></script><scriptsrc="https://cdn.jsdelivr.net/npm/[email protected]/examples/js/postprocessing/ShaderPass.js"></script><scriptsrc="https://cdn.jsdelivr.net/npm/[email protected]/examples/js/shaders/CopyShader.js"></script><scriptsrc="https://cdn.jsdelivr.net/npm/[email protected]/examples/js/shaders/LuminosityHighPassShader.js"></script><scriptsrc="https://cdn.jsdelivr.net/npm/[email protected]/examples/js/postprocessing/UnrealBloomPass.js"></script><divid="overlay"><ul><liclass="title">Select Music</li><li><buttonclass="btn"id="btnA"type="button">
        Snowflakes Falling Down by Simon Panrucker
      </button></li><li><buttonclass="btn"id="btnB"type="button">This Christmas by Dott</button></li><li><buttonclass="btn"id="btnC"type="button">No room at the inn by TRG Banks</button></li><li><buttonclass="btn"id="btnD"type="button">Jingle Bell Swing by Mark Smeby</button></li><liclass="separator">OR</li><li><inputtype="file"id="upload"hidden/><labelfor="upload">Upload File</label></li></ul></div>
const{PI, sin, cos }= Math;constTAU=2*PI;constmap=(value, sMin, sMax, dMin, dMax)=>{return dMin +((value - sMin)/(sMax - sMin))*(dMax - dMin);};constrange=(n, m =0)=>Array(n).fill(m).map((i, j)=> i + j);constrand=(max, min =0)=> min + Math.random()*(max - min);constrandInt=(max, min =0)=> Math.floor(min + Math.random()*(max - min));constrandChoise=(arr)=> arr[randInt(arr.length)];constpolar=(ang, r =1)=>[r *cos(ang), r *sin(ang)];let scene, camera, renderer, analyser;let step =0;const uniforms ={time:{type:"f",value:0.0},step:{type:"f",value:0.0},};const params ={exposure:1,bloomStrength:0.9,bloomThreshold:0,bloomRadius:0.5,};let composer;const fftSize =2048;const totalPoints =4000;const listener =newTHREE.AudioListener();const audio =newTHREE.Audio(listener);

document.querySelector("input").addEventListener("change", uploadAudio,false);const buttons = document.querySelectorAll(".btn");
buttons.forEach((button, index)=>
  button.addEventListener("click",()=>loadAudio(index)));functioninit(){const overlay = document.getElementById("overlay");
  overlay.remove();

  scene =newTHREE.Scene();
  renderer =newTHREE.WebGLRenderer({antialias:true});
  renderer.setPixelRatio(window.devicePixelRatio);
  renderer.setSize(window.innerWidth, window.innerHeight);
  document.body.appendChild(renderer.domElement);

  camera =newTHREE.PerspectiveCamera(60,
    window.innerWidth / window.innerHeight,1,1000);
  camera.position.set(-0.09397456774197047,-2.5597086635726947,24.420789670889008)
  camera.rotation.set(0.10443543723052419,-0.003827152981119352,0.0004011488708739715)const format = renderer.capabilities.isWebGL2
    ?THREE.RedFormat
    :THREE.LuminanceFormat;

  uniforms.tAudioData ={value:newTHREE.DataTexture(analyser.data, fftSize /2,1, format),};addPlane(scene, uniforms,3000);addSnow(scene, uniforms);range(10).map((i)=>{addTree(scene, uniforms, totalPoints,[20,0,-20* i]);addTree(scene, uniforms, totalPoints,[-20,0,-20* i]);});const renderScene =newTHREE.RenderPass(scene, camera);const bloomPass =newTHREE.UnrealBloomPass(newTHREE.Vector2(window.innerWidth, window.innerHeight),1.5,0.4,0.85);
  bloomPass.threshold = params.bloomThreshold;
  bloomPass.strength = params.bloomStrength;
  bloomPass.radius = params.bloomRadius;

  composer =newTHREE.EffectComposer(renderer);
  composer.addPass(renderScene);
  composer.addPass(bloomPass);addListners(camera, renderer, composer);animate();}functionanimate(time){
  analyser.getFrequencyData();
  uniforms.tAudioData.value.needsUpdate =true;
  step =(step +1)%1000;
  uniforms.time.value = time;
  uniforms.step.value = step;
  composer.render();requestAnimationFrame(animate);}functionloadAudio(i){
  document.getElementById("overlay").innerHTML ='<div class="text-loading">Please Wait...</div>';const files =["https://files.freemusicarchive.org/storage-freemusicarchive-org/music/no_curator/Simon_Panrucker/Happy_Christmas_You_Guys/Simon_Panrucker_-_01_-_Snowflakes_Falling_Down.mp3","https://files.freemusicarchive.org/storage-freemusicarchive-org/music/no_curator/Dott/This_Christmas/Dott_-_01_-_This_Christmas.mp3","https://files.freemusicarchive.org/storage-freemusicarchive-org/music/ccCommunity/TRG_Banks/TRG_Banks_Christmas_Album/TRG_Banks_-_12_-_No_room_at_the_inn.mp3","https://files.freemusicarchive.org/storage-freemusicarchive-org/music/ccCommunity/Mark_Smeby/En_attendant_Nol/Mark_Smeby_-_07_-_Jingle_Bell_Swing.mp3",];const file = files[i];const loader =newTHREE.AudioLoader();
    loader.load(file,function(buffer){
      audio.setBuffer(buffer);
      audio.play();
      analyser =newTHREE.AudioAnalyser(audio, fftSize);init();});}functionuploadAudio(event){
  document.getElementById("overlay").innerHTML ='<div class="text-loading">Please Wait...</div>';const files = event.target.files;const reader =newFileReader();

  reader.onload=function(file){var arrayBuffer = file.target.result;

    listener.context.decodeAudioData(arrayBuffer,function(audioBuffer){
      audio.setBuffer(audioBuffer);
      audio.play();
      analyser =newTHREE.AudioAnalyser(audio, fftSize);init();});};

  reader.readAsArrayBuffer(files[0]);}functionaddTree(scene, uniforms, totalPoints, treePosition){const vertexShader =`
  attribute float mIndex;
  varying vec3 vColor;
  varying float opacity;
  uniform sampler2D tAudioData;

  float norm(float value, float min, float max ){
      return (value - min) / (max - min);
  }
  float lerp(float norm, float min, float max){
  return (max - min) * norm + min;
  }

  float map(float value, float sourceMin, float sourceMax, float destMin, float destMax){
  return lerp(norm(value, sourceMin, sourceMax), destMin, destMax);
  }

  void main() {
      vColor = color;
      vec3 p = position;
      vec4 mvPosition = modelViewMatrix * vec4( p, 1.0 );
      float amplitude = texture2D( tAudioData, vec2( mIndex, 0.1 ) ).r;
      float amplitudeClamped = clamp(amplitude-0.4,0.0, 0.6 );
      float sizeMapped = map(amplitudeClamped, 0.0, 0.6, 1.0, 20.0);
      opacity = map(mvPosition.z , -200.0, 15.0, 0.0, 1.0);
      gl_PointSize = sizeMapped * ( 100.0 / -mvPosition.z );
      gl_Position = projectionMatrix * mvPosition;
  }
`;const fragmentShader =`
  varying vec3 vColor;
  varying float opacity;
  uniform sampler2D pointTexture;
  void main() {
      gl_FragColor = vec4( vColor, opacity );
      gl_FragColor = gl_FragColor * texture2D( pointTexture, gl_PointCoord ); 
  }
  `;const shaderMaterial =newTHREE.ShaderMaterial({uniforms:{...uniforms,pointTexture:{value:newTHREE.TextureLoader().load(`https://assets.codepen.io/3685267/spark1.png`),},},
    vertexShader,
    fragmentShader,blending:THREE.AdditiveBlending,depthTest:false,transparent:true,vertexColors:true,});const geometry =newTHREE.BufferGeometry();const positions =[];const colors =[];const sizes =[];const phases =[];const mIndexs =[];const color =newTHREE.Color();for(let i =0; i < totalPoints; i++){const t = Math.random();const y =map(t,0,1,-8,10);const ang =map(t,0,1,0,6*TAU)+(TAU/2)*(i %2);const[z, x]=polar(ang,map(t,0,1,5,0));const modifier =map(t,0,1,1,0);
    positions.push(x +rand(-0.3* modifier,0.3* modifier));
    positions.push(y +rand(-0.3* modifier,0.3* modifier));
    positions.push(z +rand(-0.3* modifier,0.3* modifier));

    color.setHSL(map(i,0, totalPoints,1.0,0.0),1.0,0.5);

    colors.push(color.r, color.g, color.b);
    phases.push(rand(1000));
    sizes.push(1);const mIndex =map(i,0, totalPoints,1.0,0.0);
    mIndexs.push(mIndex);}

  geometry.setAttribute("position",newTHREE.Float32BufferAttribute(positions,3).setUsage(THREE.DynamicDrawUsage
    ));
  geometry.setAttribute("color",newTHREE.Float32BufferAttribute(colors,3));
  geometry.setAttribute("size",newTHREE.Float32BufferAttribute(sizes,1));
  geometry.setAttribute("phase",newTHREE.Float32BufferAttribute(phases,1));
  geometry.setAttribute("mIndex",newTHREE.Float32BufferAttribute(mIndexs,1));const tree =newTHREE.Points(geometry, shaderMaterial);const[px, py, pz]= treePosition;

  tree.position.x = px;
  tree.position.y = py;
  tree.position.z = pz;

  scene.add(tree);}functionaddSnow(scene, uniforms){const vertexShader =`
  attribute float size;
  attribute float phase;
  attribute float phaseSecondary;

  varying vec3 vColor;
  varying float opacity;

  uniform float time;
  uniform float step;

  float norm(float value, float min, float max ){
      return (value - min) / (max - min);
  }
  float lerp(float norm, float min, float max){
      return (max - min) * norm + min;
  }

  float map(float value, float sourceMin, float sourceMax, float destMin, float destMax){
      return lerp(norm(value, sourceMin, sourceMax), destMin, destMax);
  }
  void main() {
      float t = time* 0.0006;

      vColor = color;

      vec3 p = position;

      p.y = map(mod(phase+step, 1000.0), 0.0, 1000.0, 25.0, -8.0);

      p.x += sin(t+phase);
      p.z += sin(t+phaseSecondary);

      opacity = map(p.z, -150.0, 15.0, 0.0, 1.0);

      vec4 mvPosition = modelViewMatrix * vec4( p, 1.0 );

      gl_PointSize = size * ( 100.0 / -mvPosition.z );

      gl_Position = projectionMatrix * mvPosition;

  }
  `;const fragmentShader =`
  uniform sampler2D pointTexture;
  varying vec3 vColor;
  varying float opacity;

  void main() {
      gl_FragColor = vec4( vColor, opacity );
      gl_FragColor = gl_FragColor * texture2D( pointTexture, gl_PointCoord ); 
  }
  `;functioncreateSnowSet(sprite){const totalPoints =300;const shaderMaterial =newTHREE.ShaderMaterial({uniforms:{...uniforms,pointTexture:{value:newTHREE.TextureLoader().load(sprite),},},
      vertexShader,
      fragmentShader,blending:THREE.AdditiveBlending,depthTest:false,transparent:true,vertexColors:true,});const geometry =newTHREE.BufferGeometry();const positions =[];const colors =[];const sizes =[];const phases =[];const phaseSecondaries =[];const color =newTHREE.Color();for(let i =0; i < totalPoints; i++){const[x, y, z]=[rand(25,-25),0,rand(15,-150)];
      positions.push(x);
      positions.push(y);
      positions.push(z);

      color.set(randChoise(["#f1d4d4","#f1f6f9","#eeeeee","#f1f1e8"]));

      colors.push(color.r, color.g, color.b);
      phases.push(rand(1000));
      phaseSecondaries.push(rand(1000));
      sizes.push(rand(4,2));}

    geometry.setAttribute("position",newTHREE.Float32BufferAttribute(positions,3));
    geometry.setAttribute("color",newTHREE.Float32BufferAttribute(colors,3));
    geometry.setAttribute("size",newTHREE.Float32BufferAttribute(sizes,1));
    geometry.setAttribute("phase",newTHREE.Float32BufferAttribute(phases,1));
    geometry.setAttribute("phaseSecondary",newTHREE.Float32BufferAttribute(phaseSecondaries,1));const mesh =newTHREE.Points(geometry, shaderMaterial);

    scene.add(mesh);}const sprites =["https://assets.codepen.io/3685267/snowflake1.png","https://assets.codepen.io/3685267/snowflake2.png","https://assets.codepen.io/3685267/snowflake3.png","https://assets.codepen.io/3685267/snowflake4.png","https://assets.codepen.io/3685267/snowflake5.png",];
  sprites.forEach((sprite)=>{createSnowSet(sprite);});}functionaddPlane(scene, uniforms, totalPoints){const vertexShader =`
  attribute float size;
  attribute vec3 customColor;
  varying vec3 vColor;

  void main() {
      vColor = customColor;
      vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );
      gl_PointSize = size * ( 300.0 / -mvPosition.z );
      gl_Position = projectionMatrix * mvPosition;

  }
  `;const fragmentShader =`
  uniform vec3 color;
  uniform sampler2D pointTexture;
  varying vec3 vColor;

  void main() {
      gl_FragColor = vec4( vColor, 1.0 );
      gl_FragColor = gl_FragColor * texture2D( pointTexture, gl_PointCoord );

  }
  `;const shaderMaterial =newTHREE.ShaderMaterial({uniforms:{...uniforms,pointTexture:{value:newTHREE.TextureLoader().load(`https://assets.codepen.io/3685267/spark1.png`),},},
    vertexShader,
    fragmentShader,blending:THREE.AdditiveBlending,depthTest:false,transparent:true,vertexColors:true,});const geometry =newTHREE.BufferGeometry();const positions =[];const colors =[];const sizes =[];const color =newTHREE.Color();for(let i =0; i < totalPoints; i++){const[x, y, z]=[rand(-25,25),0,rand(-150,15)];
    positions.push(x);
    positions.push(y);
    positions.push(z);

    color.set(randChoise(["#93abd3","#f2f4c0","#9ddfd3"]));

    colors.push(color.r, color.g, color.b);
    sizes.push(1);}

  geometry.setAttribute("position",newTHREE.Float32BufferAttribute(positions,3).setUsage(THREE.DynamicDrawUsage
    ));
  geometry.setAttribute("customColor",newTHREE.Float32BufferAttribute(colors,3));
  geometry.setAttribute("size",newTHREE.Float32BufferAttribute(sizes,1));const plane =newTHREE.Points(geometry, shaderMaterial);

  plane.position.y =-8;
  scene.add(plane);}functionaddListners(camera, renderer, composer){
  document.addEventListener("keydown",(e)=>{const{ x, y, z }= camera.position;
    console.log(`camera.position.set(${x},${y},${z})`);const{x: a,y: b,z: c }= camera.rotation;
    console.log(`camera.rotation.set(${a},${b},${c})`);});

  window.addEventListener("resize",()=>{const width = window.innerWidth;const height = window.innerHeight;

      camera.aspect = width / height;
      camera.updateProjectionMatrix();

      renderer.setSize(width, height);
      composer.setSize(width, height);},false);}
*{box-sizing: border-box;}body{margin: 0;height: 100vh;overflow: hidden;display: flex;align-items: center;justify-content: center;background: #161616;color: #c5a880;font-family: sans-serif;}label{display: inline-block;background-color: #161616;padding: 16px;border-radius: 0.3rem;cursor: pointer;margin-top: 1rem;width: 300px;border-radius: 10px;border: 1px solid #c5a880;text-align: center;}ul{list-style-type: none;padding: 0;margin: 0;}.btn{background-color: #161616;border-radius: 10px;color: #c5a880;border: 1px solid #c5a880;padding: 16px;width: 300px;margin-bottom: 16px;line-height: 1.5;cursor: pointer;}.separator{font-weight: bold;text-align: center;width: 300px;margin: 16px 0px;color: #a07676;}.title{color: #a07676;font-weight: bold;font-size: 1.25rem;margin-bottom: 16px;}.text-loading{font-size: 2rem;}
标签: css 前端 javascript

本文转载自: https://blog.csdn.net/qq_35241329/article/details/134912433
版权归原作者 timi先生 所有, 如有侵权,请联系我们删除。

“某音上很火的圣诞树分享”的评论:

还没有评论