资讯专栏INFORMATION COLUMN

H5实例教学--ThreeJs 实现粒子动画飘花效果

Andrman / 2850人阅读

摘要:我们还需要在粒子超出效果展示区域时,把粒子重新赋予一个初始位置这样,飘花瓣的效果,就完成了代码下载链接密码

粒子动画在ThreeJs可以用几种方式实现
本次样例使用Sprite类来构建粒子

</>复制代码

  1. 官方对Sprite类的解释
  2. Sprite
  3. A sprite is a plane that always faces towards the camera, generally with a partially transparent texture applied.
  4. Sprites do not cast shadows, setting
  5. castShadow = true
  6. will have no effect.

大概意思:这个类创建的对象是一个始终面向相机的平面,可以把贴图应用在上面,Sprite对象无法添加阴影 ,所以castShadow属性无效

首先我们创建场景和相机

</>复制代码

  1. container = document.createElement( "div" );
  2. document.body.appendChild( container );
  3. camera = new THREE.PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 1, 10000 );
  4. camera.position.set( 0, 0, 120 );
  5. scene = new THREE.Scene();

然后用Sprite创建粒子

</>复制代码

  1. var textureList=[pic1,pic2,pic3,pic4,pic5,pic6,pic7,pic8,pic9,pic10]

</>复制代码

  1. var textureLoader = new THREE.TextureLoader();
  2. var textureId = parseInt(Math.random()*100)%10
  3. var texture = textureLoader.load(textureList[textureId]);
  4. var particle = new THREE.Sprite( new THREE.SpriteMaterial( { map: texture } ) );

生成随机数,随机获取贴图资源,使用Sprite类创建粒子

</>复制代码

  1. particle.position.x = Math.round(Math.random() *winHeight* 1000)%200 +120;
  2. particle.position.y =Math.round(Math.random() *winHeight* 10000)%100 +60;
  3. particle.position.z = Math.random() * 3 - 30;
  4. particle.scale.x = particle.scale.y = Math.round(Math.random() * 50)%5+10 ;

使用随机数给粒子设置位置,大小
因为Sprite类是创建一个始终面向相机的面,也就是说它无法使用翻转使得花瓣有个翻转的效果。

但是我需要给花瓣添加一个翻转的效果
我的实现思路是,2d元素在反转时其实相当于是将他的x轴的大小压缩
所以我给设置一个当前x轴的大小
和初始变形速度

</>复制代码

  1. particle.sizeX = particle.scale.x;
  2. particle.xScaleSpeed = -0.08;

以下是所有粒子初始化的代码

</>复制代码

  1. for ( var i = 0; i < 30; i ++ ) {
  2. var textureLoader = new THREE.TextureLoader();
  3. var textureId = parseInt(Math.random()*10);
  4. var texture = textureLoader.load(textureList[textureId]);
  5. var particle = new THREE.Sprite( new THREE.SpriteMaterial( { map: texture } ) );
  6. particle.position.x = Math.round(Math.random() *winHeight* 1000)%200 +120;
  7. particle.position.y =Math.round(Math.random() *winHeight* 10000)%100 +60;
  8. particle.position.z = Math.random() * 3 - 30;
  9. particle.scale.x = particle.scale.y = Math.round(Math.random() * 50)%5+10 ;
  10. particle.sizeX = particle.scale.x;
  11. particle.xScaleSpeed = -0.08;
  12. particle.speed = Math.round(Math.random()*10)/50;
  13. particles.push(particle);
  14. scene.add( particle );
  15. }

创建完粒子后
创建canvasRender

</>复制代码

  1. renderer = new THREE.CanvasRenderer({alpha:true});
  2. renderer.setClearColor("#ffffff",0);
  3. renderer.setPixelRatio( window.devicePixelRatio );
  4. renderer.setSize( window.innerWidth, winHeight );
  5. container.appendChild( renderer.domElement );

因为准备让花瓣从左上方往右下飘落,所以每次渲染画面的时候需要将花瓣往右下偏移

