three实现三维边框小球旋转故障闪烁动画效果代码

代码语言:html

所属分类:三维

代码描述:three实现三维边框小球旋转故障闪烁动画效果代码

代码标签: three 三维 边框 小球 旋转 故障 闪烁 动画

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

<!DOCTYPE html>
<html lang="en" >
<head>
  <meta charset="UTF-8">

<style>
    html,
body {
  padding: 0;
  margin: 0;
  width: 100%;
  height: 100%;
  overflow: hidden;
}
h1 {
  color: white;
  font-family: VT323;
  position: absolute;
  top: 70vh;
  left: 50vw;
  font-weight: normal;
  text-transform: uppercase;
  letter-spacing: 0.3em;
  width: 100%;
  transform: translate(-50%, -50%);
  font-size: 12px;
  text-align: center;
}
</style>

</head>
<body>
<!-- partial:index.partial.html -->
<h1>// Scanning your memories...</h1>
<!-- partial -->
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/three.84.js"></script>
<script >
      
      function buildScene() {

  var scene = new THREE.Scene();
  var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);

  var renderer = new THREE.WebGLRenderer();
  var composer = new THREE.EffectComposer(renderer);
  renderer.setSize(window.innerWidth, window.innerHeight);
  composer.setSize(window.innerWidth, window.innerHeight);
  document.body.appendChild(renderer.domElement);

  function onWindowResize() {
    camera.aspect = window.innerWidth / window.innerHeight;
    camera.updateProjectionMatrix();
    renderer.setSize(window.innerWidth, window.innerHeight);
    composer.setSize(window.innerWidth, window.innerHeight);
  }

  window.addEventListener('resize', onWindowResize, false);

  var cubeGroup = new THREE.Group();
  scene.add(cubeGroup);

  function makeRing(radius, parent) {
    var geometry = new THREE.CylinderGeometry(radius, radius, 0.1, 64);
    var edges = new THREE.EdgesGeometry(geometry);
    var line = new THREE.LineSegments(edges, new THREE.LineBasicMaterial({ color: 0x11ee77 }));
    parent.add(line);
    return line;
  };

  var ring0 = makeRing(3, scene);
  var ring1 = makeRing(3.3, ring0);
  var ring2 = makeRing(3.6, ring1);

  (function () {
    var geometry = new THREE.OctahedronGeometry(2, 3);
    var material = new THREE.MeshPhongMaterial({ color: 0x444444, opacity: 0.8, transparent: true });
    var cube = new THREE.Mesh(geometry, material);
    cubeGroup.add(cube);

    var edges = new THREE.EdgesGeometry(geometry);
    var line = new THREE.LineSegments(edges, new THREE.LineBasicMaterial({ color: 0x1188dd }));
    line.scale.set(1.1, 1.1, 1.1);
    cubeGroup.add(line);
  })();

  var cylinder = function () {
    var geometry = new THREE.CylinderGeometry(8, 8, 1000, 3);
    const edges = new THREE.EdgesGeometry(geometry);
    const cylinder = new THREE.LineSegments(edges, new THREE.LineBasicMaterial({ color: 0x444444 }));
    cylinder.rotation.set(Math.PI / 2, 0, 0);
    scene.add(cylinder);

    return cylinder;
  }();

  var light = new THREE.DirectionalLight(0xFFFFFF, 1);
  scene.add(light);

  camera.position.z = 8;

  var renderScene = new THREE.RenderPass(scene, camera);
  var glitchPass = new THREE.GlitchPass();
  var bloomPass = new THREE.UnrealBloomPass(new THREE.Vector2(window.innerWidth, window.innerHeight), 3, 1, 0.4);
  var copyShader = new THREE.ShaderPass(THREE.CopyShader);
  copyShader.renderToScreen = true;

  composer.addPass(renderScene);
  composer.addPass(glitchPass);
  composer.addPass(bloomPass);
  composer.addPass(copyShader);

  function render() {
    cubeGroup.rotation.x += 0.01;
    cubeGroup.rotation.y += 0.03;
    ring0.rotation.x += 0.011;
    ring0.rotation.y += 0.032;
    ring1.rotation.z += 0.013;
    ring1.rotation.y += 0.034;
    ring2.rotation.x += 0.015;
    ring2.rotation.y += 0.036;
    cylinder.rotation.y += 0.002;
    cylinder.rotation.x -= 0.001;
    cylinder.rotation.z += 0.003;
    requestAnimationFrame(render);

    composer.render();
  }
  render();
}

