三维粒子风暴图片转场过渡幻灯片效果
代码语言:html
所属分类:幻灯片
代码描述:三维粒子风暴图片转场过渡幻灯片效果,点击拖拽可以控制动画
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <style> body { margin: 0; overflow: hidden; } canvas { background-image: radial-gradient(#666, #333); } #instructions { position: absolute; color: #fff; bottom: 0; padding-bottom: 6px; font-family: sans-serif; width: 100%; text-align: center; pointer-events: none; } </style> </head> <body translate="no"> <div id="three-container"></div> <div id="instructions"> 点击拖拽可以控制动画 </div> <script type="text/javascript" src="http://repo.bfw.wiki/bfwrepo/js/three.72.js"></script> <script type="text/javascript" src="http://repo.bfw.wiki/bfwrepo/js/TweenMax.min.js"></script> <script type="text/javascript" src="http://repo.bfw.wiki/bfwrepo/js/three.bas.js"></script> <script src='http://repo.bfw.wiki/bfwrepo/js/OrbitControls.js'></script> <script > window.onload = init; console.ward = function () {}; // what warnings? function init() { var root = new THREERoot({ createCameraControls: !true, antialias: window.devicePixelRatio === 1, fov: 80 }); root.renderer.setClearColor(0x000000, 0); root.renderer.setPixelRatio(window.devicePixelRatio || 1); root.camera.position.set(0, 0, 60); var width = 100; var height = 60; var slide = new Slide(width, height, 'out'); var l1 = new THREE.ImageLoader(); l1.setCrossOrigin('Anonymous'); l1.load('http://repo.bfw.wiki/bfwrepo/image/5ef941175a99f.png?x-oss-process=image/auto-orient,1/resize,m_fill,w_400,h_300,/quality,q_90', function (img) { slide.setImage(img); }); root.scene.add(slide); var slide2 = new Slide(width, height, 'in'); var l2 = new THREE.ImageLoader(); l2.setCrossOrigin('Anonymous'); l2.load('http://repo.bfw.wiki/bfwrepo/image/5ef941337115b.png?x-oss-process=image/auto-orient,1/resize,m_fill,w_400,h_300,/quality,q_90', function (img) { slide2.setImage(img); }); root.scene.add(slide2); var tl = new TimelineMax({ repeat: -1, repeatDelay: 1.0, yoyo: true }); tl.add(slide.transition(), 0); tl.add(slide2.transition(), 0); createTweenScrubber(tl); window.addEventListener('keyup', function (e) { if (e.keyCode === 80) { tl.paused(!tl.paused()); } }); } //////////////////// // CLASSES //////////////////// function Slide(width, height, animationPhase) { var plane = new THREE.PlaneGeometry(width, height, width * 2, height * 2); THREE.BAS.Utils.separateFaces(plane); var geometry = new SlideGeometry(plane); geometry.bufferUVs(); var aAnimation = geometry.createAttribute('aAnimation', 2); var aStartPosition = geometry.createAttribute('aStartPosition', 3); var aControl0 = geometry.createAttribute('aControl0', 3); var aControl1 = geometry.createAttribute('aControl1', 3); var aEndPosition = geometry.createAttribute('aEndPosition', 3); var i, i2, i3, i4, v; var minDuration = 0.8; var maxDuration = 1.2; var maxDelayX = 0.9; var maxDelayY = 0.125; var stretch = 0.11; this.totalDuration = maxDuration + maxDelayX + maxDelayY + stretch; var startPosition = new THREE.Vector3(); var control0 = new THREE.Vector3(); var control1 = new THREE.Vector3(); var endPosition = new THREE.Vector3(); var tempPoint = new THREE.Vector3(); function getControlPoint0(centroid) { var signY = Math.sign(centroid.y); tempPoint.x = THREE.Math.randFloat(0.1, 0.3) * 50; tempPoint.y = signY * THREE.Math.randFloat(0.1, 0.3) * 70; tempPoint.z = THREE.Math.randFloatSpread(20); return tempPoint; } function getControlPoint1(centroid) { var signY = Math.sign(centroid.y); tempPoint.x = THREE.Math.randFloat(0.3, 0.6) * 50; tempPoint.y = -signY * THREE.Math.randFloat(0.3, 0.6) * 70; tempPoint.z = THREE.Math.randFloatSpread(20); return tempPoint; } for (i = 0, i2 = 0, i3 = 0, i4 = 0; i < geometry.faceCount; i++, i2 += 6, i3 += 9, i4 += 12) { var face = plane.faces[i]; var centroid = THREE.BAS.Utils.computeCentroid(plane, face); // animation var duration = THREE.Math.randFloat(minDuration, maxDuration); var delayX = THREE.Math.mapLinear(centroid.x, -width * 0.5, width * 0.5, 0.0, maxDelayX); var delayY; if (animationPhase === 'in') { delayY = THREE.Math.mapLinear(Math.abs(centroid.y), 0, height * 0.5, 0.0, maxDelayY); } else { delayY = THREE.Math.mapLinear(Math.abs(centroid.y), 0, height * 0.5, maxDelayY, 0.0); } for (v = 0; v < 6; v += 2) { aAnimation.array[i2 + v] = delayX + delayY + Math.random() * stretch * duration; aAnimation.array[i2 + v + 1] = duration; } // positions endPosition.copy(centroid); startPosition.copy(centroid); if (animationPhase === 'in') { control0.copy(centroid).sub(getControlPoint0(centroid)); control1.copy(centroid).sub(getControlPoint1(centroid)); } else {// out control0.copy(centroid).add(getControlPoint0(centroid)); control1.copy(centroid).add(getControlPoint1(centroid)); } for (v = 0; v < 9; v += 3) { aStartPosition.array[i3 + v] = startPosition.x; aStartPosition.array[i3 + v + 1] = startPosition.y; aStartPosition.array[i3 + v + 2] = startPosition.z; aControl0.array[i3 + v] = control0.x; aControl0.array[i3 + v + 1] = control0.y; aControl0.array[i3 + v + 2] = control0.z; aControl1.array[i3 + v] = control1.x; aControl1.array[i3 + v + 1] = control1.y; aControl1.array[i3 + v + 2] = control1.z; aEndPosition.array[i3 + v] = endPosition.x; aEndPosition.array[i3 + v + 1] = endPosition.y; aEndPosition.array[i3 + v + 2] = endPosition.z; } } var material = new THREE.BAS.BasicAnimationMaterial( { shading: THREE.FlatShading, side: THREE.DoubleSide, uniforms: { uTime: { type: 'f', value: 0 } }, shaderFunctions: [ THREE.BAS.ShaderChunk['cubic_bezier'], //THREE.BAS.ShaderChunk[(animationPhase === 'in' ? 'ease_out_cubic' : 'ease_in_cubic')], THREE.BAS.ShaderChunk['ease_in_out_cubic'], THREE.BAS.ShaderChunk['quaternion_rotation']], shaderParameters: [ 'uniform float uTime;', 'attribute vec2 aAnimation;', 'attribute vec3 aStartPosition;', 'attribute vec3 aControl0;', 'attribute vec3 aControl1;'.........完整代码请登录后点击上方下载按钮下载查看
网友评论0