deep-engine-demo/packages/docs/api/effect/volume/VtkStructuredPointsParser.md
2026-05-06 22:16:20 +08:00

112 lines
3.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
outline: [2, 3]
---
# VtkStructuredPointsParser
- 源文件:`packages/sdk/src/effect/volume/vtk/VtkStructuredPointsParser.ts`
- 文档位置:`packages/docs/api/effect/volume/VtkStructuredPointsParser.md`
## 类:`VtkStructuredPointsParser`
- 作用:解析 legacy VTK 体数据,提取指定分量,返回可直接用于体渲染的数据和元信息。
## 支持范围
- 支持 `ASCII` / `BINARY` 编码自动识别。
- 支持 `DATASET STRUCTURED_POINTS`binary
- 支持 `ASCII UNSTRUCTURED_GRID` 规则网格转体数据。
- 支持从 `CELL_DATA``POINT_DATA` 自动解析标量来源。
## 相关类型
### `IVtkParseFromUrlOptions`
| 字段名 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `url` | `string` | 是 | 远程 VTK 文件地址。 |
| `componentIndex` | `number` | 是 | 要提取的分量索引,从 0 开始。 |
| `fileName` | `string` | 否 | 可选文件名,默认从 URL 推断。 |
| `requestInit` | `RequestInit` | 否 | `fetch` 附加参数。 |
### `IVtkParseFromBufferOptions`
| 字段名 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `buffer` | `ArrayBuffer \| Uint8Array` | 是 | VTK 原始二进制内容。 |
| `componentIndex` | `number` | 是 | 要提取的分量索引,从 0 开始。 |
| `fileName` | `string` | 否 | 可选文件名,默认 `unknown.vtk`。 |
### `IVtkParsedComponentResult`
| 字段名 | 类型 | 说明 |
| --- | --- | --- |
| `metadata` | `IVtkStructuredPointsMetadata` | 体数据元信息。 |
| `componentIndex` | `number` | 当前提取的分量索引。 |
| `valueRange` | `[number, number]` | 当前分量值域。 |
| `values` | `Float32Array` | 当前分量一维标量数组。 |
### `IVtkStructuredPointsMetadata`
| 字段名 | 类型 | 说明 |
| --- | --- | --- |
| `fileName` | `string` | 文件名。 |
| `fileSize` | `number` | 文件字节数。 |
| `sourceDimensions` | `TVector3` | 原始点维度。 |
| `cellDimensions` | `TVector3` | 渲染采样维度。 |
| `spacing` | `TVector3` | 网格间距。 |
| `sourceOrigin` | `TVector3` | 原始原点。 |
| `pointOrigin` | `TVector3` | 体素中心原点。 |
| `scalarName` | `string` | 标量名称。 |
| `scalarType` | `string` | 标量类型描述。 |
| `componentCount` | `number` | 标量分量数。 |
| `cellCount` | `number` | 元组数量(通常对应体素数)。 |
| `scalarSource` | `"cell" \| "point"` | 标量来源。 |
## 方法
### `parseFromUrl(options: IVtkParseFromUrlOptions): Promise<IVtkParsedComponentResult>`
- 作用:从 URL 下载并解析 VTK 数据。
- 典型错误:下载失败、编码不支持、数据集类型不支持、分量越界。
### `parseFromBuffer(options: IVtkParseFromBufferOptions): IVtkParsedComponentResult`
- 作用:从内存缓冲区解析 VTK 数据。
- 适用场景:文件上传、自定义网络层、离线缓存解析。
## 使用示例
```ts
import { VtkStructuredPointsParser, VolumeMesh, VolumeRenderMode } from "@deep/engine";
const parser = new VtkStructuredPointsParser();
const parsed = await parser.parseFromUrl({
url: "/model/vtk/stress_cells_256.vtk",
componentIndex: 0,
});
const [minValue, maxValue] = parsed.valueRange;
const values = parsed.values;
const voxels = new Uint8Array(values.length);
const denominator = Math.max(maxValue - minValue, Number.EPSILON);
for (let i = 0; i < values.length; i += 1) {
const normalized = (values[i] - minValue) / denominator;
voxels[i] = Math.round(Math.max(0, Math.min(1, normalized)) * 255);
}
const volume = new VolumeMesh(voxels, {
shape: parsed.metadata.cellDimensions,
mode: VolumeRenderMode.EmissionAbsorptionModel,
});
```
## 注意事项
- `componentIndex` 必须在 `[0, componentCount - 1]` 范围内。
- `UNSTRUCTURED_GRID` 仅支持规则网格输入,非规则点云会抛错。
- Binary 读取按大端浮点处理legacy VTK 约定)。
- 数据值域映射通常需要在业务层完成(如映射到 `Uint8Array` 供体渲染)。