看到页面上three.js实现的波浪效果很赞,所以拔下来分享一下,以备后用。
demo演示:https://www.7psus5.com/demo/threejs-waves/
下载地址:/newimg88/2016/04/threejs-waves.zip
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; }
页面上引入
<script src="js/three.min.js"></script>
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; }
确实很不错,可惜没有做移动端优化,在pc上效果很好,微信上面打开卡的很(Andor)。
移动端慢应该是这个效果是靠客户端计算的,比较消耗客户端资源。所以,移动端就悲剧了……
PC上也是非常消耗性能的=。=对cpu的性能消耗非常大