Three.js实现漫天雨滴的效果(粒子)
1、 html代码和css样式如下图,这一块比较简单,也不是本文重点,代码可自行查看下图。
1、 声明变量,详细代码如下图,具体用途说明都已经有备注。
2、 新建渲染器(initRenderer)、相机(initCamera)和场景(initScene),详细代码如下图:
1.渲染器设置抗锯齿为有效(antialias: true),使物体更光滑;
2.渲染背景色设置为0x171413,模拟天气黑暗感觉;
3.PerspectiveCamera的视角一般设置45,效果比较好;
4.为了观察效果,相机的位置定位到(20,40,110),设置y轴向上(camera.up.y = 1),且焦点为(20,30 , 0)。
3、 新建物体(initObject),这一块比较复杂,详细分析如下:
1.先新建几何模型(geom)和设置粒子缺省材质属性(material),里面要注意属性sizeAttenuation,设置为true的时候,雨滴会随距离而发生尺寸衰减(远小、近大),其它属性下图都有详细备注;
2.然后把5000个随机顶点位置的数据(particle)保存到数组中(geom.vertices);
3.最后新建类(cloud),里面包含5000个粒子(模型和材质为第1点设置的数据)。
Tips:velocityY和velocityX影响下落的速度。
4、 添加动画效果,简单说就是利用requestAnimationFrame每隔一个动画帧重新渲染一次,由于设置了每个顶点位置偏移,所以会产生动画效果;详细代码如下图:
1.设置了每隔一个动画帧重新渲染的时候,改变每个顶点的坐标位置(vertices.forEach),从而产生下落的过程
2.如果单单只设置第1点的动画,雨滴的动画效果会一卡一卡,不够真实;所以利用时间差(Date.now() - startTime > 100)判断,如果达到条件就调用函数initObject,函数里面有判断如果类(cloud)存在,则删除全部雨滴,重新渲染5000个雨滴,使雨滴下落过程更加顺畅。