120 lines
3.9 KiB
Markdown
120 lines
3.9 KiB
Markdown
# 实现方案 - 2026-05-07-17-28-34
|
||
|
||
## 修改目标
|
||
|
||
在逆向工作区实现三维 DICOM 体与 STL 模型融合视角:
|
||
|
||
- DICOM 切片范围可控。
|
||
- DICOM 以黑色长方体和多张切片纹理展示。
|
||
- 最后一张切片显示在体表面。
|
||
- STL 模型叠加在 DICOM 体中。
|
||
- 用户可以调整模型位姿。
|
||
- DICOM 和 STL 可以一起旋转、平移、缩放观察。
|
||
|
||
## 涉及路径
|
||
|
||
- `WebSite/server.ts`
|
||
- `WebSite/src/types.ts`
|
||
- `WebSite/src/lib/api.ts`
|
||
- `WebSite/src/components/ReverseWorkspace.tsx`
|
||
|
||
## 技术路线
|
||
|
||
### 1. 后端新增 DICOM 融合体接口
|
||
|
||
新增接口:
|
||
|
||
```text
|
||
GET /api/projects/:projectId/dicom-fusion-volume?start=0&end=49&mode=soft
|
||
```
|
||
|
||
返回内容:
|
||
|
||
- `width`、`height`
|
||
- `start`、`end`、`total`
|
||
- `indices`
|
||
- `frames`:每张切片灰度图 base64
|
||
- `spacing`:row/column/slice
|
||
- `physicalSize`:width/height/depth
|
||
|
||
为控制传输和纹理压力:
|
||
|
||
- 单次最多返回 64 张切片。
|
||
- 纹理最大边长限制为 256。
|
||
- 使用已有 `getDicomVolume()` 和 `resampleNearest()`,避免重复实现 DICOM 解析。
|
||
|
||
### 2. 前端新增类型与 API
|
||
|
||
- 在 `types.ts` 新增 `DicomFusionVolume`。
|
||
- 在 `api.ts` 新增 `getDicomFusionVolume(projectId, start, end, mode)`。
|
||
|
||
### 3. 重构融合视角为 Three.js 场景
|
||
|
||
在 `ReverseWorkspace.tsx` 中新增 `FusionThreeView`:
|
||
|
||
- 创建 Three.js scene/camera/renderer。
|
||
- DICOM:
|
||
- 用半透明黑色 box 表示 CT 体。
|
||
- 将范围内切片转为 `CanvasTexture`。
|
||
- 按切片索引在 Z 方向分层放置。
|
||
- 最后一帧贴到体表面并提高不透明度。
|
||
- STL:
|
||
- 调用已有 STL preview 接口加载模型构件。
|
||
- 使用后端返回 `bounds` 合成稳定模型中心。
|
||
- 将模型挂到 `modelGroup`。
|
||
- 场景:
|
||
- DICOM 体和模型都放入 `fusionRoot`,整体旋转和平移缩放作用在 `fusionRoot`。
|
||
- 模型位姿单独作用在 `modelPoseGroup`。
|
||
|
||
### 4. 交互与控制
|
||
|
||
- 鼠标左键拖拽:旋转整体融合场景。
|
||
- Shift/右键拖拽:平移整体融合场景。
|
||
- 滚轮:缩放整体融合场景。
|
||
- UI 控件:
|
||
- 切片起点、切片终点。
|
||
- 模型旋转 X/Y/Z。
|
||
- 模型平移 X/Y/Z。
|
||
- 模型缩放。
|
||
- 重置模型位姿。
|
||
|
||
## 数据流或交互流程
|
||
|
||
1. 进入逆向工作区后加载项目详情。
|
||
2. 根据默认切片范围请求 DICOM 融合体数据。
|
||
3. 请求 STL preview 并加载模型。
|
||
4. Three.js 创建 DICOM 体和 STL 模型。
|
||
5. 用户拖拽场景时 DICOM 与 STL 一起旋转。
|
||
6. 用户调整模型位姿时只改变 STL 模型相对 DICOM 的位置。
|
||
7. 用户调整切片范围时重新请求 DICOM 融合体数据并刷新 CT 体。
|
||
|
||
## 兼容性与回滚方案
|
||
|
||
- 若 WebGL 不可用,显示加载失败/不支持提示,不影响其他页面。
|
||
- 若融合体接口失败,保留逆向工作区其他 mask 导出功能。
|
||
- 若性能不足,可降低最大返回切片数和纹理尺寸。
|
||
|
||
## 预计文件变更
|
||
|
||
- `WebSite/server.ts`
|
||
- 新增 `createDicomFusionVolume()` 和 API route。
|
||
- `WebSite/src/types.ts`
|
||
- 新增 `DicomFusionVolume` 类型。
|
||
- `WebSite/src/lib/api.ts`
|
||
- 新增 `getDicomFusionVolume()`。
|
||
- `WebSite/src/components/ReverseWorkspace.tsx`
|
||
- 新增 Three.js 融合视角组件和位姿控制。
|
||
|
||
## 人工审核状态
|
||
|
||
- 本次免二次确认,方案写入后直接执行。
|
||
|
||
## 执行结果
|
||
|
||
- 已新增 `GET /api/projects/:projectId/dicom-fusion-volume`,支持按 `start/end/mode` 返回一段轴向 DICOM 体数据纹理。
|
||
- 已新增 `DicomFusionVolume` 类型和 `api.getDicomFusionVolume()`。
|
||
- 已将逆向工作区 `影像与模型融合视角` 重构为 Three.js 三维场景。
|
||
- 已实现黑色 DICOM 长方体、范围内切片纹理层叠、最后一帧体表面显示。
|
||
- 已将 STL 模型加载进同一融合场景,可通过模型位姿控件相对 DICOM 体调整。
|
||
- 已支持鼠标拖拽/滚轮对 DICOM 体和 STL 模型整体旋转、平移、缩放。
|