// Everything here down was pulled from ThreeJS Examples under postprocessing and shaders.

/**
 * @author alteredq / http://alteredqualia.com/
 *
 * Full-screen textured quad shader
 */

THREE.CopyShader = {

  uniforms: {

    "tDiffuse": { value: null },
    "opacity": { value: 1.0 } },



  vertexShader: [

  "varying vec2 vUv;",

  "void main() {",

  "vUv = uv;",
  "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",

  "}"].

  join("\n"),

  fragmentShader: [

  "uniform float opacity;",

  "uniform sampler2D tDiffuse;",

  "varying vec2 vUv;",

  "void main() {",

  "vec4 texel = texture2D( tDiffuse, vUv );",
  "gl_FragColor = opacity * texel;",

  "}"].

  join("\n") };



/**
 * @author felixturner / http://airtight.cc/
 *
 * RGB Shift Shader
 * Shifts red and blue channels from center in opposite directions
 * Ported from http://kriss.cx/tom/2009/05/rgb-shift/
 * by Tom Butterworth / http://kriss.cx/tom/
 *
 * amount: shift distance (1 is width of input)
 * angle: shift angle in radians
 */

THREE.DigitalGlitch = {

  uniforms: {

    "tDiffuse": { value: null }, //diffuse texture
    "tDisp": { value: null }, //displacement texture for digital glitch squares
    "byp": { value: 0 }, //apply the glitch ?
    "amount": { value: 0.08 },
    "angle": { value: 0.02 },
    "seed": { value: 0.02 },
    "seed_x": { value: 0.02 }, //-1,1
    "seed_y": { value: 0.02 }, //-1,1
    "distortion_x": { value: 0.5 },
    "distortion_y": { value: 0.6 },
    "col_s": { value: 0.05 } },


  vertexShader: [

  "varying vec2 vUv;",
  "void main() {",
  "vUv = uv;",
  "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
  "}"].
  join("\n"),

  fragmentShader: [
  "uniform int byp;", //should we apply the glitch ?

  "uniform sampler2D tDiffuse;",
  "uniform sampler2D tDisp;",

  "uniform float amount;",
  "uniform float angle;",
  "uniform float seed;",
  "uniform float seed_x;",
  "uniform float seed_y;",
  "uniform float distortion_x;",
  "uniform float distortion_y;",
  "uniform float col_s;",

  "varying vec2 vUv;",


  "float rand(vec2 co){",
  "return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);",
  "}",

  "void main() {",
  "if(byp<1) {",
  "vec2 p = vUv;",
  "float xs = floor(gl_FragCoord.x / 0.5);",
  "float ys = floor(gl_FragCoord.y / 0.5);",
  //based on staffantans glitch shader for unity https://github.com/staffantan/unityglitch
  "vec4 normal = texture2D (tDisp, p*seed*seed);",
  "if(p.y<distortion_x+col_s && p.y>distortion_x-col_s*seed) {",
  "if(seed_x>0.){",
  "p.y = 1. - (p.y + distortion_y);",
  "}",
  "else {",
  "p.y = distortion_y;",
  "}",
  "}",
  "if(p.x<distortion_y+col_s && p.x>distortion_y-col_s*seed) {",
  "if(seed_y>0.){",
  "p.x=distortion_x;",
  "}",
  "else {",
  "p.x = 1. - (p.x + distortion_x);",
  "}",
  "}",
  "p.x+=normal.x*seed_x*(seed/5.);",
  "p.y+=normal.y*seed_y*(seed/5.);",
  //base from RGB shift shader
  "vec2 offset = amount * vec2( cos(angle), sin(angle));",
  "vec4 cr = texture2D(tDiffuse, p + offset);",
  "vec4 cga = texture2D(tDiffuse, p);",
  "vec4 cb = texture2D(tDiffuse, p - offset);",
  "gl_FragColor = vec4(cr.r, cga.g, cb.b, cga.a);",
  //add noise
  "vec4 snow = 200.*amount*vec4(rand(vec2(xs * seed,ys * seed*50.))*0.2);",
  "gl_FragColor = gl_FragColor+ snow;",
  "}",
  "else {",
  "gl_FragColor=texture2D (tDiffuse, vUv);",
  "}",
  "}"].

  join("\n") };



