Files
REVOXELSEG_DICOM/工程分析/实现方案-2026-05-07-16-53-23.md

83 lines
3.4 KiB
Markdown
Raw Permalink 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.
# 实现方案 - 2026-05-07-16-53-23
## 修改目标
修复 3D 模型在细节档位切换和鼠标旋转时的中心漂移问题,并完善右下角坐标系联动和按钮样式。
## 涉及路径
- `WebSite/src/components/ProjectLibrary.tsx`
## 技术路线
### 1. 分离 Three.js 渲染容器和 React overlay
当前 `NativeStlViewer` 会对 `containerRef.current.innerHTML = ''`,容易把 React overlay 或其他子节点一起清掉。改为:
- `viewportRef`:只用于挂载 Three.js canvas。
- 外层 React 容器保留进度条、状态条、右下角坐标系等 overlay。
- 清理时只清理 `viewportRef` 内的 canvas。
### 2. 修正模型重载后的中心与缩放
模型加载完成后:
- 先把所有 mesh 加入 `pivotGroup`
- 基于 `pivotGroup` 的整体包围盒计算 `center``size`
- 将所有 mesh geometry 统一平移 `-center`,保证拼装后的整体中心落在局部原点。
- 使用 `pivotGroup.rotation``pivotGroup.scale`,使用 `poseGroup.position` 做平移。
- 每次切换细节档位时重建模型,但继承同一份 `modelPose`,并确保新模型仍以整体中心为 pivot。
### 3. 鼠标拖拽围绕模型中心旋转
- 鼠标左键拖拽只更新 `rotateX/rotateY`,不改变 `translateX/Y/Z`
- 旋转继续作用在 `pivotGroup`,而不是同时承担平移的 group。
-`poseRef.current` 做统一 clamp保持鼠标、滑块、快捷按钮状态一致。
### 4. 坐标系随位姿同步旋转
新增一个轻量 SVG 坐标轴组件:
- 根据 `rotateX/Y/Z` 构造 Three.js `Euler``Matrix4`
- 将 X/Y/Z 三个单位轴向量通过旋转矩阵变换后投影到 2D。
- 在右下角 SVG 中绘制红色 X、绿色 Y、蓝色 Z 三条轴。
- 继续显示 X/Y/Z 当前角度数值。
### 5. 调整按钮颜色
-`重置平移缩放位姿` 的文字颜色改为 `text-blue-600 hover:text-blue-700`,与 `重置旋转位姿` 一致。
## 数据流或交互流程
1. 用户拖拽鼠标或点击位姿按钮。
2. `modelPose` 更新并 clamp。
3. `NativeStlViewer` 的动画循环读取 `poseRef.current`
4. `poseGroup` 只应用平移,`pivotGroup` 只应用旋转和缩放。
5. 右下角坐标轴组件读取同一份 `pose`,同步更新方向。
6. 切换模型显示细节档时重新请求 STL preview但模型仍以整体包围盒中心作为 pivot。
## 兼容性与回滚方案
- 修改仅影响项目库 3D 模型页,不修改 DICOM 后端和 mask 导出。
- 若 SVG 坐标轴表现不佳,可回滚为静态坐标轴加角度文本。
- 若新的 viewportRef 清理方式导致 canvas 不显示,可回滚为原始 containerRef但必须避免清掉 overlay。
## 预计文件变更
- `WebSite/src/components/ProjectLibrary.tsx`
- 新增 `OrientationGizmo`
- `NativeStlViewer` 改用 `viewportRef`
- 调整模型中心化和清理逻辑。
- 调整重置按钮样式。
## 人工审核状态
- 本次免二次确认,方案写入后直接执行。
## 执行结果
- 已在 `WebSite/server.ts` 为 STL preview 增加全量包围盒 `bounds`
- 已在 `WebSite/src/components/ProjectLibrary.tsx` 使用所有可见 STL 的稳定全量包围盒计算整体中心和缩放基准。
- 已将右下角静态坐标轴替换为基于 `rotateX/Y/Z` 投影的动态 SVG 坐标轴。
- 已统一 `重置旋转位姿``重置平移缩放位姿` 的字体颜色。