THREE.js 粒子系統
經常看到這樣一些場景:漫天飛舞的雪花、夜晚草叢中點點螢光、小河上下起的綿綿細雨…
這些浪漫??的效果都可以用粒子系統來實現,粒子系統用THREE.js實現就是通過Points
或者Sprite
類來實現的啦。
一、Points
A class for displaying points. The points are rendered by the WebGLRenderer using gl.POINTS.
所以Points
類就是通過 gl.POINTS
來渲染的。
建構函式
Points( geometry : Geometry, material : Material )
各引數說明:
geometry
— (optional) an instance of Geometry
or BufferGeometry
. Default is a new BufferGeometry.
material
— (optional) a Material. Default is a new PointsMaterial
with a random color.
Geometry
和BufferGeometry
的說明如下:
BufferGeometry
An efficient representation of mesh, line, or point geometry. Includes vertex positions, face indices, normals, colors, UVs, and custom attributes within buffers, reducing the cost of passing all this data to the GPU.
GeometryGeometry is a user-friendly alternative to BufferGeometry. Geometries store attributes (vertex positions, faces, colors, etc.) using objects like Vector3 or Color that are easier to read and edit, but less efficient than typed arrays.
也就是說,Geometry
的頂點位置,縮放,旋轉角,顏色,法線資訊等都是儲存在特定的類裡面,比如頂點位置使用Vector3
Color
。而BufferGeometry
類的都是使用陣列儲存的,並且快取在了記憶體緩衝區裡,減低了對GPU的消耗。 THREE.js中基本上是每類
Geometry
都有一個BufferGeometry
與之對應,比如我們平時使用的BoxGeometry
和BoxBufferGeometry
等。 Geometry
和BufferGeometry
的特點決定了他們各自的使用場景:Geometry
使用類來管理自身資訊,便於操作,用來建立經常變化的物體;BufferGeometry
由於使用陣列來管理,如果需要操作,必須去除其原始資訊,很難操作,而且buffer幾何體的資訊被快取在緩衝區中,所以Buffer幾何體適用於建立一旦建立就不需要修改的物體。
以上內容參考了這篇部落格
- 然後說說
PointsMaterial
PointsMaterial
The default material used by Points.
簡單明瞭,就是Points
類使用的材質。
PointsMaterial
的建構函式傳入的引數可以是所有 Material
的屬性,沒有擴充套件。
通常粒子系統用到的屬性有size, color, map, transparent
等。
使用示例
程式碼
這裡給出一個官網的示例,效果是一個星空圖
//This will add a starfield to the background of a scene
var starsGeometry = new THREE.Geometry();
for ( var i = 0; i < 10000; i ++ ) {
var star = new THREE.Vector3();
star.x = THREE.Math.randFloatSpread( 2000 );
star.y = THREE.Math.randFloatSpread( 2000 );
star.z = THREE.Math.randFloatSpread( 2000 );
starsGeometry.vertices.push( star );
}
var starsMaterial = new THREE.PointsMaterial( { color: 0x888888 } );
var starField = new THREE.Points( starsGeometry, starsMaterial );
scene.add( starField );
- 執行效果
想了解關於PointsMaterial
的更多資訊可以看官網的介紹。
二、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
建構函式
Sprite( material : Material )
引數說明如下:
material
- (optional) an instance of SpriteMaterial. Default is a white SpriteMaterial
.
SpriteMaterial
的說明也跟PointsMaterial
一樣簡單明瞭,是Sprite
使用的一種材質。其建構函式傳入的引數也可以是所有 Material
的屬性。
使用示例
- 程式碼
var material = new THREE.SpriteMaterial();
for (var x = -5; x <= 5; x++) {
for (var y = -5; y <= 5; y++) {
var sprite = new THREE.Sprite(material);
sprite.position.set(x * 10, y * 10, 0);
scene.add(sprite);
}
}
- 執行結果
想了解關於SpriteMaterial
的更多資訊可以看官網的介紹。