粒子动画在ThreeJs能够用几种方式实现
本次样例使用Sprite类来构建粒子canvas
官方对Sprite类的解释 Sprite A sprite is a plane that always faces towards the camera, generally with a partially transparent texture applied. Sprites do not cast shadows, setting castShadow = true will have no effect.
大概意思:这个类建立的对象是一个始终面向相机的平面,能够把贴图应用在上面,Sprite对象没法添加阴影 ,因此castShadow属性无效app
首先咱们建立场景和相机dom
container = document.createElement( 'div' ); document.body.appendChild( container ); camera = new THREE.PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 1, 10000 ); camera.position.set( 0, 0, 120 ); scene = new THREE.Scene();
而后用Sprite建立粒子动画
var textureList=[pic1,pic2,pic3,pic4,pic5,pic6,pic7,pic8,pic9,pic10]
var textureLoader = new THREE.TextureLoader(); var textureId = parseInt(Math.random()*100)%10 var texture = textureLoader.load(textureList[textureId]); var particle = new THREE.Sprite( new THREE.SpriteMaterial( { map: texture } ) );
生成随机数,随机获取贴图资源,使用Sprite类建立粒子spa
particle.position.x = Math.round(Math.random() *winHeight* 1000)%200 +120; particle.position.y =Math.round(Math.random() *winHeight* 10000)%100 +60; particle.position.z = Math.random() * 3 - 30; particle.scale.x = particle.scale.y = Math.round(Math.random() * 50)%5+10 ;
使用随机数给粒子设置位置,大小
由于Sprite类是建立一个始终面向相机的面,也就是说它没法使用翻转使得花瓣有个翻转的效果。code
可是我须要给花瓣添加一个翻转的效果
个人实现思路是,2d元素在反转时其实至关因而将他的x轴的大小压缩
因此我给设置一个当前x轴的大小
和初始变形速度对象
particle.sizeX = particle.scale.x; particle.xScaleSpeed = -0.08;
如下是全部粒子初始化的代码blog
for ( var i = 0; i < 30; i ++ ) { var textureLoader = new THREE.TextureLoader(); var textureId = parseInt(Math.random()*10); var texture = textureLoader.load(textureList[textureId]); var particle = new THREE.Sprite( new THREE.SpriteMaterial( { map: texture } ) ); particle.position.x = Math.round(Math.random() *winHeight* 1000)%200 +120; particle.position.y =Math.round(Math.random() *winHeight* 10000)%100 +60; particle.position.z = Math.random() * 3 - 30; particle.scale.x = particle.scale.y = Math.round(Math.random() * 50)%5+10 ; particle.sizeX = particle.scale.x; particle.xScaleSpeed = -0.08; particle.speed = Math.round(Math.random()*10)/50; particles.push(particle); scene.add( particle ); }
建立完粒子后
建立canvasRenderip
renderer = new THREE.CanvasRenderer({alpha:true}); renderer.setClearColor("#ffffff",0); renderer.setPixelRatio( window.devicePixelRatio ); renderer.setSize( window.innerWidth, winHeight ); container.appendChild( renderer.domElement );
由于准备让花瓣从左上方往右下飘落,因此每次渲染画面的时候须要将花瓣往右下偏移资源
particles[i].position.x+=particles[i].speed;
这个速度是我在建立粒子时随机生成的,为的是让花瓣每一片的速度不一样
particles[i].position.y-=particles[i].speed+0.1;
给y轴上也在每次渲染的时候增长一个偏移量,
由于这个效果须要在竖屏上展现,
因此y轴速度比x轴快一些效果会更好
particles[i].scale.x += particles[i].xScaleSpeed;
而后对粒子的形状在每次渲染的时候增长一个变形量
if(particles[i].scale.x <-particles[i].sizeX){ particles[i].xScaleSpeed = 0.08 } if(particles[i].scale.x >=particles[i].sizeX){ particles[i].xScaleSpeed = -0.08 }
须要模拟花瓣翻转的效果,当当前变形量超过原先尺寸时,变形方向改成相反方向(原本变大改成变小)
if(particles[i].scale.x <0.3&&particles[i].scale.x >0){ particles[i].scale.x=-0.3 } if(particles[i].scale.x >-0.3&&particles[i].scale.x <0){ particles[i].scale.x=0.3 }
到这里咱们就完成了粒子的飘落+翻转的动态。
咱们还须要在粒子超出效果展现区域时,把粒子从新赋予一个初始位置
if(particles[i].position.y<-100||particles[i].position.x>50|particles[i].position.z>150){ particles[i].position.x = -Math.round(Math.random() *winWidth* 1000)%(winWidth); particles[i].position.y = Math.round(Math.random() *winHeight* 1000)%200 +120 particles[i].position.z = Math.random() * 5 - 30; particles[i].speed=Math.round(Math.random()*10)/30; }
这样,飘花瓣的效果,
就完成了
代码下载
连接: https://pan.baidu.com/s/1pKKkqrL 密码: ww7j