/**
 * @author alteredq / http://alteredqualia.com/
 */

THREE.EffectComposer = function (renderer, renderTarget) {

  this.renderer = renderer;

  if (renderTarget === undefined) {

    var parameters = {
      minFilter: THREE.LinearFilter,
      magFilter: THREE.LinearFilter,
      format: THREE.RGBAFormat,
      stencilBuffer: false };


    var size = renderer.getSize();
    renderTarget = new THREE.WebGLRenderTarget(size.width, size.height, parameters);
    renderTarget.texture.name = 'EffectComposer.rt1';

  }

  this.renderTarget1 = renderTarget;
  this.renderTarget2 = renderTarget.clone();
  this.renderTarget2.texture.name = 'EffectComposer.rt2';

  this.writeBuffer = this.renderTarget1;
  this.readBuffer = this.renderTarget2;

  this.passes = [];

  // dependencies

  if (THREE.CopyShader === undefined) {

    console.error('THREE.EffectComposer relies on THREE.CopyShader');

  }

  if (THREE.ShaderPass === undefined) {

    console.error('THREE.EffectComposer relies on THREE.ShaderPass');

  }

  this.copyPass = new THREE.ShaderPass(THREE.CopyShader);

};

Object.assign(THREE.EffectComposer.prototype, {

  swapBuffers: function () {

    var tmp = this.readBuffer;
    this.readBuffer = this.writeBuffer;
    this.writeBuffer = tmp;

  },

  addPass: function (pass) {

    this.passes.push(pass);

    var size = this.renderer.getSize();
    pass.setSize(size.width, size.height);

  },

  insertPass: function (pass, index) {

    this.passes.splice(index, 0, pass);

  },

  render: function (delta) {

    var maskActive = false;

    var pass,i,il = this.passes.length;

    for (i = 0; i < il; i++) {

      pass = this.passes[i];

      if (pass.enabled === false) continue;

      pass.render(this.renderer, this.writeBuffer, this.readBuffer, delta, maskActive);

      if (pass.needsSwap) {

        if (maskActive) {

          var context = this.renderer.context;

          context.stencilFunc(context.NOTEQUAL, 1, 0xffffffff);

          this.copyPass.render(this.renderer, this.writeBuffer, this.readBuffer, delta);

          context.stencilFunc(context.EQUAL, 1, 0xffffffff);

        }

        this.swapBuffers();

      }

      if (THREE.MaskPass !== undefined) {

        if (pass instanceof THREE.MaskPass) {

          maskActive = true;

        } else if (pass instanceof THREE.ClearMaskPass) {

          maskActive = false;

        }

      }

    }

  },

  reset: function (renderTarget) {

    if (renderTarget === undefined) {

      var size = this.renderer.getSize();

      renderTarget = this.renderTarget1.clone();
      renderTarget.setSize(size.width, size.height);

    }

    this.renderTarget1.dispose();
    this.renderTarget2.dispose();
    this.renderTarget1 = renderTarget;
    this.renderTarget2 = renderTarget.clone();

    this.writeBuffer = this.renderTarget1;
    this.readBuffer = this.renderTarget2;

  },

  setSize: function (width, height) {

    this.renderTarget1.setSize(width, height);
    this.renderTarget2.setSize(width, height);

    for (var i = 0; i < this.passes.length; i++) {

      this.passes[i].setSize(width, height);

    }

  } });




THREE.Pass = function () {

  // if set to true, the pass is processed by the composer
  this.enabled = true;

  // if set to true, the pass indicates to swap read and write buffer after rendering
  this.needsSwap = true;

  // if set to true, the pass clears its buffer before rendering
  this.clear = false;

  // if set to true, the result of the pass is rendered to screen
  this.renderToScreen = false;

};

