升级版ThreeJS 3D粒子波浪动画

2020-04-12 23:07:22 1307 编程开发

效果图

升级版demo 2:改变粒子的形状

demo 2

升级版demo 1:改变粒子大小,颜色

demo 1

ThreeJS官方示例:https://threejs.org/examples/#canvas_particles_waves

ThreeJS官方示例

原版粒子动画的JS部分也就一百多行代码吧,看明白不难。尽管如此,在实现想要的效果,尤其是demo 2的过程中,仍遇到了不少问题,甚至一度以为无法实现。好在最终都找到了解决办法,完美实现了需求。

这篇文档将介绍实现这两个demo时需要注意的一些关键点,遇到的一些问题和解决办法。

Three.js版本:r90

升级版demo 1

创建粒子的思路:定义一种 Material,然后作为参数传递到粒子构造函数中。

new THREE.Sprite( material )

改变粒子颜色/大小

Material 是什么呢?它描述物体的外观。

因此,要改变粒子颜色或者大小,从Material着手。在Three.js 版本更新过程中,Material 种类也发生了一些变化。旧版本支持的 Material 在新版本中不一定可以使用,这一点在文档后面部分详细说。

粒子波浪示例使用了SpriteCanvasMaterial 来创建粒子材质,其 API定义 如下:

Create a material that can draw custom sprites using a 2d canvas.

构造函数可接受两个参数。如何修改粒子颜色大小一目了然。

var material = new THREE.SpriteCanvasMaterial( {

color: 0xffffff, //粒子的颜色

program: function ( context ) { //用于绘制粒子的方法

context.beginPath();

context.arc( 0, 0, 0.5, 0, PI2, true ); //画一个圆形。此处可修改大小。

context.fill();

}

} );

只改变部分粒子

for ( var ix = 0; ix < AMOUNTX; ix ++ ) {

for ( var iy = 0; iy < AMOUNTY; iy ++ ) {

particle = particles[ i ++ ] = new THREE.Sprite( material ); //修改此处的material参数

particle.position.x = ix * SEPARATION - ( ( AMOUNTX * SEPARATION ) / 2 );

particle.position.z = iy * SEPARATION - ( ( AMOUNTY * SEPARATION ) / 2 );

scene.add( particle );

}

}

升级版demo 2

改变粒子形状

根据上一个demo,我们可以大胆设想,要改变粒子形状,只需要修改THREE.SpriteCanvasMaterial 方法中的program参数。没错,思路正确。

比如我们绘制正方形粒子:

var material = new THREE.SpriteCanvasMaterial ({

color: "orange", //粒子的颜色

program: function(context) { //用于绘制粒子的方法

context.fillRect(0, 0, 2, 2); //绘制一个正方形

}

});

效果如下:

正方形粒子波浪.png

然而,当我们挪动鼠标的时候,相机角度变化,就会发现一个很严重的问题:

画布上会出现残影。

残影.png

非常惨烈。

这个问题卡了我好久,最初以为是ThreeJS的问题,后来才发现其实是我使用不当。参考这个问题 three.js canvas wont clear - particle/sprite trails 以及 issue#4418 。尤其是这两段话:

讨论1

讨论2

也就是说,粒子必须在1x1的区域内绘制。超出这个区域就会出现上面的残影问题,因为超出部分无法被及时清除。比如上面的橙色正方形,设置的边长是 2px,就出问题了。

那如果要绘制大一些的粒子呢?思路是,program 方法中在1 x 1 的区域内绘制粒子,之后再把粒子放大(scale),也就是修改particle.scale.x , particle.scale.y , particle.scale.z 这三个变量。

demo 2中对应的代码:

绘制粒子形状:

var material2 = new THREE.SpriteCanvasMaterial ({

color: '#F28321', //粒子的颜色

program: function(context) { //用于绘制粒子的方法

context.beginPath();

//绘制渐变色的矩形

var lGrd = context.createLinearGradient(-0.008,0.25,0.016,-0.25);

lGrd.addColorStop(0, '#F28321');

lGrd.addColorStop(1, 'transparent');

context.fillStyle = lGrd;

context.fillRect(-0.008,0.25,0.016,-0.25); //注意此处的坐标大小

//绘制底部和顶部圆圈

context.fillStyle = "#F28321";

context.arc(0, 0, 0.008, 0, PI2, true); //绘制底部圆圈

context.arc(0, 0.25, 0.008, 0, PI2, true); //绘制顶部圆圈

context.fill();

context.closePath();

//绘制顶部渐变色光圈

var rGrd = context.createRadialGradient(0, 0.25, 0, 0, 0.25, 0.025);

rGrd.addColorStop(0, 'transparent');

rGrd.addColorStop(1, 'rgba(242,131,33,0.28)');

context.fillStyle = rGrd;

context.arc(0, 0.25, 0.025, 0, PI2, true); //绘制一个圆圈

context.fill();

}

});

放大粒子:

//更新粒子的位置和大小

for (var ix = 0; ix < AMOUNTX; ix++) {

for (var iy = 0; iy < AMOUNTY; iy++) {

particle = particles[i++];

//更新粒子位置

particle.position.y = (Math.sin((ix + count) * 0.3) * 50) + (Math.sin((iy + count) * 0.5) * 50);

//更新粒子大小

particle.scale.x = particle.scale.y = particle.scale.z = ( (Math.sin((ix + count) * 0.3) + 1) * 4 + (Math.sin((iy + count) * 0.5) + 1) * 4 )*100; //正常情况下再放大100倍

}

}

ThreeJS版本

