/// /// /// // https://github.com/mrdoob/three.js/blob/master/examples/css3d_sprites.html () => { // ------- variable definitions that does not exist in the original code. These are for typescript. // ------- var camera, scene, renderer; var controls; var particlesTotal = 512; var positions = []; var objects = []; var current = 0; init(); animate(); function init() { camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 1, 5000); camera.position.set(600, 400, 1500); camera.lookAt(new THREE.Vector3()); scene = new THREE.Scene(); var image = document.createElement('img'); image.addEventListener('load', function (event) { for (var i = 0; i < particlesTotal; i++) { var object = new THREE.CSS3DSprite(image.cloneNode()); object.position.x = Math.random() * 4000 - 2000, object.position.y = Math.random() * 4000 - 2000, object.position.z = Math.random() * 4000 - 2000 scene.add(object); objects.push(object); } transition(); }, false); image.src = 'textures/sprite.png'; // Plane var amountX = 16; var amountZ = 32; var separation = 150; var offsetX = ((amountX - 1) * separation) / 2; var offsetZ = ((amountZ - 1) * separation) / 2; for (var i = 0; i < particlesTotal; i++) { var x = (i % amountX) * separation; var z = Math.floor(i / amountX) * separation; var y = (Math.sin(x * 0.5) + Math.sin(z * 0.5)) * 200; positions.push(x - offsetX, y, z - offsetZ); } // Cube var amount = 8; var separation = 150; var offset = ((amount - 1) * separation) / 2; for (var i = 0; i < particlesTotal; i++) { var x = (i % amount) * separation; var y = Math.floor((i / amount) % amount) * separation; var z = Math.floor(i / (amount * amount)) * separation; positions.push(x - offset, y - offset, z - offset); } // Random for (var i = 0; i < particlesTotal; i++) { positions.push( Math.random() * 4000 - 2000, Math.random() * 4000 - 2000, Math.random() * 4000 - 2000 ); } // Sphere var radius = 750; for (var i = 0; i < particlesTotal; i++) { var phi = Math.acos(-1 + (2 * i) / particlesTotal); var theta = Math.sqrt(particlesTotal * Math.PI) * phi; positions.push( radius * Math.cos(theta) * Math.sin(phi), radius * Math.sin(theta) * Math.sin(phi), radius * Math.cos(phi) ); } // renderer = new THREE.CSS3DRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); renderer.domElement.style.position = 'absolute'; document.getElementById('container').appendChild(renderer.domElement); // controls = new THREE.TrackballControls(camera, renderer.domElement); controls.rotateSpeed = 0.5; // window.addEventListener('resize', onWindowResize, false); } function onWindowResize() { camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); renderer.setSize(window.innerWidth, window.innerHeight); } function transition() { var offset = current * particlesTotal * 3; var duration = 2000; for (var i = 0, j = offset; i < particlesTotal; i++, j += 3) { var object = objects[i]; new TWEEN.Tween(object.position) .to({ x: positions[j], y: positions[j + 1], z: positions[j + 2] }, Math.random() * duration + duration) .easing(TWEEN.Easing.Exponential.InOut) .start(); } new TWEEN.Tween(this) .to({}, duration * 3) .onComplete(transition) .start(); current = (current + 1) % 4; } function animate() { requestAnimationFrame(animate); TWEEN.update(); controls.update(); var time = performance.now(); for (var i = 0, l = objects.length; i < l; i++) { var object = objects[i]; var scale = Math.sin((Math.floor(object.position.x) + time) * 0.002) * 0.3 + 1; object.scale.set(scale, scale, scale); } renderer.render(scene, camera); } }