Object.assign(THREE.Pass.prototype, {

  setSize: function (width, height) {},

  render: function (renderer, writeBuffer, readBuffer, delta, maskActive) {

    console.error('THREE.Pass: .render() must be implemented in derived pass.');

  } });




/**
 * @author alteredq / http://alteredqualia.com/
 */

THREE.RenderPass = function (scene, camera, overrideMaterial, clearColor, clearAlpha) {

  THREE.Pass.call(this);

  this.scene = scene;
  this.camera = camera;

  this.overrideMaterial = overrideMaterial;

  this.clearColor = clearColor;
  this.clearAlpha = clearAlpha !== undefined ? clearAlpha : 0;

  this.clear = true;
  this.clearDepth = false;
  this.needsSwap = false;

};

THREE.RenderPass.prototype = Object.assign(Object.create(THREE.Pass.prototype), {

  constructor: THREE.RenderPass,

  render: function (renderer, writeBuffer, readBuffer, delta, maskActive) {

    var oldAutoClear = renderer.autoClear;
    renderer.autoClear = false;

    this.scene.overrideMaterial = this.overrideMaterial;

    var oldClearColor, oldClearAlpha;

    if (this.clearColor) {

      oldClearColor = renderer.getClearColor().getHex();
      oldClearAlpha = renderer.getClearAlpha();

      renderer.setClearColor(this.clearColor, this.clearAlpha);

    }

    if (this.clearDepth) {

      renderer.clearDepth();

    }

    renderer.render(this.scene, this.camera, this.renderToScreen ? null : readBuffer, this.clear);

    if (this.clearColor) {

      renderer.setClearColor(oldClearColor, oldClearAlpha);

    }

    this.scene.overrideMaterial = null;
    renderer.autoClear = oldAutoClear;
  } });



/**
 * @author alteredq / http://alteredqualia.com/
 */

THREE.ShaderPass = function (shader, textureID) {

  THREE.Pass.call(this);

  this.textureID = textureID !== undefined ? textureID : "tDiffuse";

  if (shader instanceof THREE.ShaderMaterial) {

    this.uniforms = shader.uniforms;

    this.material = shader;

  } else if (shader) {

    this.uniforms = THREE.UniformsUtils.clone(shader.uniforms);

    this.material = new THREE.ShaderMaterial({

      defines: shader.defines || {},
      uniforms: this.uniforms,
      vertexShader: shader.vertexShader,
      fragmentShader: shader.fragmentShader });



  }

  this.camera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1);
  this.scene = new THREE.Scene();

  this.quad = new THREE.Mesh(new THREE.PlaneBufferGeometry(2, 2), null);
  this.quad.frustumCulled = false; // Avoid getting clipped
  this.scene.add(this.quad);

};

THREE.ShaderPass.prototype = Object.assign(Object.create(THREE.Pass.prototype), {

  constructor: THREE.ShaderPass,

  render: function (renderer, writeBuffer, readBuffer, delta, maskActive) {

    if (this.uniforms[this.textureID]) {

      this.uniforms[this.textureID].value = readBuffer.texture;

    }

    this.quad.material = this.material;

    if (this.renderToScreen) {

      renderer.render(this.scene, this.camera);

    } else {

      renderer.render(this.scene, this.camera, writeBuffer, this.clear);

    }

  } });




/**
 * @author alteredq / http://alteredqualia.com/
 */

THREE.GlitchPass = function (dt_size) {

  THREE.Pass.call(this);

  if (THREE.DigitalGlitch === undefined) console.error("THREE.GlitchPass relies on THREE.DigitalGlitch");

  var shader = THREE.DigitalGlitch;
  this.uniforms = THREE.UniformsUtils.clone(shader.uniforms);

  if (dt_size == undefined) dt_size = 64;


  this.uniforms["tDisp"].value = this.generateHeightmap(dt_size);


  this.material = new THREE.ShaderMaterial({
    uniforms: this.uniforms,
    vertexShader: shader.vertexShader,
    fragmentShader: shader.fragmentShader });


  this.camera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1);
  this.scene = new THREE.Scene();

  this.quad = new THREE.Mesh(new THREE.PlaneBufferGeometry(2, 2), null);
  this.quad.frustumCulled = false; // Avoid getting clipped
  this.scene.add(this.quad);

  this.goWild = false;
  this.curF = 0;
  this.generateTrigger();

};

