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();
            th.........完整代码请登录后点击上方下载按钮下载查看

网友评论0