手机版

基于三. js的三维粒子动态效果示例代码

时间:2021-08-26 来源:互联网 编辑:宝哥软件园 浏览:

一.背景

粒子特效是各种3D软件开发的制作模块,模拟现实中水、火、雾、气的效果。其原理是将无数单个粒子组合在一起,使其呈现固定的形状,通过控制器和脚本控制其整体或单个运动,以模拟真实效果。Three.js是用JavaScript编写的第三方WebGL库。three.js提供了丰富的API,帮助我们实现3D动态效果。主要介绍了如何使用three.js实现粒子过渡效果和基本的鼠标交互操作。

(注:本文使用的关于three.js的API是基于r98版本的。)

二、实施步骤

1.创建渲染场景场景

场景其实相当于一个三维空间,用来承载和展示我们定义的一切,包括相机、物体、灯光等等。在实际开发中,可以增加一些辅助工具,如网格、坐标轴等,方便观察。

场景=新三。场景();场景。雾=新三。雾(0x05050c,10,60);场景添加(新的三。GridHelper(2000,1));//添加网格2。添加摄像机摄像机

有几个相机实现在三:透视相机,正射影像相机,立方体相机和立体相机。本文介绍了我们主要使用的透视相机:

视觉效果近大远小。

配置了参数透视相机(FOV、方面、近、远)。

Fov:相机的视角。

纵横比:相机可视范围的纵横比。

近:相对于深剪切面的远距离。

远:相对于深剪切面的远距离。

相机=新的三。透视摄像机(45,window . inner width/window . inner height,5,100);camera.position.set(10,-10,-40);scene.add(摄像机);3.添加场景渲染所需的灯光

在三个. js中实现的光源包括AmbientLight、DirectionalLight、半球光源、PointLight、矩形光源、SpotLight等等。配置光源参数时,要注意色彩的叠加效果。例如,环境光的颜色将直接影响对象的当前颜色。各种光源的配置参数存在一些差异。这里有两个光源在这种情况下使用。

让ambientLight=new THREE。AmbientLight(0x000000,0.4);scene . add(ambient light);让pointLight=new THREE。point light(0xe 42107);pointLight.castShadow=truepointLight.position.set(-10,-5,-10);pointLight.distance=20scene . add(point light);4.创建、导出和加载模型文件加载器

模型可以使用三. js编辑器或者三. js的基础模型生成类来创建,相对复杂或者特殊的模型需要使用建模工具(c4d、3dmax等)来创建。).

您可以添加基本几何图形并调整各种参数(位置、颜色、材质等)。)的几何图形。

使用模型类生成。

让几何立方体=新三。BoxBufferGeometry(1,1,1);让materialCube=new THREE。mesh basicmaterial({ color :0x 00 ff00 });让立方体网格=新的三。网格(几何立方体、材料立方体);scene.add(立方体网格);导出所需的模型文件(这里使用obj格式的模型文件)。

加载和解析模型文件数据。

