--- outline: [2, 3] --- # FlowParticles - 源文件:`packages/sdk/src/effect/FlowParticles.ts` - 文档位置:`packages/docs/api/effect/FlowParticles.md` ## 接口:`FlowParticlesGPUOptions` - 作用:流动粒子配置。 ### 字段 | 字段名 | 类型 | 必填 | 作用 | | --- | --- | --- | --- | | `startPipe` | `ParametricPipe` | 是 | 起始管道。 | | `endPipe` | `ParametricPipe` | 是 | 结束管道。 | | `particleCount` | `number` | 否 | 粒子总数量。 | | `speedMultiplier` | `number` | 否 | 粒子流动速度倍率。 | | `particleSize` | `number` | 否 | 粒子半径。 | | `heatingThreshold` | `number` | 否 | 加热阈值。 | | `flowPathCount` | `number` | 否 | 流动路径数量。 | | `colorStops` | `FlowColorStop[]` | 否 | 颜色断点配置。 | ## 接口:`FlowColorStop` - 作用:流动颜色断点。 ### 字段 | 字段名 | 类型 | 必填 | 作用 | | --- | --- | --- | --- | | `color` | `string` | 是 | 颜色值。 | | `step` | `number` | 是 | 断点位置,范围 [0, 1]。 | | `frozenProbability` | `number` | 否 | 当粒子经过该断点时被永久冻结颜色的概率,范围 [0, 1]。 | ## 类:`FlowParticles` - 作用:流动粒子效果。 ### 构造函数 #### `new FlowParticles(viewer: Viewer, options: FlowParticlesGPUOptions)` - 作用:构造函数。 - 入参: | 参数名 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `viewer` | `Viewer` | 是 | 视图对象 | | `options` | `FlowParticlesGPUOptions` | 是 | 配置参数 | - 出参:`FlowParticles` - 返回说明:返回当前类实例。 ### 属性 | 属性名 | 可见性 | 类型 | 作用 | | --- | --- | --- | --- | | `viewer` | `public` | `Viewer` | 用于保存 `viewer` 对应的数据。 | | `startPipe` | `public` | `ParametricPipe` | 用于保存 `startPipe` 对应的数据。 | | `endPipe` | `public` | `ParametricPipe` | 用于保存 `endPipe` 对应的数据。 | | `particleCount` | `public` | `number` | 用于保存 `particleCount` 对应的数据。 | | `speedMultiplier` | `public` | `number` | 用于保存 `speedMultiplier` 对应的数据。 | | `particleSize` | `public` | `number` | 用于保存 `particleSize` 对应的数据。 | | `heatingThreshold` | `public` | `number` | 用于保存 `heatingThreshold` 对应的数据。 | | `flowPathCount` | `public` | `number` | 用于保存 `flowPathCount` 对应的数据。 | | `colorStops` | `public` | `FlowColorStop[]` | 用于保存 `colorStops` 的集合数据。 | | `flowPaths` | `public` | `THREE.CatmullRomCurve3[]` | 用于保存 `flowPaths` 的集合数据。 | | `particles` | `public` | `Particle[]` | 用于保存 `particles` 的集合数据。 | | `flowGeometry` | `public` | `THREE.SphereGeometry \| null` | 用于保存 `flowGeometry` 对应的数据。 | | `flowMaterial` | `public` | `THREE.Material \| null` | 用于保存 `flowMaterial` 对应的数据。 | | `flowPoints` | `public` | `THREE.InstancedMesh \| null` | 用于保存 `flowPoints` 对应的数据。 | | `updateHandler` | `public` | `(() => void) \| null` | 用于保存 `updateHandler` 对应的数据。 | ### 方法 #### `setParticleCount(count: number): void` - 作用:设置粒子数量并重建系统。 - 入参: | 参数名 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `count` | `number` | 是 | 粒子数量 | - 出参:`void` - 返回说明:无返回值。 #### `setSpeedMultiplier(speed: number): void` - 作用:设置速度倍率。 - 入参: | 参数名 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `speed` | `number` | 是 | 速度倍率 | - 出参:`void` - 返回说明:无返回值。 #### `setFrozenProbability(probability: number): void` - 作用:设置冻结概率。 - 入参: | 参数名 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `probability` | `number` | 是 | 冻结概率,范围 [0, 1] | - 出参:`void` - 返回说明:无返回值。 #### `setHeatingThreshold(threshold: number): void` - 作用:设置加热阈值。 - 入参: | 参数名 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `threshold` | `number` | 是 | 阈值,范围 [0, 1] | - 出参:`void` - 返回说明:无返回值。 #### `setColorStops(stops: FlowColorStop[]): void` - 作用:动态更新颜色断点。 - 入参: | 参数名 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `stops` | `FlowColorStop[]` | 是 | 断点数组 | - 出参:`void` - 返回说明:无返回值。 #### `dispose(): void` - 作用:释放资源。 - 入参:无 - 出参:`void` - 返回说明:无返回值。 #### `toVector3(point: THREE.Vector3 | { x: number; y: number; z: number }): THREE.Vector3` - 作用:点位转换为 THREE.Vector3。 - 入参: | 参数名 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `point` | `THREE.Vector3 \| { x: number; y: number; z: number }` | 是 | 输入点 | - 出参:`THREE.Vector3` - 返回说明:转换结果 #### `init(): void` - 作用:初始化。 - 入参:无 - 出参:`void` - 返回说明:无返回值。 #### `createFlowPaths(): void` - 作用:生成流动路径。 - 入参:无 - 出参:`void` - 返回说明:无返回值。 #### `initParticles(): void` - 作用:初始化粒子网格。 - 入参:无 - 出参:`void` - 返回说明:无返回值。 #### `setupUpdateLoop(): void` - 作用:绑定更新循环。 - 入参:无 - 出参:`void` - 返回说明:无返回值。 #### `update(): void` - 作用:每帧更新。 - 入参:无 - 出参:`void` - 返回说明:无返回值。 #### `calculateHeatColor(t: number): number` - 作用:计算热值。 - 入参: | 参数名 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `t` | `number` | 是 | 路径进度 | - 出参:`number` - 返回说明:热值 ## 构造示例 - 来源:`packages/demo/src/panels/GeothermalScene/GeothermalInjectionProductionPanel.vue` ```ts try { const flowParticles = new FlowParticles(viewer, { startPipe: pipe1, endPipe: pipe2, particleCount: particleCount.value, speedMultiplier: speedMultiplier.value, particleSize: particleSize.value, heatingThreshold: heatingThreshold.value, colorStops: [ {color: "#00FF00", step: 0}, {color: "#FFFF00", step: 0.4}, {color: "#FF0000", step: 0.6}, ], }); flowParticles.flowPoints.renderOrder = 0 bus.setFlowParticles(flowParticles); } catch (error) { bus.setFlowParticles(null); console.error("创建热突破流体失败:", error); } ``` ## 函数示例 ### `FlowParticles.setFrozenProbability` - 来源:`packages/demo/src/disasterFormationPanel/GeothermalScene/ThermalBreakthroughDisasterPanel.vue` ```ts flowParticles.setColorStops([ {color: '#00FF00', step: 0.0}, {color: '#FFFF00', step: 0.5}, {color: '#FF0000', step: 0.7}, ]); // 约 30% 的粒子保持初始颜色,模拟热突破中部分流体未被加热 flowParticles.setFrozenProbability(1); } isActive.value = !!flowParticles; }; ``` ### `FlowParticles.setColorStops` - 来源:`packages/demo/src/disasterFormationPanel/GeothermalScene/ThermalBreakthroughDisasterPanel.vue` ```ts if (flowParticles) { flowParticles.setColorStops([ {color: '#00FF00', step: 0.0}, {color: '#FFFF00', step: 0.5}, {color: '#FF0000', step: 0.7}, ]); // 约 30% 的粒子保持初始颜色,模拟热突破中部分流体未被加热 flowParticles.setFrozenProbability(1); } isActive.value = !!flowParticles; }; ``` ### `FlowParticles.dispose` - 来源:`packages/demo/src/panels/GeothermalScene/GeothermalInjectionProductionPanel.vue` ```ts if (!previousFlowParticles) return; previousFlowParticles.dispose(); bus.setFlowParticles(null); }; ``` ## Demo 参考 ### `FlowParticles` 以下示例文件中可以看到该 API 的实际调用方式: - `packages/demo/src/hooks/Bus.ts` - `packages/demo/src/panels/GeothermalScene/GeothermalInjectionProductionPanel.vue`