diff --git a/docs/superpowers/plans/2026-06-15-vtk-3d-p2-dataset3d-bar.md b/docs/superpowers/plans/2026-06-15-vtk-3d-p2-dataset3d-bar.md new file mode 100644 index 0000000..0151a32 --- /dev/null +++ b/docs/superpowers/plans/2026-06-15-vtk-3d-p2-dataset3d-bar.md @@ -0,0 +1,43 @@ +# P2:三维数据集栏(坐标轴 / 比例 / 快捷视图 / Zoom) + +- 日期:2026-06-15 +- 分支:`feat/vtk-3d-view` +- 上游:spec `2026-06-15-vtk-3d-supplementary-design.md`(§4 行 C3–C8、§5.3、§7.2);接 P1(`VtkSceneController`/`I3dSceneView`/`VtkSceneView` 已就位) +- 目标:给三维视图加一组**纯前端、无后端依赖**的相机/坐标轴/比例控件(补充需求"三维数据集栏"工具条的功能项)。P1 已让中央渲染复活,P2 让用户能调坐标轴、纵向比例、快捷视角、缩放。 + +## 范围 +**范围内**: +- **快捷视图**(C7):前/后/左/右/上/下 6 向相机预设 + **Zoom In/Out/Fit**(C8)。 +- **水平/垂直比例**(C6):可调纵向夸张(复用 P1 已有 `VtkSceneController::setVerticalExaggeration`),UI 滑块/输入;范围如 1–10,默认 2。 +- **坐标轴**(C3–I5):显示方式 标准/三维立体/不显示;刻度单位 无/米/英尺/经纬度;O 点位置;字体。 +- 控件挂到三维视图工具条/浮层(**不做**完整三栏 tab 重构——留后续 UI 期;本期控件先以工具条形式接入现有三维视图)。 + +**范围外/后续**:三栏 tab 结构重构、二维数据集栏底图(P5)、三维分析切片(P3)。 + +## 关键设计 +- **CameraPreset 扩展**(`src/render/CameraPreset.*`):`applyView(vtkRenderer*, ViewDir)`,`ViewDir∈{Front,Back,Left,Right,Top,Bottom}`,设 position/focalPoint/viewUp 后 `ResetCamera`;`zoomBy(vtkRenderer*, factor)`(In=1.2/Out=1/1.2),`fit(=ResetCamera)`。世界系:x=East,y=North,z=-depth(与 actor 一致)。 +- **坐标轴**(新 `src/render/actors/AxesActor.*` 或 `CubeAxes.*`): + - 标准 = `vtkCubeAxesActor`(包围盒 + 刻度 + 标签);三维立体 = `vtkCubeAxesActor` 闭合立方/或叠加 `vtkAxesActor` 方向标(**语义待 1.0 确认,先合理近似**);不显示 = 不加。 + - 刻度单位:米(原值)/英尺(×3.28084)/经纬度(用 `GeoLocalFrame` 反算)/无(隐藏刻度标签)。 + - O 点:默认数据包围盒角;字体:`SetTitleTextProperty/SetLabelTextProperty` 设字号字体。 + - 输入 = renderer bounds + frame;产出 `vtkSmartPointer`,由 `I3dSceneView` 加入场景(经 `addViewProp`)。 +- **GeoLocalFrame 补反算**:`LocalXY → (lat,lon)`,加 `toLatLon(double x,double y)`(等距圆柱反算:lon=lon0+x/mPerDegLon,lat=lat0+y/mPerDegLat)。 +- **I3dSceneView 扩接口**:`setAxes(mode,unit,font,...)`、`applyCameraView(ViewDir)`、`zoom(factor)`、`fitView()`;`VtkSceneView` 实现,fake 测试记录。 +- **VtkSceneController**:加 `setAxesMode/setAxesUnit/...`、`applyView/zoomIn/zoomOut/fit` 槽,转发给 view;坐标轴在 rebuild 时按当前模式重建(轴随数据包围盒变)。 + +## 步骤(TDD) +0. 基线:`build.bat test` 全绿。 +1. **GeoLocalFrame.toLatLon**(TDD):往返 `toLocal∘toLatLon≈恒等` 测试。 +2. **CameraPreset 6 向 + zoom**(TDD):各 ViewDir 断言 position/focalPoint/viewUp 方向正确(如 Top: pos.z>focal.z、viewUp=+y;Front: pos.y