var ParticleSphere = { init: function () { ParticleSphere.buildWorld(); ParticleSphere.buildObjects(); ParticleSphere.render(); }, buildWorld: function () { ParticleSphere.camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000); ParticleSphere.camera.position = new THREE.Vector3(0, 0, 100); ParticleSphere.renderer = new THREE.WebGLRenderer(); ParticleSphere.renderer.setSize(window.innerWidth, window.innerHeight); ParticleSphere.scene = new THREE.Scene(); ParticleSphere.scene.add(ParticleSphere.camera); document.body.appendChild(ParticleSphere.renderer.domElement); }, buildObjects: function () { var nParticles = 1500; var particles = new THREE.Geometry(); var material = new THREE.PointCloudMaterial({ size: 20, color: 0xffffff, map: new THREE.ImageUtils.loadTexture('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAE/klEQVR42tVXP0hjaRA/ENdC2RNkC0GERVa0s1BsBK1EttjGxkV227UUtrCQq87iqmsEiyOQXPJS5B8JJCtyERIScgkmeSkOSZa8JIUhXzgSNXgk5uU9vPmZIazu5c6cussGhsd7+Wbm++ab+c1vvvumfiajsc9qlQZsNtugy+V66na7v/d4PMN44h3frZI0YDSZ+h7Usdls7rfb7UM+r3fk8NA/GgqFxmPR2ET8KP4iEY9PHtEzFo1OhELhcb//cNTr847Y7Y4h6N3vxCZjHzke3N/ffxYKh8aTsjyVTqdn8vn8fLF4siCEWBTl8pIolRaLxeJCvpCfx/8yrQvTJqFnt9kHjWSnZ+cWi7kf4Q0GgmOpVGpaUZS5sigvnZ/XXtYbjVW1pb7WNO2NrmtvNU1/o6rq60a9vlo7P39Zpk3llNwc9ALBwJib7PQUDUmyPEG4I79HnuNEJTrpxcXFq1ZLW7+6unpHskmyRbJN8gM/t/j7u1artY71iFA6k56JRCLPfXQtkiQ9udPJcYe4YyWrzFYqleWmqq6R4Q12skPyM8keyS8kBn7u8fcdXrehNptrlUp1WclmZ2Ox6ITX5xuxmC3dI4G7Qtix4ywpnZ2driDMfLIfSXZJfiVxknhJDkh+w5Pfnfz/Lq/fxPWcnp6tYBOw63F7hk3dcgIJFwgExhD2arWyrLedvyf5iU/qIvGTRElkkj9Ijvkp83c/rzOw3nscolqtLqfTmZkg2Yeffyw1ZG0qJU+XKKsRPpyAjRj5hBF2licpkfxJUsGT3/P8f4TXG1l/U6VrRLUgMeHHbLmVlA6qc9R3LpebQwLhDjmMBjYWI/lIIkhqJJckGonOz0v+LnhdjPUMbGfj4q+LV0pOmYMfh8Mx1HEO5PJ6fSPJZHIKJUQhW+dE2uVwRmCUT9q4+vdfg9d9ZD0X29lCdcC+nJSnUBWdDVgl68AhIRju/pzqmEtthxPKz2EVXZx324RgPT/b2YFd4Aj8HPr9o50NAMMRlnyhMF9v1FdxZ1xSTk6sPIe3l18NeqzvZHubDQKxAvkBsnY24KRGEiUsB5wC0Tj8e3yHMifYZS/eeX2J9b1sbwv2T8hPlHChswF0s6P40QsgF9f9NoPLAcLId6r1uAENeqx/wPa2YR/IikbW2QCwOhFPTF4noK6/ZXg1MMgcc6npPW5AZ71jtmOAXZ3si7JYSiTik18tAuJ2BJwu51P085MvlAPFk+IC/N2sgnC7CpClj1oF9cYq/KDqbuAA6jLzBXCgRjiAnuAnfze6IFolmAwYTktrPQoSAmGFaCMhkPdWL3Bc9wLlEXsB7CrElMLcCz7rhh+4G4qSWGw21Qfuhs01IUS3bsjJaLcxH8jMVInJgEw8BB8ArwC/QA8IBINjdvLThQWb+tyfMCIwGU2/LyPSiBGdrsAeOKbHw4yoOye09HuJkAKrs0p2tnovTqiuQR92UPcguuCc/82KLVKbFUfarFgwK9buyoq1NisuidIirhMnB9GF3TtTc0TC43YPg8MhcVAd6BXACYAVEA3hBbbjifc6zQXo9yg1zBEpWZ4O0FyBsMPe/5gFTZ3JCCWK+sWJgGSAbXS1shBLiBBaeQGTUQaTUZImozBNRh+eQR927j0bOhw8GxKChcLh9mwYp9kwkZhEI7sxG9I6rO8yDd1vVpQkno6dmI4919Ox55PpWLL2Nh3/DQNK5nTdCStoAAAAAElFTkSuQmCC'), transparent: true, alphaTest: 0.5 }); ParticleSphere.particleObj = new THREE.Object3D(); var vertex, point; for(var i = 0; i < nParticles; i++) { point = randomPoint(0, 0, 0, 150); vertex = new THREE.Vector3(point[0], point[1], point[2]); particles.vertices.push(vertex); } function randomPoint(x0, y0, z0, r) { var u = Math.random(); var v = Math.random(); var t = 2 * Math.PI * u; var p = Math.acos(2 * v - 1); var x = x0 + (r * Math.sin(p) * Math.cos(t)); var y = y0 + (r * Math.sin(p) * Math.sin(t)); var z = z0 + (r * Math.cos(p)); return [x, y, z]; }; var particleSystem = new THREE.PointCloud(particles, material); particleSystem.sortParticles = true; ParticleSphere.particleObj.add(particleSystem); ParticleSphere.particleObj.position.z = -550; new TWEEN.Tween(particleSystem.scale) .to({ x: 0.25, y: 0.25, z: 0.25}) .repeat(Infinity) .yoyo(true) .easing(TWEEN.Easing.Sinusoidal.InOut) .start(); ParticleSphere.scene.add(ParticleSphere.particleObj); }, render: function() { function render() { requestAnimationFrame(render); TWEEN.update(); if(ParticleSphere.particleObj) { ParticleSphere.particleObj.rotation.x += 0.01; ParticleSphere.particleObj.rotation.y += 0.01; } ParticleSphere.renderer.render(ParticleSphere.scene, ParticleSphere.camera) } render(); } } ParticleSphere.init();