在这个demo中,ThreeJS的版本很重要。一开始我使用的不是官网的例子(http://www.css88.com/archives/5996/comment-page-1),其中ThreeJS 版本是 r56。

然而代码中用到的 ParticleCanvasMaterial 和 Particle 在ThreeJS r62及更新版本中已经被移除了。会出现以下问题:

Uncaught TypeError: THREE.ParticleCanvasMaterial is not a constructor

THREE.Particle has been renamed to THREE.Sprite.

因此要留心ThreeJS的版本,以及其升级指南 。

在React中使用ThreeJS

正常情况下,可以按照官方文档中介绍的如何导入ThreeJS模块来操作:https://threejs.org/docs/index.html#manual/introduction/Import-via-modules

但是,在这个粒子波浪实例中,要用到 js/renderers/Projector.js 和 js/renderers/CanvasRenderer.js 。先导入ThreeJS模块,再使用 require 加载前两个文件。仍然行不通。

最后的解决办法是,在HTML中引用 ThreeJS 的 .min.js文件。然后在对应组件中使用 require 加载那两个js文件。

或许有更好的办法,还需要调研。参考话题:

Can't use CanvasRenderer or Projector when I'm using Three from npm : https://github.com/mrdoob/three.js/issues/10617

transform examples/js to support modules : https://github.com/mrdoob/three.js/issues/9562

css和js3d粒子,升级版ThreeJS 3D粒子波浪动画相关推荐

  1. 六、CSS 速览 —— 平面转换、3D转换、动画

    平面转换.3D转换.动画 字体图标 iconfont 阿里图标库 从图标库引用素材 平面转换 transition: all 1s; 设置元素变换动画 transform: translate(px, ...

  2. css海浪动画代码,CSS3实现的线条波浪动画效果

    演示: http://demo.shanhubei.com/demo/waveAnimation/ 这是一款使用CSS3 animation动画和png图片制作的css3线条波浪动画效果.该特效中,使 ...

  3. HTML做3D立体特效,html5 3D立体粒子波浪动画特效代码

    特效描述:html5 3D立体 粒子波浪动画.3D 粒子动画特效 代码结构 1. 引入JS 2. HTML代码 /// Scene const sceneSettings = { width: () ...

  4. three相机在模型上_基于 three.js 的 3D 粒子动效实现

    作者:个推web前端开发工程师 梁神 一.背景 粒子特效是为模拟现实中的水.火.雾.气等效果由各种三维软件开发的制作模块,原理是将无数的单个粒子组合使其呈现出固定形态,借由控制器.脚本来控制其整体或单 ...

  5. 事情没有想象中那么难--JX官网首页3D粒子效果

    上周为AlloyTeam/JX做了个简单的官网http://alloyteam.github.com/JX/,当时文档,demo以及其他的附属工具都还没完善,地址就流了出去... 独立的粒子特效dem ...

  6. java实现3D动态效果_js实现3D粒子酷炫动态旋转特效

    js实现3D粒子酷炫动态旋转特效(效果比较酷炫,中途不仅有形态的变换,还有颜色的变化,希望大家能够喜欢) 代码实现过程中的静态截图 New Document html,body{ margin:0px ...

  7. html5 canvas时光隧道3D粒子动画js特效

    下载地址 html5 canvas时光隧道3D粒子动画特效是一款非常酷炫的3D粒子时光穿梭视觉冲击动画特效. dd:

  8. 超酷3D粒子分散PS动作_使用教程

    首先我们需要下载一组PS制作人像3D粒子打散飞溅效果动作,然后我们运用这个动作就可以制作出下图的一些效果了,动作支持CS3-CC2017版本软件,下面我们用CS6做为演示. 01.载入画笔.图案.动作 ...

  9. LayaAir2.8版本新增3D粒子裁剪、预烘焙骨骼动画、视频贴图等3D功能,支持发布字节(抖音、今日头条)小游戏...

    在本次的2.8版本中,我们更新的重心仍然在3D引擎功能的丰富以及易用性提升上,在7月30日,我们在官网低调开放了2.7.1的小版本,由于该版本仅更新了字节跳动(抖音.今日头条)小游戏的发布支持,未对引 ...

最新文章

  1. ubuntu服务器mysql管理 第一弹
  2. PHP Mysql类【转】
  3. 使用二进制包安装MariaDB
  4. php 开启mail函数 wo,php mail 函数发送邮件
  5. awk使用shell中的变量
  6. 《Head First设计模式》 读书笔记16 其余的模式(二) 蝇量 解释器 中介者
  7. 8266 at 驱动_AT、CVT、DCT 变速器,到底哪个更靠谱
  8. Learning to see in the dark【SID】论文笔记
  9. [PHP]如何在百度(BAE)和新浪(SAE)的云平台使用PHP连接MySQL并返回结果数据
  10. 李洪强iOS开发之Foundation框架—结构体
  11. Android:单元测试InstrumentationTestRunner
  12. 5款Mac必备的Safari扩展
  13. 利用IDLE对 dem进行批量拼接处理
  14. VirtualBox LINUX虚拟机与WINDOWS共享文件夹
  15. 将微信数据提取为exel表格(2022年版)免root 保姆级教程
  16. 高等数学,线性代数 课后题解答
  17. 第二代支付系统专题之报文篇(二)大额支付报文完整版(含二代新增功能业务说明)
  18. 搭建IMXRT1020单片机开发环境(采用MCUXpressoIDE,包括安装SDK)
  19. HTML5期末大作业:红酒销售网页网站设计——品牌红酒销售网页模板(4页) html网页设计期末大作业_网页设计平时作业
  20. 修改java游戏分辨率怎么调_怎么修改jar游戏的分辨率

热门文章

  1. . xx.sh ./xx.sh sh xx.sh的区别
  2. 君子喻于义,小人喻于利
  3. 关于.SMP格式音乐加密文件破解方法的一些尝试
  4. (好文分享)RIM就是我
  5. nodejs 打印五彩斑斓的黑
  6. 刚刚重做系统的计算机开机时间很慢,U盘重装系统后电脑开机慢该怎么解决?解决电脑开机慢的方法...
  7. RBG颜色对照表:有网址
  8. 高等数学 上册 第四章 不定积分
  9. love2d之路(一)环境配置
  10. IronPython中使用Cecil类库指南