THREE.GlitchPass.prototype = Object.assign(Object.create(THREE.Pass.prototype), {

  constructor: THREE.GlitchPass,

  render: function (renderer, writeBuffer, readBuffer, delta, maskActive) {

    this.uniforms["tDiffuse"].value = readBuffer.texture;
    this.uniforms['seed'].value = Math.random(); //default seeding
    this.uniforms['byp'].value = 0;

    if (this.curF % this.randX == 0 || this.goWild == true) {

      this.uniforms['amount'].value = Math.random() / 30;
      this.uniforms['angle'].value = THREE.Math.randFloat(-Math.PI, Math.PI);
      this.uniforms['seed_x'].value = THREE.Math.randFloat(-1, 1);
      this.uniforms['seed_y'].value = THREE.Math.randFloat(-1, 1);
      this.uniforms['distortion_x'].value = THREE.Math.randFloat(0, 1);
      this.uniforms['distortion_y'].value = THREE.Math.randFloat(0, 1);
      this.curF = 0;
      this.generateTrigger();

    } else if (this.curF % this.randX < this.randX / 5) {

      this.uniforms['amount'].value = Math.random() / 90;
      this.uniforms['angle'].value = THREE.Math.randFloat(-Math.PI, Math.PI);
      this.uniforms['distortion_x'].value = THREE.Math.randFloat(0, 1);
      this.uniforms['distortion_y'].value = THREE.Math.randFloat(0, 1);
      this.uniforms['seed_x'].value = THREE.Math.randFloat(-0.3, 0.3);
      this.uniforms['seed_y'].value = THREE.Math.randFloat(-0.3, 0.3);

    } else if (this.goWild == false) {

      this.uniforms['byp'].value = 1;

    }

    this.curF++;
    this.quad.material = this.material;

    if (this.renderToScreen) {

      renderer.render(this.scene, this.camera);

    } else {

      renderer.render(this.scene, this.camera, writeBuffer, this.clear);

    }

  },

  generateTrigger: function () {

    this.randX = THREE.Math.randInt(10, 240);

  },

  generateHeightmap: function (dt_size) {

    var data_arr = new Float32Array(dt_size * dt_size * 3);
    var length = dt_size * dt_size;

    for (var i = 0; i < length; i++) {

      var val = THREE.Math.randFloat(0, 1);
      data_arr[i * 3 + 0] = val;
      data_arr[i * 3 + 1] = val;
      data_arr[i * 3 + 2] = val;

    }

    var texture = new THREE.DataTexture(data_arr, dt_size, dt_size, THREE.RGBFormat, THREE.FloatType);
    texture.needsUpdate = true;
    return texture;

  } });



/**
 * @author alteredq / http://alteredqualia.com/
 *
 * Convolution shader
 * ported from o3d sample to WebGL / GLSL
 * http://o3d.googlecode.com/svn/trunk/samples/convolution.html
 */

THREE.ConvolutionShader = {

  defines: {

    "KERNEL_SIZE_FLOAT": "25.0",
    "KERNEL_SIZE_INT": "25" },



  uniforms: {

    "tDiffuse": { value: null },
    "uImageIncrement": { value: new THREE.Vector2(0.001953125, 0.0) },
    "cKernel": { value: [] } },



  vertexShader: [

  "uniform vec2 uImageIncrement;",

  "varying vec2 vUv;",

  "void main() {",

  "vUv = uv - ( ( KERNEL_SIZE_FLOAT - 1.0 ) / 2.0 ) * uImageIncrement;",
  "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",

  "}"].

  join("\n"),

  fragmentShader: [

  "unifor.........完整代码请登录后点击上方下载按钮下载查看

网友评论0