@realsee/five 6.8.6 → 6.8.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ai_guides/README.md +2 -0
- package/ai_guides/features/flowing-fireworks-3d-pass.md +296 -0
- package/ai_guides/features/flowing-light-3d-pass.md +1 -0
- package/ai_guides/features/postprocessing.md +3 -1
- package/docs/assets/hierarchy.js +1 -1
- package/docs/assets/navigation.js +1 -1
- package/docs/assets/search.js +1 -1
- package/docs/classes/five.AdaptiveLuminancePass.html +1 -1
- package/docs/classes/five.BoundingMesh.html +1 -1
- package/docs/classes/five.Camera.html +1 -1
- package/docs/classes/five.EyeDomeLightingPass.html +1 -1
- package/docs/classes/five.Five.html +1 -1
- package/docs/classes/five.FivePass.html +1 -1
- package/docs/classes/five.FlowingLight2DPass.html +22 -0
- package/docs/classes/five.FlowingLight3DPass.html +22 -0
- package/docs/classes/five.GaussianBlurPass.html +20 -0
- package/docs/classes/five.InternalWebGLRenderer.html +1 -1
- package/docs/classes/five.Model.html +1 -1
- package/docs/classes/five.ModelScene.html +1 -1
- package/docs/classes/five.NetworkSubscribe.html +1 -1
- package/docs/classes/five.PBMContainer.html +1 -1
- package/docs/classes/five.PBMCustomShader.html +1 -1
- package/docs/classes/five.PBMGSObject.html +3 -2
- package/docs/classes/five.PBMGroup.html +1 -1
- package/docs/classes/five.PBMMesh.html +1 -1
- package/docs/classes/five.PBMMeshMaterial.html +1 -1
- package/docs/classes/five.PBMPanoFilter.html +1 -1
- package/docs/classes/five.PBMPointCloud.html +1 -1
- package/docs/classes/five.PBMPointCloudMaterial.html +1 -1
- package/docs/classes/five.PBMSkinnedMesh.html +1 -1
- package/docs/classes/five.PBMUpdateable.html +1 -1
- package/docs/classes/five.PanoCircleMesh.html +1 -1
- package/docs/classes/five.PanoCircleMeshCustom.html +1 -1
- package/docs/classes/five.PanoCircleMeshSolid.html +1 -1
- package/docs/classes/five.Parameter.html +22 -20
- package/docs/classes/five.Scene.html +1 -1
- package/docs/classes/five.Subscribe.html +1 -1
- package/docs/classes/five.TextureLoader.html +1 -1
- package/docs/classes/five.Tile3D.html +1 -1
- package/docs/classes/five.TileNode.html +1 -1
- package/docs/classes/five.TrajectoryNode.html +1 -1
- package/docs/classes/five.WorkResolvedObserver.html +1 -1
- package/docs/classes/gltf-loader.DDSLoader.html +1 -1
- package/docs/classes/gltf-loader.DRACOLoader.html +1 -1
- package/docs/classes/gltf-loader.GLTFLoader.html +1 -1
- package/docs/classes/gltf-loader.GLTFObject.html +1 -1
- package/docs/classes/gltf-loader.THREEGLTFLoader.html +1 -1
- package/docs/classes/line.Line.html +1 -1
- package/docs/classes/line.LineGeometry.html +1 -1
- package/docs/classes/line.LineMaterial.html +1 -1
- package/docs/classes/line.LineSegmentsGeometry.html +1 -1
- package/docs/classes/line.THREE_Line2.html +1 -1
- package/docs/classes/line.THREE_LineSegments2.html +1 -1
- package/docs/classes/plugins.BasePlugin.Controller.html +1 -1
- package/docs/classes/plugins.CSS2DObject.html +1 -1
- package/docs/classes/plugins.CSS3DObject.html +1 -1
- package/docs/classes/plugins.CSS3DSprite.html +1 -1
- package/docs/classes/plugins.InstancedPrefabBufferGeometry.html +1 -1
- package/docs/classes/plugins.Object3DHelperController.html +1 -1
- package/docs/classes/plugins.PointBufferGeometry.html +1 -1
- package/docs/classes/plugins.PrefabBufferGeometry.html +1 -1
- package/docs/classes/plugins.RoundedBoxGeometry.html +1 -1
- package/docs/classes/sticker.Sticker.html +1 -1
- package/docs/classes/vfx.Airflow.html +1 -1
- package/docs/classes/vfx.Flame.html +1 -1
- package/docs/classes/vfx.Particle.html +1 -1
- package/docs/classes/vfx.ParticleGPU.html +1 -1
- package/docs/classes/vfx.SpotLight.html +1 -1
- package/docs/documents/README.html +6 -0
- package/docs/documents/features_flowing-fireworks-3d-pass.html +242 -0
- package/docs/documents/features_flowing-light-3d-pass.html +1 -0
- package/docs/documents/features_postprocessing.html +3 -1
- package/docs/functions/plugins.calculatePath2DLength.html +1 -0
- package/docs/functions/plugins.calculatePath3DLength.html +1 -0
- package/docs/hierarchy.html +1 -1
- package/docs/index.html +6 -0
- package/docs/interfaces/five.AddableObject.html +1 -1
- package/docs/interfaces/five.AjaxOptions.html +1 -1
- package/docs/interfaces/five.BaseEvent.html +1 -1
- package/docs/interfaces/five.BaseExtendableEvent.html +1 -1
- package/docs/interfaces/five.EventCallback.html +1 -1
- package/docs/interfaces/five.GestureEvent.html +1 -1
- package/docs/interfaces/five.ImageOptions.html +1 -1
- package/docs/interfaces/five.IntersectEvent.html +1 -1
- package/docs/interfaces/five.IntersectMesh.html +1 -1
- package/docs/interfaces/five.IntersectMeshInterface.html +1 -1
- package/docs/interfaces/five.Intersection.html +1 -1
- package/docs/interfaces/five.LooseWorkWithExtrinsics.html +1 -1
- package/docs/interfaces/five.ModeChangeEvent.html +1 -1
- package/docs/interfaces/five.ModelControllerCustomInitArgs.html +1 -1
- package/docs/interfaces/five.ModelEvent.html +1 -1
- package/docs/interfaces/five.ModelSceneEvent.html +1 -1
- package/docs/interfaces/five.ModelTileEvent.html +1 -1
- package/docs/interfaces/five.MovePanoOptions.html +1 -1
- package/docs/interfaces/five.NetworkAbortError.html +1 -1
- package/docs/interfaces/five.NetworkFirbiddenError.html +1 -1
- package/docs/interfaces/five.NetworkOptions.html +1 -1
- package/docs/interfaces/five.NetworkProxyError.html +1 -1
- package/docs/interfaces/five.NetworkResourceEvent.html +1 -1
- package/docs/interfaces/five.NetworkResponseError.html +1 -1
- package/docs/interfaces/five.NetworkTimeoutError.html +1 -1
- package/docs/interfaces/five.ObjectEvent.html +1 -1
- package/docs/interfaces/five.PBMMaterial.html +1 -1
- package/docs/interfaces/five.PBMMeshMaterialParameters.html +1 -1
- package/docs/interfaces/five.PBMPointCloudMaterialParameters.html +1 -1
- package/docs/interfaces/five.PanoCircleMeshInterface.html +1 -1
- package/docs/interfaces/five.PanoEvent.html +1 -1
- package/docs/interfaces/five.PanoPrepareEvent.html +1 -1
- package/docs/interfaces/five.PanoTextureEvent.html +1 -1
- package/docs/interfaces/five.PanoramaControllerCustomInitArgs.html +1 -1
- package/docs/interfaces/five.PanoramaLikeControllerCustomInitArgs.html +1 -1
- package/docs/interfaces/five.ParameterMaterialValue.html +5 -3
- package/docs/interfaces/five.ParameterTilesetValue.html +15 -15
- package/docs/interfaces/five.ParameterValue.html +19 -17
- package/docs/interfaces/five.Pose.html +1 -1
- package/docs/interfaces/five.RenderEvent.html +1 -1
- package/docs/interfaces/five.ResolvedParameterValue.html +20 -18
- package/docs/interfaces/five.State.html +1 -1
- package/docs/interfaces/five.StateEvent.html +1 -1
- package/docs/interfaces/five.TextureOptions.html +1 -1
- package/docs/interfaces/five.TopviewControllerCustomInitArgs.html +1 -1
- package/docs/interfaces/five.VRPanoramaControllerCustomInitArgs.html +1 -1
- package/docs/interfaces/five.ViewLayer.html +1 -1
- package/docs/interfaces/five.WorkCubeImage.html +1 -1
- package/docs/interfaces/five.WorkImage.html +1 -1
- package/docs/interfaces/five.WorkObserver.html +1 -1
- package/docs/interfaces/five.WorkObserverProto.html +1 -1
- package/docs/interfaces/five.WorkTile.html +1 -1
- package/docs/interfaces/five.WorksEvent.html +1 -1
- package/docs/interfaces/five.XRControllerEvent.html +1 -1
- package/docs/interfaces/five.XRGestureEvent.html +1 -1
- package/docs/interfaces/five.XRPanoramaControllerCustomInitArgs.html +1 -1
- package/docs/interfaces/five.XRSessionEvent.html +1 -1
- package/docs/interfaces/plugins.BackgroundPluginController.html +1 -1
- package/docs/interfaces/plugins.BackgroundPluginType.EventMap.html +1 -1
- package/docs/interfaces/plugins.BasePlugin.State.html +1 -1
- package/docs/interfaces/plugins.CSS2DPluginController.html +1 -1
- package/docs/interfaces/plugins.CSS2DPluginType.EventMap.html +1 -1
- package/docs/interfaces/plugins.CSS2DPluginType.State.html +1 -1
- package/docs/interfaces/plugins.CSS3DPluginController.html +1 -1
- package/docs/interfaces/plugins.CSS3DPluginType.EventMap.html +1 -1
- package/docs/interfaces/plugins.CSS3DPluginType.State.html +1 -1
- package/docs/interfaces/plugins.DynamicPathLinePluginController.html +1 -1
- package/docs/interfaces/plugins.DynamicPathLinePluginType.EventMap.html +1 -1
- package/docs/interfaces/plugins.DynamicPathLinePluginType.State.html +1 -1
- package/docs/interfaces/plugins.GaussianSplattingEntranceAnimationController.html +3 -3
- package/docs/interfaces/plugins.GaussianSplattingEntranceAnimationPluginType.EventMap.html +1 -1
- package/docs/interfaces/plugins.GaussianSplattingEntranceAnimationPluginType.State.html +1 -1
- package/docs/interfaces/plugins.ItemMaskController.html +1 -1
- package/docs/interfaces/plugins.ItemMaskPluginType.EventMap.html +1 -1
- package/docs/interfaces/plugins.ItemMaskPluginType.State.html +1 -1
- package/docs/interfaces/plugins.Object3DHelperPluginType.BaseController.html +1 -1
- package/docs/interfaces/plugins.Object3DHelperPluginType.BaseHelper.html +1 -1
- package/docs/interfaces/plugins.Object3DHelperPluginType.BoundingBoxController.html +1 -1
- package/docs/interfaces/plugins.Object3DHelperPluginType.MoveController.html +1 -1
- package/docs/interfaces/plugins.Object3DHelperPluginType.MoveHelperAbstract.html +1 -1
- package/docs/interfaces/plugins.Object3DHelperPluginType.RotateController.html +1 -1
- package/docs/interfaces/plugins.Object3DHelperPluginType.RotateHelperAbstract.html +1 -1
- package/docs/interfaces/plugins.OrientationPluginController.html +1 -1
- package/docs/interfaces/plugins.OrientationPluginType.EventMap.html +1 -1
- package/docs/interfaces/plugins.OrientationPluginType.State.html +1 -1
- package/docs/interfaces/plugins.PanoAnimeController.html +1 -1
- package/docs/interfaces/plugins.PanoAnimePluginType.EventMap.html +1 -1
- package/docs/interfaces/plugins.PanoAnimePluginType.State.html +1 -1
- package/docs/interfaces/plugins.PluginTemplateType.EventMap.html +1 -1
- package/docs/interfaces/plugins.PluginTemplateType.State.html +1 -1
- package/docs/interfaces/plugins.TrajectoryController.html +1 -1
- package/docs/interfaces/react.FiveInjectionTypes.html +1 -1
- package/docs/interfaces/react.UseFivePluginOptions.html +1 -1
- package/docs/interfaces/react.UseFivePluginOptionsWithCreate.html +1 -1
- package/docs/modules/five.html +1 -1
- package/docs/modules/plugins.html +1 -1
- package/docs/modules.html +1 -1
- package/docs/types/five.FlowingLight2DPassLine.html +10 -0
- package/docs/types/five.FlowingLight3DPassLine.html +10 -0
- package/docs/types/five.ParseOptions.html +1 -1
- package/docs/types/plugins.BasePlugin.EventMap.html +1 -1
- package/five/gaussian-splatting/util/renderData.d.ts +2 -0
- package/five/index.js +532 -51
- package/five/index.mjs +1905 -1593
- package/five/model/objects/pbmGaussianSplattingObject.d.ts +1 -0
- package/five/model/objects/pbmGaussianSplattingRenderMesh.d.ts +2 -0
- package/five/model/parameter.d.ts +4 -0
- package/five/renderer/index.d.ts +1 -1
- package/five/renderer/postprocessing/index.d.ts +3 -2
- package/five/renderer/postprocessing/passes/flowing-fireworks-3d-pass.d.ts +74 -0
- package/five/renderer/postprocessing/passes/flowing-light-2d-pass.d.ts +4 -5
- package/five/renderer/postprocessing/passes/flowing-light-3d-pass.d.ts +4 -5
- package/gltf-loader/index.js +3 -3
- package/gltf-loader/index.mjs +3 -3
- package/line/index.js +3 -3
- package/line/index.mjs +3 -3
- package/llms.txt +2 -0
- package/package.json +1 -1
- package/plugins/GaussianSplattingEntranceAnimationPlugin/Controller.d.ts +1 -0
- package/plugins/index.d.ts +1 -0
- package/plugins/index.js +3 -3
- package/plugins/index.mjs +32 -9
- package/plugins/utils/math.d.ts +2 -0
- package/react/index.js +2 -2
- package/react/index.mjs +2 -2
- package/shader-lib/SweepModelScreen/index.d.ts +6 -0
- package/shader-lib/SweepModelScreen/plugin.d.ts +23 -0
- package/shader-lib/SweepModelScreen/utils.d.ts +39 -0
- package/shader-lib/index.d.ts +1 -0
- package/shader-lib/index.js +34 -3
- package/shader-lib/index.mjs +118 -3
- package/sticker/index.js +3 -3
- package/sticker/index.mjs +3 -3
- package/umd/five-gltf-loader.js +3 -3
- package/umd/five-line.js +3 -3
- package/umd/five-plugins.js +3 -3
- package/umd/five-react.js +2 -2
- package/umd/five-shader-lib.js +34 -3
- package/umd/five-sticker.js +3 -3
- package/umd/five-vfx.js +2 -2
- package/umd/five-vue.js +2 -2
- package/umd/five.js +500 -19
- package/vfx/index.js +2 -2
- package/vfx/index.mjs +2 -2
- package/vue/index.js +2 -2
- package/vue/index.mjs +2 -2
- package/work-downloader/index.js +2 -2
- package/work-downloader/index.mjs +2 -2
package/ai_guides/README.md
CHANGED
|
@@ -76,6 +76,7 @@
|
|
|
76
76
|
* [Postprocessing](./features/postprocessing.md): 后处理效果 (Pass, EffectComposer)。
|
|
77
77
|
* [Flowing Light 2D Pass](./features/flowing-light-2d-pass.md): 屏幕空间流光特效(InstancedMesh 优化)。
|
|
78
78
|
* [Flowing Light 3D Pass](./features/flowing-light-3d-pass.md): 3D 世界坐标流光特效(InstancedMesh 优化)。
|
|
79
|
+
* [Flowing Fireworks 3D Pass](./features/flowing-fireworks-3d-pass.md): 流光尾部喷射的烟花粒子特效(GPU 粒子)。
|
|
79
80
|
* [Gaussian Blur Pass](./features/gaussian-blur-pass.md): 高斯模糊特效。
|
|
80
81
|
* [Material](./features/material.md): 材质参数配置 (透明度、点云大小、顶点标记)。
|
|
81
82
|
* [Pano Filter](./features/pano-filter.md): 全景图滤镜 (亮度、对比度、色温调节)。
|
|
@@ -122,6 +123,7 @@
|
|
|
122
123
|
| 截图 / 放大镜 / Screen capture | [Get Screen Pixels](./features/get-screen-pixels.md) | magnifier, screenshot, color-picker, 取色器 |
|
|
123
124
|
| 模型裁切 / 房屋剖面 | [Clipper](./features/clipper.md) | clipping-box, section-view, discard, 开盖, 剖面 |
|
|
124
125
|
| 流光特效 / Flowing light effect | [Flowing Light 2D](./features/flowing-light-2d-pass.md), [Flowing Light 3D](./features/flowing-light-3d-pass.md) | 光带, 导航路径, 动态路径, instanced |
|
|
126
|
+
| 烟花 / 火花 / 流光拖尾粒子 / Fireworks sparks | [Flowing Fireworks 3D](./features/flowing-fireworks-3d-pass.md) | 烟花, 火花, 粒子, 发散, 爆裂, fireworks, particle, sparks |
|
|
125
127
|
| 模糊特效 / Blur effect | [Gaussian Blur Pass](./features/gaussian-blur-pass.md) | 毛玻璃, 背景虚化, gaussian |
|
|
126
128
|
| 保存/恢复场景状态 | [State](./features/state.md) | snapshot, save, restore, 快照, 场景还原 |
|
|
127
129
|
| 多场景切换 / 沙盘 | [Multi-Work](./features/multi-work.md) | sandbox, 多户型, 拼接, workCode |
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
# Flowing Fireworks 3D Pass (流光烟花 3D 通道)
|
|
2
|
+
|
|
3
|
+
- **Summary**: `FlowingFireworks3DPass` 与 [`FlowingLight3DPass`](./flowing-light-3d-pass.md) 配套使用,在每条流光线条的「尾部位置」(渐变淡出处)持续喷射出烟花状向四周发散的粒子,适合为流光拖尾增加飞溅火花、星点爆裂等增强效果。
|
|
4
|
+
- **Schema**: `FlowingFireworks3DPass` 类及 `FireworksLine` 数据结构。
|
|
5
|
+
- **Concepts**: GPU 粒子运动积分、环形缓冲发射、与流光尾部位置同步、加法混合发光。
|
|
6
|
+
- **Configuration**: 3D 路径点、颜色、动画周期、尾长比例、粒子数量/发射率/扩散/重力等调优参数。
|
|
7
|
+
- **Examples**: 流光拖尾火花、多条 3D 路径烟花、与 FlowingLight3DPass 配合、参数调优。
|
|
8
|
+
|
|
9
|
+
## Schema
|
|
10
|
+
|
|
11
|
+
> **Definition**: [FlowingFireworks3DPass](../../five/renderer/postprocessing/passes/flowing-fireworks-3d-pass.d.ts)
|
|
12
|
+
|
|
13
|
+
`FlowingFireworks3DPass` 继承自 `FivePass`,与 `FlowingLight3DPass` 共享同一套线条数据结构(`points` / `totalLength` / `duration` / `startTime` / `tailLengthRatio`),并额外提供烟花粒子调优参数。核心接口如下:
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
import * as THREE from 'three';
|
|
17
|
+
import { FivePass } from './pass';
|
|
18
|
+
import { type Camera } from '../../../core/camera';
|
|
19
|
+
|
|
20
|
+
type FireworksLine = {
|
|
21
|
+
id?: string; // 可选的唯一标识符,不传则自动生成 UUID
|
|
22
|
+
points: THREE.Vector3[]; // 世界坐标系路径点
|
|
23
|
+
totalLength: number; // 路径总长度(世界单位)
|
|
24
|
+
color: THREE.Color; // 粒子颜色
|
|
25
|
+
opacity?: number; // 粒子不透明度(0-1)
|
|
26
|
+
tailLengthRatio?: number; // 尾巴长度比例(0-1),默认 0.2,与 FlowingLight3DPass 含义一致
|
|
27
|
+
duration?: number; // 动画周期(毫秒),默认 1000
|
|
28
|
+
startTime?: number; // 线条开始时间(毫秒),默认使用当前内部时间
|
|
29
|
+
|
|
30
|
+
// ---- 烟花粒子调优参数(可选) ----
|
|
31
|
+
particleCount?: number; // 该线条的粒子池大小,默认 200
|
|
32
|
+
emissionRate?: number; // 每秒发射的粒子数量,默认 300
|
|
33
|
+
spread?: number; // 扩散尺度(世界单位),默认 0.1
|
|
34
|
+
particleSize?: number; // 粒子尺寸(世界单位),默认 spread * 0.12
|
|
35
|
+
particleLife?: number; // 粒子最大寿命(秒),默认 0.5
|
|
36
|
+
gravity?: THREE.Vector3; // 粒子加速度(世界单位/秒²),默认沿 -Y 缓慢下落
|
|
37
|
+
leadRatio?: number; // 发射点相对尾部向前(头部方向)的提前比例,默认 0.04
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export class FlowingFireworks3DPass extends FivePass {
|
|
41
|
+
constructor(camera: Camera);
|
|
42
|
+
|
|
43
|
+
// 批量设置路径列表(替换所有现有线条)
|
|
44
|
+
public setLines(lines: FireworksLine[]): void;
|
|
45
|
+
|
|
46
|
+
// 追加一条或多条线,返回生成的 id 数组
|
|
47
|
+
public addLine(...lines: FireworksLine[]): string[];
|
|
48
|
+
|
|
49
|
+
// 按 id 移除一条或多条线,返回实际移除的数量
|
|
50
|
+
public removeLine(...ids: string[]): number;
|
|
51
|
+
|
|
52
|
+
// 修改单条线的参数(通过 id),支持部分更新
|
|
53
|
+
public setLine(params: { id: string } & Partial<Omit<FireworksLine, 'id'>>): void;
|
|
54
|
+
|
|
55
|
+
public render(
|
|
56
|
+
renderer: THREE.WebGLRenderer,
|
|
57
|
+
writeBuffer: THREE.WebGLRenderTarget,
|
|
58
|
+
readBuffer: THREE.WebGLRenderTarget,
|
|
59
|
+
deltaTime: number,
|
|
60
|
+
maskActive?: boolean,
|
|
61
|
+
): void;
|
|
62
|
+
|
|
63
|
+
public dispose(): void;
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Concepts
|
|
68
|
+
|
|
69
|
+
### 与流光尾部同步 (Tail-synced Emission)
|
|
70
|
+
该 Pass 的粒子发射点与 `FlowingLight3DPass` 的「尾部位置」(`tailPosWorld`)保持一致:
|
|
71
|
+
|
|
72
|
+
- 流光的头部(Head)是前进方向的亮端,尾部(Tail)是渐变淡出的末端。
|
|
73
|
+
- `tailLengthRatio` 表示从头部到渐变结束所占路径比例(默认 0.2)。粒子在「渐变结束的位置」喷射,即 `headPos - tailLengthRatio * totalLength`。
|
|
74
|
+
- 把本 Pass 与 `FlowingLight3DPass` 配置**完全相同**的线条数据(`points`/`totalLength`/`duration`/`startTime`/`tailLengthRatio`),即可让烟花精准跟随流光尾部。
|
|
75
|
+
|
|
76
|
+
### 提前量 (Lead Ratio)
|
|
77
|
+
由于尾部沿路径滞后于头部,在视觉上粒子有时会显得「晚一拍」。`leadRatio` 让发射点相对尾部向头部方向提前一小段(占 `totalLength` 的比例,默认 0.04),使火花出现时机更早。提前量会被限制在当前尾长以内,不会越过头部。设为 `0` 即严格在尾部位置喷射。
|
|
78
|
+
|
|
79
|
+
### GPU 粒子运动积分 (GPU Particle Integration)
|
|
80
|
+
每个粒子在 CPU 端发射时仅写入「出生世界坐标 / 初速度 / 加速度 / 出生时间 / 寿命」等属性,后续运动完全在顶点着色器中按 `p = p0 + v·t + ½·a·t²` 积分计算,并随寿命淡出与缩小。CPU 每帧只需计算尾部位置并发射少量新粒子,性能开销低。
|
|
81
|
+
|
|
82
|
+
### 环形缓冲发射 (Ring-buffer Emission)
|
|
83
|
+
每条线条拥有独立的粒子池(`particleCount`),按环形缓冲循环复用槽位。`emissionRate`(粒子/秒)结合每帧 `deltaTime` 决定发射数量,寿命到期的粒子自动被新粒子覆盖。
|
|
84
|
+
|
|
85
|
+
### 加法混合发光 (Additive Glow)
|
|
86
|
+
粒子使用 `AdditiveBlending` 渲染到离屏缓冲并累加,再叠加到场景输出,自然形成重叠处更亮的发光效果。粒子为圆形柔光点,中心亮、边缘柔和。
|
|
87
|
+
|
|
88
|
+
### 相机同步与 DPR
|
|
89
|
+
与 `FlowingLight3DPass` 一致,Pass 自动同步相机投影/视图矩阵,并根据 `readBuffer` 尺寸自动调整离屏渲染目标,适配高 DPR 屏幕。
|
|
90
|
+
|
|
91
|
+
## Configuration
|
|
92
|
+
|
|
93
|
+
### FireworksLine 配置参数
|
|
94
|
+
|
|
95
|
+
| Parameter | Type | Required | Default | Description |
|
|
96
|
+
| :--- | :--- | :--- | :--- | :--- |
|
|
97
|
+
| `id` | `string` | | 自动生成 UUID | 唯一标识符,用于 `setLine` 更新单条线。 |
|
|
98
|
+
| `points` | `THREE.Vector3[]` | ✓ | - | 世界坐标系路径点数组。至少 2 个点。 |
|
|
99
|
+
| `totalLength` | `number` | ✓ | - | 路径总长度(世界单位)。通常为相邻点间距离之和。 |
|
|
100
|
+
| `color` | `THREE.Color` | ✓ | - | 粒子颜色(RGB)。 |
|
|
101
|
+
| `opacity` | `number` | | `1.0` | 粒子不透明度(0-1)。 |
|
|
102
|
+
| `tailLengthRatio` | `number` | | `0.2` | 尾巴长度比例(0-1)。决定粒子喷射点(渐变结束处)相对头部的距离。 |
|
|
103
|
+
| `duration` | `number` | | `1000` | 动画周期(毫秒)。尾部完成一个循环所需时长。 |
|
|
104
|
+
| `startTime` | `number` | | 当前内部时间 | 线条开始时间(毫秒)。可用于多条线错开起始时间。 |
|
|
105
|
+
| `particleCount` | `number` | | `200` | 该线条粒子池大小。越大可同时存在的火花越多。 |
|
|
106
|
+
| `emissionRate` | `number` | | `300` | 每秒发射的粒子数量。控制火花密度。 |
|
|
107
|
+
| `spread` | `number` | | `0.1` | 扩散尺度(世界单位)。控制火花向四周飞散的范围。 |
|
|
108
|
+
| `particleSize` | `number` | | `spread * 0.12` | 粒子尺寸(世界单位)。 |
|
|
109
|
+
| `particleLife` | `number` | | `0.5` | 粒子最大寿命(秒)。越长火花拖得越远。 |
|
|
110
|
+
| `gravity` | `THREE.Vector3` | | 沿 -Y 缓慢下落 | 粒子加速度(世界单位/秒²)。可制造下坠或上升效果。 |
|
|
111
|
+
| `leadRatio` | `number` | | `0.04` | 发射点相对尾部的提前比例(占 `totalLength`)。增大可让火花更早出现,`0` 表示严格在尾部。 |
|
|
112
|
+
|
|
113
|
+
> **注意**: `spread` / `particleSize` / `gravity` 均为世界坐标单位,需要结合场景尺度调整。默认值适配米级小场景,大场景应相应放大。
|
|
114
|
+
|
|
115
|
+
## Instance Methods
|
|
116
|
+
|
|
117
|
+
### `constructor(camera: Camera)`
|
|
118
|
+
初始化 Pass,需传入相机以获取投影矩阵和视图矩阵。
|
|
119
|
+
|
|
120
|
+
### `setLines(lines: FireworksLine[])`
|
|
121
|
+
批量设置路径列表,替换所有现有线条。
|
|
122
|
+
|
|
123
|
+
**自动生成 ID**: 没有 `id` 时自动生成 UUID。
|
|
124
|
+
**自动设置 startTime**: 没有 `startTime` 时使用当前内部时间。
|
|
125
|
+
|
|
126
|
+
```ts
|
|
127
|
+
pass.setLines([{
|
|
128
|
+
points: path,
|
|
129
|
+
totalLength: 12,
|
|
130
|
+
color: new THREE.Color(0xff6600),
|
|
131
|
+
duration: 3000,
|
|
132
|
+
tailLengthRatio: 0.2,
|
|
133
|
+
}]);
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### `addLine(...lines: FireworksLine[]): string[]`
|
|
137
|
+
追加一条或多条线,返回新增线条的 id 数组,不影响已有线条。
|
|
138
|
+
|
|
139
|
+
### `removeLine(...ids: string[]): number`
|
|
140
|
+
按 id 移除一条或多条线,返回实际移除的数量。id 不存在时输出警告。
|
|
141
|
+
|
|
142
|
+
### `setLine(params: { id: string } & Partial<Omit<FireworksLine, 'id'>>)`
|
|
143
|
+
通过 `id` 部分更新单条线。
|
|
144
|
+
|
|
145
|
+
**性能说明**:
|
|
146
|
+
- 大多数字段(`points`、`color`、`totalLength`、`duration`、`spread`、`gravity` 等)会在下一帧发射时即时生效,**无需重建**。
|
|
147
|
+
- 仅当 `particleCount` 改变时才会重建粒子缓冲。
|
|
148
|
+
|
|
149
|
+
```ts
|
|
150
|
+
// 即时生效,无需重建
|
|
151
|
+
pass.setLine({ id: 'line-1', color: new THREE.Color(0x00ff00), emissionRate: 500 });
|
|
152
|
+
|
|
153
|
+
// 改变粒子池大小,会重建缓冲
|
|
154
|
+
pass.setLine({ id: 'line-1', particleCount: 400 });
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### `render(...)`
|
|
158
|
+
由 EffectComposer 自动调用,无需手动调用。自动同步相机矩阵与渲染目标尺寸。
|
|
159
|
+
|
|
160
|
+
### `dispose()`
|
|
161
|
+
释放粒子缓冲、着色材质、渲染目标等资源,销毁 Pass 时必须调用。
|
|
162
|
+
|
|
163
|
+
## Examples
|
|
164
|
+
|
|
165
|
+
### 与 FlowingLight3DPass 配合(推荐)
|
|
166
|
+
|
|
167
|
+
烟花跟随流光尾部的标准用法:为两个 Pass 配置**相同**的线条数据。
|
|
168
|
+
|
|
169
|
+
```typescript
|
|
170
|
+
import { Five } from '@realsee/five';
|
|
171
|
+
import { FlowingLight3DPass, FlowingFireworks3DPass } from '../../lib/five/renderer/postprocessing';
|
|
172
|
+
import { calculatePath3DLength } from '@realsee/five/plugins';
|
|
173
|
+
import * as THREE from 'three';
|
|
174
|
+
|
|
175
|
+
const five = new Five();
|
|
176
|
+
|
|
177
|
+
const flowingLight = new FlowingLight3DPass(five.camera);
|
|
178
|
+
const fireworks = new FlowingFireworks3DPass(five.camera);
|
|
179
|
+
|
|
180
|
+
const path = [
|
|
181
|
+
new THREE.Vector3(-5, 0, 0),
|
|
182
|
+
new THREE.Vector3(-2, 3, 2),
|
|
183
|
+
new THREE.Vector3(2, 3, -2),
|
|
184
|
+
new THREE.Vector3(5, 0, 0),
|
|
185
|
+
];
|
|
186
|
+
|
|
187
|
+
const lineData = {
|
|
188
|
+
points: path,
|
|
189
|
+
totalLength: calculatePath3DLength(path),
|
|
190
|
+
color: new THREE.Color(0xff00ee),
|
|
191
|
+
duration: 8000,
|
|
192
|
+
tailLengthRatio: 0.2,
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
flowingLight.setLines([lineData]);
|
|
196
|
+
fireworks.setLines([lineData]); // 相同数据 => 烟花精准跟随流光尾部
|
|
197
|
+
|
|
198
|
+
// 注意添加顺序:烟花叠加在流光之上
|
|
199
|
+
five.addPass(flowingLight);
|
|
200
|
+
five.addPass(fireworks);
|
|
201
|
+
|
|
202
|
+
function animate() {
|
|
203
|
+
requestAnimationFrame(animate);
|
|
204
|
+
five.render();
|
|
205
|
+
}
|
|
206
|
+
animate();
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### 多条 3D 路径烟花
|
|
210
|
+
|
|
211
|
+
```typescript
|
|
212
|
+
const fireworks = new FlowingFireworks3DPass(camera);
|
|
213
|
+
|
|
214
|
+
fireworks.setLines([
|
|
215
|
+
{
|
|
216
|
+
points: [new THREE.Vector3(0, 0, 0), new THREE.Vector3(10, 5, 0)],
|
|
217
|
+
totalLength: 11,
|
|
218
|
+
color: new THREE.Color(0xff0000),
|
|
219
|
+
duration: 2000,
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
points: [new THREE.Vector3(0, 0, 0), new THREE.Vector3(0, 10, 5)],
|
|
223
|
+
totalLength: 12,
|
|
224
|
+
color: new THREE.Color(0x00ff00),
|
|
225
|
+
duration: 2500,
|
|
226
|
+
startTime: 500,
|
|
227
|
+
},
|
|
228
|
+
]);
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### 参数调优:更密集、飞溅更远的火花
|
|
232
|
+
|
|
233
|
+
```typescript
|
|
234
|
+
fireworks.setLines([{
|
|
235
|
+
points: path,
|
|
236
|
+
totalLength: calculatePath3DLength(path),
|
|
237
|
+
color: new THREE.Color(0xffaa00),
|
|
238
|
+
duration: 6000,
|
|
239
|
+
emissionRate: 600, // 更密集
|
|
240
|
+
spread: 0.25, // 飞散更广
|
|
241
|
+
particleLife: 0.9, // 拖得更远
|
|
242
|
+
particleSize: 0.04,
|
|
243
|
+
gravity: new THREE.Vector3(0, -0.5, 0), // 明显下坠
|
|
244
|
+
leadRatio: 0.08, // 出现更早
|
|
245
|
+
}]);
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
### 调整火花出现时机
|
|
249
|
+
|
|
250
|
+
```typescript
|
|
251
|
+
// 视觉上火花偏晚 => 增大 leadRatio 让其更早出现
|
|
252
|
+
pass.setLine({ id: lineId, leadRatio: 0.1 });
|
|
253
|
+
|
|
254
|
+
// 严格落在流光尾部(渐变结束处)
|
|
255
|
+
pass.setLine({ id: lineId, leadRatio: 0 });
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
## Debugging
|
|
259
|
+
|
|
260
|
+
- **看不到粒子**: 检查路径是否在相机视锥内;确认 `color` / `opacity` 非全透明;确认已调用 `addPass`。
|
|
261
|
+
- **火花太稀疏**: 增大 `emissionRate` 或 `particleCount`(注意 `particleCount` 是上限,过小会限制同时存在的粒子数)。
|
|
262
|
+
- **火花范围太小/太大**: 调整 `spread`(世界单位),需结合场景尺度。
|
|
263
|
+
- **火花出现偏晚/偏早**: 调整 `leadRatio`(增大更早,`0` 严格在尾部)。
|
|
264
|
+
- **位置与流光尾部不一致**: 确认两个 Pass 使用了**完全相同**的 `points`/`totalLength`/`duration`/`startTime`/`tailLengthRatio`。
|
|
265
|
+
- **粒子不下落或方向不对**: 检查 `gravity` 向量;默认沿 -Y(世界上方向取决于场景坐标系)。
|
|
266
|
+
|
|
267
|
+
## Performance
|
|
268
|
+
|
|
269
|
+
- **GPU 积分**: 粒子运动全部在着色器中完成,CPU 每帧只发射少量新粒子,开销低。
|
|
270
|
+
- **环形缓冲**: 粒子池大小固定(`particleCount`),不会随时间增长,显存稳定。
|
|
271
|
+
- **加法混合**: 重叠粒子会累加亮度,过高的 `emissionRate` × `particleCount` 会增加片元填充率,建议按需调节。
|
|
272
|
+
|
|
273
|
+
### 优化建议
|
|
274
|
+
1. 控制 `particleCount` 与 `emissionRate`,避免不必要的高密度。
|
|
275
|
+
2. 大场景适当放大 `spread` / `particleSize`,小场景调小,保持视觉比例。
|
|
276
|
+
3. 使用 `setLine` 而非 `setLines` 更新单条线;除 `particleCount` 外的修改无需重建。
|
|
277
|
+
4. 低端设备可通过 `pass.enabled = false` 禁用。
|
|
278
|
+
|
|
279
|
+
## Common Pitfalls
|
|
280
|
+
|
|
281
|
+
1. **数据不一致**: 烟花与流光必须共享相同的线条参数,否则尾部位置不对齐。
|
|
282
|
+
2. **添加顺序**: 应在流光 Pass 之后 `addPass` 烟花 Pass,使火花叠加在流光之上。
|
|
283
|
+
3. **单位混淆**: `spread` / `particleSize` / `gravity` 为世界单位,`totalLength` 也是世界单位,不要混用像素。
|
|
284
|
+
4. **particleCount 过小**: 它是同时存在粒子数的上限,过小会使高 `emissionRate` 失效。
|
|
285
|
+
5. **未调用 dispose()**: 销毁 Pass 时必须调用 `dispose()`,避免 GPU 资源泄漏。
|
|
286
|
+
|
|
287
|
+
## Related
|
|
288
|
+
|
|
289
|
+
* [Flowing Light 3D Pass](./flowing-light-3d-pass.md): 3D 流光效果,本 Pass 的配套来源。
|
|
290
|
+
* [Flowing Light 2D Pass](./flowing-light-2d-pass.md): 屏幕空间的流光效果。
|
|
291
|
+
* [Postprocessing](./postprocessing.md): 后处理通用概念与 EffectComposer 使用指南。
|
|
292
|
+
|
|
293
|
+
---
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
tags: [烟花, 火花, 粒子, 流光拖尾, 发散, 爆裂, 特效, postprocessing, effect, fireworks, particle, sparks, flowing, pass, rendering, worldspace, 3d, world-space, additive, gpu-particles]
|
|
@@ -472,6 +472,7 @@ setInterval(() => {
|
|
|
472
472
|
|
|
473
473
|
* [Postprocessing](./postprocessing.md): 后处理通用概念与 EffectComposer 使用指南。
|
|
474
474
|
* [Flowing Light 2D Pass](./flowing-light-2d-pass.md): 屏幕空间的流光效果。
|
|
475
|
+
* [Flowing Fireworks 3D Pass](./flowing-fireworks-3d-pass.md): 在流光尾部喷射烟花粒子的配套特效。
|
|
475
476
|
|
|
476
477
|
---
|
|
477
478
|
|
|
@@ -82,11 +82,12 @@ Five 默认挂载了两个 Pass 实例,挂载在 `five` 实例上,默认是
|
|
|
82
82
|
|
|
83
83
|
### 3. Optional Built-in Passes (可选内置 Pass)
|
|
84
84
|
|
|
85
|
-
Five
|
|
85
|
+
Five 新增了多个可选使用的内置 Pass,这些 Pass 没有预先挂载在 `five` 实例上,需手动导入并添加到渲染链中:
|
|
86
86
|
|
|
87
87
|
* **[GaussianBlurPass](gaussian-blur-pass.md)**: 高斯模糊效果。
|
|
88
88
|
* **[FlowingLight2DPass](flowing-light-2d-pass.md)**: 2D 流光效果(通常用于平面路线流光)。
|
|
89
89
|
* **[FlowingLight3DPass](flowing-light-3d-pass.md)**: 3D 流光效果(通常用于空间路径流光)。
|
|
90
|
+
* **[FlowingFireworks3DPass](flowing-fireworks-3d-pass.md)**: 在 3D 流光尾部喷射烟花粒子的配套特效。
|
|
90
91
|
|
|
91
92
|
#### GaussianBlurPass 使用示例
|
|
92
93
|
|
|
@@ -249,6 +250,7 @@ class FogPass extends FivePass {
|
|
|
249
250
|
* [Gaussian Blur Pass](gaussian-blur-pass.md): 高斯模糊 Pass 文档。
|
|
250
251
|
* [Flowing Light 2D Pass](flowing-light-2d-pass.md): 2D 流光 Pass 文档。
|
|
251
252
|
* [Flowing Light 3D Pass](flowing-light-3d-pass.md): 3D 流光 Pass 文档。
|
|
253
|
+
* [Flowing Fireworks 3D Pass](flowing-fireworks-3d-pass.md): 流光烟花粒子 Pass 文档。
|
|
252
254
|
* [five.ts](../../five/application/five.d.ts): 查看 `addPass` 方法的实现。
|
|
253
255
|
* [pass.ts](../../five/renderer/postprocessing/passes/pass.d.ts): 查看 `FivePass` 基类定义。
|
|
254
256
|
|
package/docs/assets/hierarchy.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
window.hierarchyData = "
|
|
1
|
+
window.hierarchyData = "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"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
window.navigationData = "
|
|
1
|
+
window.navigationData = "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"
|