UNPKG

threex

Version:

Game Extensions for three.js http://www.threejsgames.com/extensions/

141 lines (127 loc) 4.37 kB
<!DOCTYPE html> <script src="../../../vendor/three.js/build/three.min.js"></script> <body style='margin: 0px; background-color: #bbbbbb;overflow: hidden;'> <script> var renderer = new THREE.WebGLRenderer(); renderer.setSize( window.innerWidth, window.innerHeight ); document.body.appendChild( renderer.domElement ); var updateFcts = []; var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 1000 ); camera.position.z = 3; renderer.setClearColor('black', 1) var geometry = new THREE.SphereGeometry( 1 ); var material = new THREE.MeshNormalMaterial(); var mesh = new THREE.Mesh( geometry, material ); mesh.scale.multiplyScalar(0.1) scene.add( mesh ); updateFcts.push(function(delta, now){ var angle = 0.05 * now * Math.PI * 2; mesh.position.x = Math.cos(angle*3.0) * 2 mesh.position.y = Math.sin(angle*1.3) * 1 emitter.emitThrottle(mesh.position, 120) emitter.emitThrottle(mesh.position, 120) }) var emitter = new blueTrailEmitter(scene) updateFcts.push(function(delta, now){ emitter.update(delta, now) }) ////////////////////////////////////////////////////////////////////////////////// // render the scene // ////////////////////////////////////////////////////////////////////////////////// updateFcts.push(function(){ renderer.render( scene, camera ); }) ////////////////////////////////////////////////////////////////////////////////// // loop runner // ////////////////////////////////////////////////////////////////////////////////// var lastTimeMsec= null requestAnimationFrame(function animate(nowMsec){ // keep looping requestAnimationFrame( animate ); // measure time lastTimeMsec = lastTimeMsec || (nowMsec-1000/60) var deltaMsec = Math.min(200, nowMsec - lastTimeMsec) lastTimeMsec = nowMsec // call each update function updateFcts.forEach(function(updateFn){ updateFn(deltaMsec/1000, nowMsec/1000) }) }) ////////////////////////////////////////////////////////////////////////////////// // comment // ////////////////////////////////////////////////////////////////////////////////// function blueTrailEmitter(container){ var texture = THREE.ImageUtils.loadTexture('images/blue_particle.jpg') var maxAge = 1; var tweenOpacity= createTweenMidi(maxAge, 0.33*maxAge, 0.33*maxAge); var tweenScale = (function(){ var tweenMidi = createTweenMidi(maxAge, 0.2*maxAge, 0.2*maxAge); return function(age){ return (1 + 1 * tweenMidi(age)) * 0.2 } })(); var updateFcts = [] var prevPosition= null; this.emit = function(position){ // init sprite material var material = new THREE.SpriteMaterial({ map : texture, useScreenCoordinates : false, color : 0xAA4488, transparent : true, blending : THREE.AdditiveBlending }) // init sprite var sprite = new THREE.Sprite(material) //sprite.rotation = Math.random() * Math.PI*2 sprite.position.copy( position ) container.add( sprite ) // compute velocity prevPosition = prevPosition || position.clone(); var velocity = position.clone().sub(prevPosition).normalize(); prevPosition.copy( position ) // start a little bit behind the container sprite.position.add( velocity.clone().multiplyScalar(-0.1) ) // init pattern sprite.scale.set(1,1,1).multiplyScalar( tweenScale(0) ) material.opacity= tweenOpacity(0) var birthDate = Date.now()/1000; updateFcts.push(function callback(delta, now){ var age = Date.now()/1000 - birthDate; if( age >= maxAge ){ sprite.parent.remove(sprite) updateFcts.splice(updateFcts.indexOf(callback),1) return; } sprite.scale.set(1,1,1).multiplyScalar( tweenScale(age) ) material.opacity= tweenOpacity(age) }) } var lastEmit = 0; this.emitThrottle= function(position, rate){ // rate limiter emition var now = Date.now()/1000 if( rate === 0 || now - lastEmit < 1/rate ) return; lastEmit = now; // emit now this.emit(position) } this.update = function(delta, now){ updateFcts.forEach(function(updateFct){ updateFct(delta, now) }) } function createTweenMidi(maxAge, attackTime, releaseTime){ return function(age){ if( age < attackTime ){ return age / attackTime }else if( age < maxAge - releaseTime ){ return 1; }else{ return (maxAge - age) / releaseTime } } } } </script></body>