一、粒子、粒子系统和ParticleBasicMaterial
1.粒子(Particle)
我们可以使用THREE.Particle(material)构造函数手工创建粒子。唯一需要传入的参数是一个材质。该材质可以是Patricle,也可以是ParticleProgramMaterial。
THREE.Mesh的大部分属性都可以用于THREE.Particle。你可以用Position属性来定位,用scale属性来缩放,用translate属性来做相对位移。
对于这种创建粒子的方法,我们使用的渲染器是CanvasRenderer,而不是我们之前使用的WebGLRenderer。原因是创建粒子并直接添加到场景中,只对CanvasRenderer有效。
2.粒子系统(ParticleSystem)
除非使用CanvasRenderer类,否则你就需要用ParticleSystem类来显示粒子。ParticleSystem类的构造函数接受两个参数:一个几何体和一个材质。材质用来给粒子上色和添加纹理,而几何体则是用来指定将粒子放在哪里。每个顶点,即定义几何体的各个点,将会以粒子的形态展示出来。
3.ParticleBasicMaterial
下表是ParticleBasicMaterial对象中所有课设置属性的说明:
名称 | 描述 |
color | ParticleSystem对象中所有粒子的颜色。如果vertexColors属性设为true,而且也指定了几何体的colors属性,那么该属性就会被忽略。默认值是0xffffff |
map | 通过这个属性可以在粒子上应用某种材质 |
size | 指定粒子的大小,默认是1 |
sizeAnnutation | 如果设为false,那么所有粒子都将拥有相同的颜色。如果设为true,而且几何体的colors数组也有值,那就使用颜色数组中的值,默认是false |
vertexColors | 通常情况下ParticleSystem里的所有粒子都具有相同的颜色。如果该属性设为true,而且几何体的colors数组也有值,那就使用颜色数组中的值,默认是false |
opacity | 跟transparent属性一起使用,用来设置粒子的透明度。默认是1(不透明) |
transparent | 如果设为true,那么粒子在渲染时会根据opacity属性的值来确定其透明度。默认是false |
blending | 渲染粒子时的融合模式 |
fog | 粒子是否受场景雾化效果的影响。默认是true |
二、使用HTML5画布格式化粒子
1.在CanvasRenderer类里使用HTML5画布
通过ParticleCanvasMaterial,你可以将HTML5画布的输出结果作为粒子的纹理。该材质是特别为CanvasRenderer创建的,而且只能用于这种渲染器。我们先来看看该材质可以设置的属性:
名称 | 描述 |
color | 粒子的颜色。根据特定的融合模式,可以影响画布的颜色 |
program | 这是一个以画布上下文为参数的函数。该函数在渲染粒子时调用。调用该函数将在画布上下文中产生一个输出,该输出将会以粒子的形态显示出来 |
opacity | 粒子的透明度。默认是1,不透明 |
transparent | 粒子是否透明。同opacity属性一起使用 |
blending | 融合模式。 |
2.在WebGLRenderer中使用HTML5画布
要使用WebGLRenderer类,只能使用ParticleBasicMaterial来达到同样的目的。ParticleBasicMaterial有一个map(贴图)属性。通过map属性我们可以为粒子加载纹理。该纹理在Three.js中也可以是HTML5画布的输出。
三、使用纹理格式化粒子
这里我们介绍一种更直接的、使用图片格式化粒子的方法。在Three.js中可以使用THREE.ImageUtils.loadTexture()方法加载外部的图片。
四、使用精灵(THREE.Sprite)
THREE.Sprite类可以用于如下两种目的:
- 创建一个可以基于屏幕坐标移动、定位和缩放的对象。你可以用它来创建一个平视显示器(Head-Up display,简称HUD),就像在三维场景上蒙了一层。
- 创建一个类似粒子的、可以在三维空间移动的对象,类似使用CanvasRenderer的THREE.Particle。三维场景中的精灵有时也称作广告牌。所谓广告牌指的是精灵总是面向镜头,就像高速路上的广告牌总是面向司机。
创建一个sprite对象我们需要为它传入材质,如下所示:
var spriteMaterial = new THREE.SpriteMaterial({
opacity:opacity,
color:color,
transparent:transparent,
useScreenCoordinates:true,
map:getTexture()
});
var sprite = new THREE.Sprite(spriteMaterial);
我们来看一下SpriteMaterial的属性:
名称 | 描述 |
Color | 粒子的颜色 |
Map | 精灵所用纹理 |
sizeAnnutation | 如果设为false,那么距离镜头的远近就不会影响精灵的大小。默认是true |
opacity | 设置精灵的透明度。默认是1(不透明) |
blending | 渲染精灵时所用的融合模式 |
fog | 精灵是否受场景雾化效果的影响。默认是true |
useScreenCoordinates | 如果设为true,精灵的位置就是绝对位置。原点是屏幕的左上方 |
scaleByViewport | 精灵的大小取决于视图窗口的尺寸。如果设为true,那么精灵的尺寸=图片宽度/视图窗口的高度。如果设为false,那么精灵的尺寸=图片宽度/1.0 |
alignment | 当精灵被缩放时(使用scale属性),该属性指定精灵从哪里开始缩放。如果将该属性设为THREE.SpriteAlignment.topLeft,那么当增加或减少精灵的缩放比例时,精灵的左上角保持不动 |
uvOffset | 结合uvOffset属性,选择精灵所用的纹理 |
uvScale | 结合uvScale属性,选择精灵所用的纹理 |
你还可以在这个材质上设置depthTest属性和depthWrite属性。参考day3