three+webgl实现跟随音乐振动的三维模型动画效果代码

代码语言:html

所属分类:三维

代码描述:three+webgl实现跟随音乐振动的三维模型动画效果代码

代码标签: three webgl 跟随 音乐 振动 三维 模型 动画

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<!DOCTYPE html>
<html lang="en" >

<head>
 
<meta charset="UTF-8">
 

   
<meta name="viewport" content="width=device-width, initial-scale=1.0">
   
<title>three.js + GSAP</title>
   
<style>
      body
{ margin: 0; overflow: hidden; user-select: none;}
      canvas
{ display: block; }
   
</style>

 
 
</head>

 
<body>
   
<script type="module">
      import * as THREE from 'https://cdn.skypack.dev/three@0.136.0/build/three.module.js';
      import { OrbitControls } from 'https://cdn.skypack.dev/three@0.136.0/examples/jsm/controls/OrbitControls.js';
      import { OBJLoader } from 'https://cdn.skypack.dev/three@0.136.0/examples/jsm/loaders/OBJLoader.js';
      import { EffectComposer } from 'https://cdn.skypack.dev/three@0.136.0/examples/jsm/postprocessing/EffectComposer.js';
      import { RenderPass } from 'https://cdn.skypack.dev/three@0.136.0/examples/jsm/postprocessing/RenderPass.js';
      import { UnrealBloomPass } from 'https://cdn.skypack.dev/three@0.136.0/examples/jsm/postprocessing/UnrealBloomPass.js';
      import { GlitchPass } from 'https://cdn.skypack.dev/three@0.136.0/examples/jsm/postprocessing/GlitchPass.js';
      import { ShaderPass } from 'https://cdn.skypack.dev/three@0.136.0/examples/jsm/postprocessing/ShaderPass.js';
      import { gsap } from 'https://cdn.skypack.dev/gsap@3.9.1';

      const scene = new THREE.Scene();
      scene.fog = new THREE.Fog(0x000000, 10, 100);
      const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
      const renderer = new THREE.WebGLRenderer({ antialias: true });
      renderer.setSize(window.innerWidth, window.innerHeight);
      document.body.appendChild(renderer.domElement);

      camera.position.set(0, 70, 0);

      gsap.to(camera.position, {
        x: Math.random() * 7 + 1,
        y: 0,
        z: 100,
        duration: 3,
        ease: 'circ.inOut(.8)'
      });

      let isAnimating = false;
      function animateCamera() {
        const time = Math.random() * 1200 - 600;
        if (isAnimating) {
          gsap.to(camera.position, {
            x: () => Math.random() * 120 - 10,
            y: () => Math.random() * 130 - 10,
            z: () => Math.random() * 120 - 30,
            duration: () => (Math.random() * 300 - time) / 1000, // Convertir en secondes
            delay: () => (Math.random() * 300   - time) / 1000, // Convertir en secondes
            ease: "power2.inOut",
            onComplete: animateCamera // Boucle
          });
        }
      }
      animateCamera();

      const controls = new OrbitControls(camera, renderer.domElement);
      controls.enableDamping = true;

      const gridGeometry = new THREE.PlaneGeometry(100, 100, 100, 100);
      const gridMaterial = new THREE.MeshStandardMaterial({ color: 0x00ff00, wireframe: true, transparent:true, opacity:0.2 });
      const grid = new THREE.Mesh(gridGeometry, gridMaterial);
      grid.rotation.x = -Math.PI / 2;
      // scene.add(grid);

      const boxGeometry = new THREE.BoxGeometry(100, 100, 100);
      const boxMaterial = new THREE.MeshStandardMaterial({ color: 0x00FF00, wireframe: true, side: THREE.DoubleSide });
      const box = new THREE.Mesh(boxGeometry, boxMaterial);
      box.position.set(0, 0, 0);
      // scene.add(box);

      const ambientLight = new THREE.AmbientLight(0xffffff, 0.5);
      scene.add(ambientLight);

      const pointLight = new THREE.PointLight('orangered', 1);
      pointLight.position.set(100, 100, 100);
      scene.add(pointLight);

      const loaderObj = new OBJLoader();
      loaderObj.load('//repo.bfw.wiki/bfwrepo/threemodel/logo/logo_vainsan.obj', function (object) {

        const OBJvertexShader = `
          varying vec3 vPosition;
          void main() {
              vPosition = position;
              gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
          }
      `;

        const OBJfragmentShader = `
          uniform vec3 color;
          uniform float opacity;
          uniform float thickness;
          uniform float dashSize;
          uniform float gapSize;
          varying vec3 vPosition;
          void main() {
              float len = length(vPosition.xy); // Simple distance calculation for dashes
              float dashFactor = mod(len, dashSize + gapSize);
              if (dashFactor > dashSize) {
                  discard; // Skip the fragment to create gaps
              }

              float edgeThickness = thickness / 100.0;
              if (mod(vPosition.x + vPosition.y + vPosition.z, 1.0) < edgeThickness) {
                  gl_FragColor = vec4(color, opacity);
              } else {
                  discard;
              }
          }
      `;

        const OBJuniforms = {
          color: { value: new THREE.Color(0x00FF00) },
          opacity: { value: 1.0 },
          thickness: { value: 16.0 },
          dashSize: { value: 0.0 },
          gapSize: { value: 0.0 },
        };

        const OBJshaderMaterial = new THREE.ShaderMaterial({
          uniforms: OBJuniforms,
          vertexShader: OBJvertexShader,
          fragmentShader: OBJfragmentShader,
          transparent: true,
        });      
        object.traverse(function (child) {
          if (child.isMesh) {
            child.material = OBJshaderMaterial;
            // child.material.wireframe = true;
          }
        });
        object.scale.set( .6, .6, 1);
        scene.add(object);

        const particlesGeometry = new THREE.BufferGeometry();
        const particlesCount = 5000;
        const positions = new Float32Array(particlesCount * 3);

        for (let i = 0; i < particlesCount; i++) {
          positions[i * 3] = Math.random() * 100 - 50;
          positions[i * 3 + 1] = Math.random() * 100 - 50;
          positions[i * 3 + 2] = Math.random() * 100 - 50;
        }

        particlesGeometry.setAttribute('position', new THREE..........完整代码请登录后点击上方下载按钮下载查看

网友评论0