视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
HTML5开发实例-ThreeJs实现粒子动画飘花效果代码分享
2020-11-27 15:11:24 责编:小采
文档


粒子动画在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;
}

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

下载本文
显示全文
专题