deep-engine-demo/packages/docs/api/effect/FlowParticles.md
2026-04-19 18:46:28 +08:00

310 lines
7.9 KiB
Markdown

---
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`