threejs实现一个能量块散发能量线束动画效果代码

代码语言:html

所属分类:动画

代码描述:threejs实现一个能量块散发能量线束动画效果代码

代码标签: 能量 散发 能量 线束 动画 效果

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

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

<head>
    <meta charset="UTF-8">
    <style>
        html,
    body {
      height: 100%;
      width: 100%;
    }
    body {
      font-size: 62.5%;
      background: #fff;
      overflow: hidden;
      color: #fff;
      font-family: serif;
      -ms-scroll-chaining: none;
          overscroll-behavior: none;
    }
    #loading {
      background: #000;
      position: fixed;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      z-index: 9999;
      display: flex;
      justify-content: center;
      align-items: center;
      visibility: visible;
      opacity: 1;
      transition: visibility 1.6s, opacity 1.6s;
    }
    #loading .circle {
      width: 50px;
      height: 50px;
      background: #fff;
      border-radius: 50%;
      opacity: 0;
      transform: scale(0, 0);
      -webkit-animation: circle-animation 1.6s ease-in-out 0s infinite normal none;
              animation: circle-animation 1.6s ease-in-out 0s infinite normal none;
    }
    #loading.loaded {
      visibility: hidden;
      opacity: 0;
    }
    #container {
      width: 100%;
      height: 100%;
    }
    #container .box {
      color: #fff;
      font-size: 3.2rem;
      position: fixed;
      z-index: 1;
      top: 50%;
      left: 10%;
      transform: translateY(-50%);
      overflow: hidden;
    }
    #container .box h1 {
      letter-spacing: 0.4rem;
      padding-bottom: 0.8rem;
    }
    #container .box h1::after {
      content: '';
      position: absolute;
      height: 4px;
      width: 100%;
      background: #fff;
      bottom: 0.8rem;
      left: 0;
    }
    #container .box p {
      font-size: 0.8rem;
    }
    #container .box .expansion {
      font-size: 6.4rem;
    }
    /** css animation */
    @-webkit-keyframes circle-animation {
      0% {
        opacity: 0;
        transform: scale(0, 0);
      }
      50% {
        opacity: 1;
        transform: scale(1, 1);
      }
    }
    @keyframes circle-animation {
      0% {
        opacity: 0;
        transform: scale(0, 0);
      }
      50% {
        opacity: 1;
        transform: scale(1, 1);
      }
    }
    </style>
</head>