让我们继续前进=函数(xhr) {if (xhr。长度可计算){//可以计算知道模型的加载进度} };让onError=function(){ };粒子系统=新三。group();var texture=new THREE。TextureLoader()。加载('。/point . png ');New three.objloader()。加载('。/model.obj ',函数(对象){//对象模型文件数据},onProgress,onError);5.将导入的模型文件转换为粒子系统点

获取模型的坐标值。

将粒子的坐标值复制到新的属性位置1,这是粒子过渡效果的最终坐标位置。

向粒子系统添加随机三维坐标值位置的目的是为了扰动每个粒子的位置并设置起始位置。

让颜色=新三。颜色(' # ffff ');让材料=新三PointsMaterial({ size: 0.2,map:纹理,depthTest: false,transparent : true });粒子系统=新三group();让全部计数=0表示(让I=0;我反对。孩子。长度;i ) { let name=object.children[i].name let _ attributes=object。孩子[我]。几何学。属性让count=_ attributes。位置。计数属性。位置end=_ attributes。位置。clone()_属性。位置1=_属性。位置。克隆()为(设I=0;我数* 3;I){ _属性。位置1。数组[I]=数学。random()* 100-50 }让粒子=新三.点数(对象。孩子[i].几何,材料)粒子系统。添加(粒子)allCount=count }粒子系统。应用矩阵(新三Matrix4().makeTranslation(-5,-5,-10));6.通过在两者之间动画库实现粒子坐标从位置到位置一点转换

利用在两者之间的缓动算法计算出各个粒子每一次变化的坐标位置,从初始位置到结束位置时间设置为2s(可自定义),每次执行计算之后都需要将属性的位置属性设置为没错,用来提醒场景需要更新,在下次渲染时,渲染会使用最新计算的值进行渲染。

让pos={ val : 1 };补间=新的青少年.吐温(位置)。to({ val: 0 },2500).放松(TWEEN .放松。二次的onUpdate(回调);吐温。完成时(函数(){控制台。日志('过渡完成完成')})补间。start();函数回调(){让val=this.val让粒子=粒子系统。孩子;用于(设I=0;我粒子。长度;i ) { let _attributes=粒子[i].命名if(name。indexof(' _ ')===-1){ let position end=_ attributes。位置结束。数组let位置1=_ attributes。位置1。数组let count=_ attributes。位置。计数(让j=0;j计数* 3;j){ _属性。位置。数组[j]=位置1[j]* val位置end[j]*(1-val)} } _属性。位置。needsupdate=true//设置更新} }7.添加渲染场景提出

创建容器。

定义提出渲染器,设置各个参数。

将渲染器添加到容器里。

自定义的渲染函数渲染,在渲染函数里面我们利用TWEEN.update去更新模型的状态。

调用自定义的循环动画执行函数动画,利用requestAnimationFrame方法进行逐帧渲染。

让容器=文档。创建元素(' div ');document.body.appendChild(容器);渲染器=新的三.WebGLRenderer({ anti IAS : true,alpha : true });渲染器。设置像素比率(窗口。devicepixel比率);渲染器。setclearcolor(场景。雾。颜色);渲染器。setclear alpha(0.8);渲染器。setsize(窗口。内部宽度,窗户。内部高度);集装箱。appendchild(渲染器。圆顶元件);//添加技术渲染器函数render(){ 0刨花板系统。=0.0001之间。update();粒子系统。旋转。y=(MouseX相机。旋转。x)*。00001;相机。看(新的三Vector3(-10,-5,-10))控件。update();renderer.render(场景、摄像机);}函数animate() { //开始循环执行渲染动画requestAnimationFrame(动画);render();}8.添加鼠标操作事件实现角度控制

我们还可以添加鼠标操作事件实现角度控制,其中winX、winY分别为窗户的宽高的一半,当然具体的坐标位置可以根据自己的需求进行计算,具体的效果如下图所示。

文件。addeventlistener(' mousemove ',onDocumentMouseMove,false);函数onDocumentMouseMove(事件){ mouseX=(事件。client x-WinX)/2;mouseY=(事件。client y-WinY)/2;}

三、优化方案

1.减少粒子数量

随着粒子数量的增加,需要的计算每个粒子的位置和大小将会非常耗时,可能会造成动画卡顿或出现页面假死的情况,所以我们在建立模型时可尽量减少粒子的数量,能够有效提升性能。

在上面的例子中,我们可以通过改变导出模型的精细度来获得不同数量的粒子系统。当粒子数达到几十万甚至几百万的时候,我们在加载动画的时候就能感受到明显的卡壳现象,这主要是因为fps低的原因。具体对比效果如下图所示。左边的粒子数是30万,右边的粒子数是6万。很明显左侧跳跃明显,右侧基本保持比较平稳的状态。

2.采用GPU渲染

编写片段着色器代码,webgl可以为画布提供硬件3D加速,浏览器可以更流畅地渲染页面。目前,大多数设备已经支持这种模式。需要注意的是,由于硬件设备的原因,渲染速度可能不如基于低端设备上cpu计算的速度快。

四.摘要

综上所述,实现粒子动力学的关键是计算和保持每个粒子的位置状态,而three.js提供了一种便捷的方法,可以用来渲染整个粒子场景。当粒子数极大时,为了达到流畅的动画效果,要注意优化代码、减少计算等。我们也可以通过改进硬件配置来达到这个效果。文中的案例展示了如何实现3D粒子动态效果,你可以根据自己的实际需求做出更炫酷的动态效果。

好了,这就是本文的全部内容。希望本文的内容对大家的学习或工作有一定的参考价值。谢谢你的支持。

版权声明:基于三. js的三维粒子动态效果示例代码是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。