</>复制代码

  1. particles[i].position.x+=particles[i].speed;

这个速度是我在创建粒子时随机生成的,为的是让花瓣每一片的速度不同

</>复制代码

  1. particles[i].position.y-=particles[i].speed+0.1;

给y轴上也在每次渲染的时候增加一个偏移量,
因为这个效果需要在竖屏上展示,
所以y轴速度比x轴快一些效果会更好

</>复制代码

  1. particles[i].scale.x += particles[i].xScaleSpeed;

然后对粒子的形状在每次渲染的时候增加一个变形量

</>复制代码

  1. if(particles[i].scale.x <-particles[i].sizeX){
  2. particles[i].xScaleSpeed = 0.08
  3. }
  4. if(particles[i].scale.x >=particles[i].sizeX){
  5. particles[i].xScaleSpeed = -0.08
  6. }

需要模拟花瓣翻转的效果,当当前变形量超过原先尺寸时,变形方向改为相反方向(本来变大改为变小)

</>复制代码

  1. if(particles[i].scale.x <0.3&&particles[i].scale.x >0){
  2. particles[i].scale.x=-0.3
  3. }
  4. if(particles[i].scale.x >-0.3&&particles[i].scale.x <0){
  5. particles[i].scale.x=0.3
  6. }

到这里我们就完成了粒子的飘落+翻转的动态。
我们还需要在粒子超出效果展示区域时,把粒子重新赋予一个初始位置

</>复制代码

  1. if(particles[i].position.y<-100||particles[i].position.x>50|particles[i].position.z>150){
  2. particles[i].position.x = -Math.round(Math.random() *winWidth* 1000)%(winWidth);
  3. particles[i].position.y = Math.round(Math.random() *winHeight* 1000)%200 +120
  4. particles[i].position.z = Math.random() * 5 - 30;
  5. particles[i].speed=Math.round(Math.random()*10)/30;
  6. }

这样,飘花瓣的效果,
就完成了
代码下载
链接: https://pan.baidu.com/s/1pKKkqrL 密码: ww7j

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/86929.html

相关文章

  • H5实例教学--ThreeJs 实现粒子动画飘花效果

    摘要:我们还需要在粒子超出效果展示区域时,把粒子重新赋予一个初始位置这样,飘花瓣的效果,就完成了代码下载链接密码 showImg(https://segmentfault.com/img/bVKwfR?w=329&h=565); 粒子动画在ThreeJs可以用几种方式实现本次样例使用Sprite类来构建粒子 官方对Sprite类的解释 Sprite A sprite is a plane t...

    GitCafe 评论0 收藏0
  • 新颖交互形式的H5案例浅析(技术分析)

    摘要:那我这边呢,根据技术的分类,找出其中十个有代表性的案例,给大家解析一下他们技术的实现方案。经过我对线上的代码进行修改,使这个页面在安卓端强制使用来进行展示后发现,在播放了一会后微信浏览器直接崩溃。那么这十个案例的浅析就完了,谢谢。 最近我们前端这边搜集了50个比较优秀的H5。 那我这边呢,根据技术的分类,找出其中十个有代表性的案例,给大家解析一下他们技术的实现方案。 设计师也可以根据技...

    hikui 评论0 收藏0
  • 新颖交互形式的H5案例浅析(技术分析)

    摘要:那我这边呢,根据技术的分类,找出其中十个有代表性的案例,给大家解析一下他们技术的实现方案。经过我对线上的代码进行修改,使这个页面在安卓端强制使用来进行展示后发现,在播放了一会后微信浏览器直接崩溃。那么这十个案例的浅析就完了,谢谢。 最近我们前端这边搜集了50个比较优秀的H5。 那我这边呢,根据技术的分类,找出其中十个有代表性的案例,给大家解析一下他们技术的实现方案。 设计师也可以根据技...

    lpjustdoit 评论0 收藏0

发表评论

0条评论

Andrman

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<