# 粒子渲染器

粒子渲染器(ParticleRenderer)负责粒子的渲染绘制,目前提供SpriteParticleRendererInstancedParticleRenderer两种类型的粒子渲染器。此外,开发人员可以根据实际需求扩展粒子渲染器。

🌏 SpriteParticelRenderer:使用“点精灵”方式渲染粒子,常用于火、烟雾、雨、雪、雾、飞线等粒子渲染:

import { NormalBlending } from 'three';
import { SpriteParticleRenderer } from '@tx3d/particlesystem';

// 创建一个点精灵粒子渲染器
const renderer = new SpriteParticleRenderer( {

    total: 1000,
    map: 'assets/textures/rain.png',
    blending: NormalBlending

} );
1
2
3
4
5
6
7
8
9
10
11

提示

SpriteParticleRenderer的初始化参数,详见ParticleRendererParameters

🌏 InstancedParticleRenderer:使用实例化方式渲染粒子,常用于落煤、落石等粒子渲染:

import { InstancedParticleRenderer } from '@tx3d/particlesystem';

// 创建一个实例化粒子渲染器
const renderer = new InstancedParticleRenderer( {

    url: 'assets/models/煤矿.gltf' // glTF数据路径,必不可少

} );
1
2
3
4
5
6
7
8

提示

InstancedParticleRenderer的初始化参数,详见InstancedParticleRendererParameters

注意

粒子渲染器可以渲染的最大粒子数目(total)需大于等于其拥有的发射器可发射的最大粒子数目总和!

# 粒子渲染器接口

🌏 addEmitter 添加一个粒子发射器

// 添加一个粒子发射器
renderer.addEmitter( emitter );
1
2

🌏 getEmitter 通过索引获取粒子发射器

// 获取0号索引粒子发射器
const emitter = renderer.getEmitter( 0 );
1
2

🌏 removeEmitter 移除一个粒子发射器

// 移除一个粒子发射器
renderer.removeEmitter( emitter );
1
2

🌏 removeAllEmitters 移除所有粒子发射器

// 移除所有粒子发射器
renderer.removeAllEmitters();
1
2

🌏 destroy 销毁粒子发射器

// 销毁粒子发射器
renderer.destroy();
1
2

# 扩展粒子渲染器

扩展粒子渲染器时需要注意以下几点:

🌏 必须重载以下方法

  🌏 getType 返回粒子渲染器类型,用于粒子模板数据生成

  🌏 _updateRenderer 逐帧更新粒子渲染器

  🌏 _destroyRenderer 销毁粒子渲染器

  🌏 _serialize 序列化粒子渲染器,用于粒子模板数据生成

此外,根据实际需求选择重载粒子排序方法_sortParticles

提示

默认情况粒子按照距相机距离由远及近进行排序(因为大多数情况下粒子属于透明物体,所以使用降序),可以根据实际情况选择升序排序或其它排序方式。粒子渲染器提供了_sortParticlesByCamera方法实现安装距相机距离升序或降序排序。

import { Particle } from '@tx3d/particlesystem';

protected _sortParticles( particles: Array<Particle> ): void {

    // 升序排序
    this._sortParticlesByCamera( particles, false );

}
1
2
3
4
5
6
7
8

🌏 粒子渲染对象需要赋值给粒子渲染器的 _renderer 属性

🌏 粒子渲染器的 _total 属性用于设置可渲染的最大粒子数目,默认2000;_renderOrder属性用于设置粒子渲染顺序,默认RenderOrder.Default。创建粒子渲染器时可以通过total和renderOrder参数初始化属性。

import { RenderOrder } from '@tx3d/core';

const renderer = new CustomParticleRenderer( { total: 500, renderOrder: RenderOrder.Default + 1 } );
1
2
3

扩展粒子渲染器示例代码

import { Particle, ParticleRenderer } from '@tx3d/particlesystem';

/**
 * 扩展粒子渲染器类
 */
class CustomParticleRenderer extends ParticleRenderer {

    construct( parameters: any ) {

        super( parameters );

        // 准备粒子渲染器
        this._prepare( parameters );

    }

    // public functions

    /**
     * 获取粒子渲染器类型
     */ 
    getType(): string {

        return 'custom';

    }

    // private functions

    /**
     * 准备粒子渲染器
     */ 
    private _prepare( parameters ): void {

        // TODO:准备材质

        // TODO:准备Geometry

        // 构建粒子渲染器
        this._renderer = new InstancedMesh( geometry, material, this._total );

    }

    // protected functions

    /** 
     * 更新粒子渲染器
    */
    protected _updateRenderer( particles: Particle[] ): void {

        // TODO:更新粒子渲染器

    }

    /**
     * 销毁粒子渲染器
     */ 
    protected _destroyRenderer(): void {

        // TODO:销毁粒子渲染器

    }

    /**
     * 序列化粒子渲染器
     */ 
    protected _serialize( meta: any ): void {

        // TODO:序列化粒子渲染器

    }

}

// 创建扩展粒子渲染器
const renderer = new CustomParticleRenderer( { total: 1000, renderOrder: RenderOrder.Default + 1 } );
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
Last Updated: 9/18/2023, 3:24:59 PM