<body>
    <div id="loading">
        <div class="circle"></div>
    </div>
    <div id="container">
        <div class="box">
        </div>
    </div>
    <script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/Stats-16.js"></script>
    <script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/dat.gui-min.js"></script>
    <script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/three.126.js"></script>
    <script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/OrbitControls.126.js"></script>
    <script>
        // vertex shader source
        const vertexParticleShader = `
        uniform float uTime;
        uniform float uAmplitude;
        
        varying vec3 vPos;
        
        float PI = 3.14159265359;
        
        attribute float number;
        
        float a = 5.0;
        float b = 3.14159265359 / 3.0;
        float c = 7.0;
        float d = 3.14159265359 / 5.0;
        
        void main(){
          vec3 pos = position.xyz;
          
          pos.x = cos(a * number + b + uTime) * uAmplitude;
          pos.y = cos(c * number + d + uTime) * uAmplitude;
          pos.z = tan(number + uTime) * uAmplitude;
          
          vPos = pos;
          
          vec4 mvPosition = modelViewMatrix * vec4(pos, 1.0);
          
          gl_Position = projectionMatrix * mvPosition;
        }
        
        `;
        
        // fragment shader source
        const fragmentParticleShader = `
        uniform float uTime;
        
        varying vec3 vPos;
        
        vec3 pal( in float t, in vec3 a, in vec3 b, in vec3 c, in vec3 d ) {
          return a + b*cos( 6.28318*(c*t+d) );
        }
        
        void main () {
          float len = length(vPos);
          
          vec3 color =
            pal(
              length(len * 0.001 - uTime * 0.5),
              vec3(0.5,0.5,0.5),vec3(0.5,0.5,0.5),vec3(2.0,1.0,0.0),vec3(0.5,0.20,0.25)
            );
          
          gl_FragColor = vec4(color, 0.4);
        }
        `;
        
        const vertexBoxShader = `
        uniform float uTime;
        uniform float uAmplitude;
        
        varying vec3 vPos;
        
        float PI = 3.14159265359;
        
        attribute float number;
        
        float a = 5.0;
        float b = 3.14159265359 / 3.0;
        float c = 7.0;
        float d = 3.14159265359 / 5.0;
        
        void main(){
          vec3 pos = position.xyz;
          
          vPos = pos;
          
          vec4 mvPosition = modelViewMatrix * vec4(pos, 1.0);
          
          //gl_PointSize = 60.0 * (120.0 / - mvPosition.z);
          gl_Position = projectionMatrix * mvPosition;
        }
        `;
        
        const fragmentBoxShader = `
        uniform float uTime;
        
        varying vec3 vPos;
        
        // Referred to https://iquilezles.org/www/articles/palettes/palettes.htm
        // Thank you so much.
        vec3 pal( in float t, in vec3 a, in vec3 b, in vec3 c, in vec3 d ) {
          return a + b*cos( 6.28318*(c*t+d) );
        }
        
        void main () {
          //float f = length(gl_PointCoord - vec2(0.5, 0.5));
          //if (f > 0.1) discard;
          
          float len = length(vPos);
          
          vec3 color =
            pal(
              length(len * 0.01 - uTime * 0.5),
              vec3(0.5,0.5,0.5),vec3(0.5,0.5,0.5),vec3(2.0,1.0,0.0),vec3(0.5,0.20,0.25)
            );
          
          gl_FragColor = vec4(color, 0.4);
        }
        `;
        
        /**
         * Dat class
         */
        class Dat {
          constructor(sketch) {
            this.sketch = sketch;
          
            this.initialize();
          }
          
          initialize() {
            this.gui = new dat.GUI();
            this.parameters = this.setParameters();
            this.controller = this.setController();
            this.gui.close();
          }
          
          setParameters() {
            let parameters;
          
            parameters = {
              number: 1000,
              amplitude: 100.0
            };
        
            return parameters;
          }
          
          setController() {
            let controller;
          
            controller = {
              number: this.gui.add(this.parameters, 'number', 100, 50000, 100)
                .onChange(() => this.sketch.initialize()),
              amplitude: this.gui.add(this.parameters, 'amplitude', 0.0, 1000.0, 1.0)
                .onChange(() => this.sketch.initialize())
            };
        
            return controller;
          }
        }
        
        /**
         * Mouse class
         */
        class Mouse {
          constructor(sketch) {
            this.sketch = sketch;
        
            this.initialize();
          }
          
          initialize() {
            this.mouse = new THREE.Vector3();
            this.touchStart = new THREE.Vector3();
            this.touchMove = new THREE.Vector3();
            this.touchEnd = new THREE.Vector3();
            
            this.delta = 1;
            
            this.setupEvents();
          }
          
          setupEvents() {
            this.sketch.renderer.domElement.addEventListener('mousemove', this.onMousemove.bind(this), false);
            this.sketch.renderer.domElement.addEventListener('touchstart', this.onTouchstart.bind(this), false);
            this.sketch.renderer.domElement.addEventListener('touchmove', this.onTouchmove.bind(this), false);
            this.sketch.renderer.domElement.addEventListener('touchend', this.onTouchend.bind(this), false);
            this.sketch.renderer.domElement.addEventListener('onWheel', this.onWheel.bind(this), false);
          }
          
          onMousemove(e) {
            this.mouse.x = (e.clientX / window.innerWidth) * 2 - 1;
            this.mouse.y = -(e.clientY / window.innerHeight) * 2 + 1;
            this.mouse.z = 0;
          }
          
          onTouchstart(e) {
            const touch = e.targetTouches[0];
          
            this.touchStart.x = touch.pageX;
            this.touchStart.y = touch.pageY;
            this.touchStart.z = 0.0;
        
            this.mouse.x = (touch.pageX / window.innerWidth) * 2 - 1;
            this.mouse.y = -(touch.pageY / window.innerHeight) * 2 + 1;
            this.mouse.z = 0;
          }
          
          onTouchmove(e) {
            const touch = e.targetTouches[0];
        
            this.touchMove.x = touch.pageX;
            this.touchMove.y = touch.pageY;
            this.touchMove.z = 0.0;
        
            this.touchEnd.x = this.touchStart.x - this.touchMove.x;
            this.touchEnd.y = this.touchStart.y - this.touchMove.y;
            this.touchEnd.z = 0.0;
        
            this.mouse.x = (touch.pageX / window.innerWidth) * 2 - 1;
            this.mouse.y = -(touch.pageY / window.innerHeight) * 2 + 1;
            this.mouse.z = 0;
.........完整代码请登录后点击上方下载按钮下载查看

网友评论0