最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

HTML5开发实例-ThreeJs实现粒子动画飘花效果代码分享

来源:动视网 责编:小采 时间:2020-11-27 15:11:24
文档

HTML5开发实例-ThreeJs实现粒子动画飘花效果代码分享

HTML5开发实例-ThreeJs实现粒子动画飘花效果代码分享:粒子动画在ThreeJs可以用几种方式实现本次样例使用Sprite类来构建粒子官方对Sprite类的解释 Sprite A sprite is a plane that always faces towards the camera, generally with a partially transparent textur
推荐度:
导读HTML5开发实例-ThreeJs实现粒子动画飘花效果代码分享:粒子动画在ThreeJs可以用几种方式实现本次样例使用Sprite类来构建粒子官方对Sprite类的解释 Sprite A sprite is a plane that always faces towards the camera, generally with a partially transparent textur


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

官方对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属性无效
首先我们创建场景和相机

container = document.createElement( 'p' );
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类创建粒子

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类是创建一个始终面向相机的面,也就是说它无法使用翻转使得花瓣有个翻转的效果。

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

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

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

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 );
}

创建完粒子后
创建canvasRender

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;
}

这样,飘花瓣的效果,
就完成了

文档

HTML5开发实例-ThreeJs实现粒子动画飘花效果代码分享

HTML5开发实例-ThreeJs实现粒子动画飘花效果代码分享:粒子动画在ThreeJs可以用几种方式实现本次样例使用Sprite类来构建粒子官方对Sprite类的解释 Sprite A sprite is a plane that always faces towards the camera, generally with a partially transparent textur
推荐度:
标签: 开发 实现 js
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top