Three.js 超炫酷的波浪粒子动画

400 阅读2分钟

使用 Three.js 实现的波浪粒子动画。大量粒子组成的动态波浪图案会和鼠标移动进行互动,效果十分炫酷。

图片实现代码

HTML:

<html>    <body></body></html>

CSS:

body {    background-color: #193c6d;    filter: progid: DXImageTransform.Microsoft.gradient(gradientType=1, startColorstr='#003073', endColorstr='#029797');    background-image: url(//img.alicdn.com/tps/TB1d.u8MXXXXXXuXFXXXXXXXXXX-1900-790.jpg);    background-size: 100%;    background-image: -webkit-gradient(linear, 0 0, 100% 100%, color-stop(0, #003073), color-stop(100%, #029797));    background-image: -webkit-linear-gradient(135deg, #003073, #029797);    background-image: -moz-linear-gradient(45deg, #003073, #029797);    background-image: -ms-linear-gradient(45deg, #003073 0, #029797 100%);    background-image: -o-linear-gradient(45deg, #003073, #029797);    background-image: linear-gradient(135deg, #003073, #029797);    text-align: center;    margin: 0px;    overflow: hidden;}

JAVASCRIPT:

// three.js - https://github.com/mrdoob/three.js
var SEPARATION = 100,        AMOUNTX = 100,        AMOUNTY = 70;     var container;    var camera, scene, renderer;     var particles, particle, count = 0;     var mouseX = 85,        mouseY = -342;     var windowHalfX = window.innerWidth / 2;    var windowHalfY = window.innerHeight / 2;     init();    animate();     function init() {         container = document.createElement('div');        document.body.appendChild(container);         camera = new THREE.PerspectiveCamera(120, window.innerWidth / window.innerHeight, 1, 10000);        camera.position.z = 1000;         scene = new THREE.Scene();         particles = new Array();         var PI2 = Math.PI * 2;        var material = new THREE.ParticleCanvasMaterial({             color: 0xe1e1e1,            program: function(context) {                 context.beginPath();                context.arc(0, 0, .6, 0, PI2, true);                context.fill();             }         });         var i = 0;         for (var ix = 0; ix < AMOUNTX; ix++) {             for (var iy = 0; iy < AMOUNTY; iy++) {                 particle = particles[i++] = new THREE.Particle(material);                particle.position.x = ix * SEPARATION - ((AMOUNTX * SEPARATION) / 2);                particle.position.z = iy * SEPARATION - ((AMOUNTY * SEPARATION) / 2);                scene.add(particle);             }         }         renderer = new THREE.CanvasRenderer();        renderer.setSize(window.innerWidth, window.innerHeight);        container.appendChild(renderer.domElement);         document.addEventListener('mousemove', onDocumentMouseMove, false);        document.addEventListener('touchstart', onDocumentTouchStart, false);        document.addEventListener('touchmove', onDocumentTouchMove, false);         //         window.addEventListener('resize', onWindowResize, false);     }     function onWindowResize() {         windowHalfX = window.innerWidth / 2;        windowHalfY = window.innerHeight / 2;         camera.aspect = window.innerWidth / window.innerHeight;        camera.updateProjectionMatrix();         renderer.setSize(window.innerWidth, window.innerHeight);     }     //     function onDocumentMouseMove(event) {         mouseX = event.clientX - windowHalfX;        mouseY = event.clientY - windowHalfY;     }     function onDocumentTouchStart(event) {         if (event.touches.length === 1) {             event.preventDefault();             mouseX = event.touches[0].pageX - windowHalfX;            mouseY = event.touches[0].pageY - windowHalfY;         }     }     function onDocumentTouchMove(event) {         if (event.touches.length === 1) {             event.preventDefault();             mouseX = event.touches[0].pageX - windowHalfX;            mouseY = event.touches[0].pageY - windowHalfY;         }     }     //     function animate() {         requestAnimationFrame(animate);         render();      }     function render() {         camera.position.x += (mouseX - camera.position.x) * .05;        camera.position.y += (-mouseY - camera.position.y) * .05;        camera.lookAt(scene.position);         var i = 0;         for (var ix = 0; ix < AMOUNTX; ix++) {             for (var iy = 0; iy < AMOUNTY; iy++) {                 particle = particles[i++];                particle.position.y = (Math.sin((ix + count) * 0.3) * 50) + (Math.sin((iy + count) * 0.5) * 50);                particle.scale.x = particle.scale.y = (Math.sin((ix + count) * 0.3) + 1) * 2 + (Math.sin((iy + count) * 0.5) + 1) * 2;             }         }         renderer.render(scene, camera);         count += 0.1;     }

源码:

codepen.io/deathfang/p…

在线预览:

codepen.io/deathfang/f…