geopro/docs/superpowers/plans/2026-06-15-vtk-3d-p2-datase...

4.5 KiB
Raw Blame History

P2三维数据集栏坐标轴 / 比例 / 快捷视图 / Zoom

  • 日期2026-06-15
  • 分支:feat/vtk-3d-view
  • 上游spec 2026-06-15-vtk-3d-supplementary-design.md§4 行 C3C8、§5.3、§7.2);接 P1VtkSceneController/I3dSceneView/VtkSceneView 已就位)
  • 目标:给三维视图加一组纯前端、无后端依赖的相机/坐标轴/比例控件(补充需求"三维数据集栏"工具条的功能项。P1 已让中央渲染复活P2 让用户能调坐标轴、纵向比例、快捷视角、缩放。

范围

范围内

  • 快捷视图C7前/后/左/右/上/下 6 向相机预设 + Zoom In/Out/FitC8
  • 水平/垂直比例C6可调纵向夸张复用 P1 已有 VtkSceneController::setVerticalExaggerationUI 滑块/输入;范围如 110默认 2。
  • 坐标轴C3I5显示方式 标准/三维立体/不显示;刻度单位 无/米/英尺/经纬度O 点位置;字体。
  • 控件挂到三维视图工具条/浮层(不做完整三栏 tab 重构——留后续 UI 期;本期控件先以工具条形式接入现有三维视图)。

范围外/后续:三栏 tab 结构重构、二维数据集栏底图P5、三维分析切片P3

关键设计

  • CameraPreset 扩展src/render/CameraPreset.*applyView(vtkRenderer*, ViewDir)ViewDir∈{Front,Back,Left,Right,Top,Bottom},设 position/focalPoint/viewUp 后 ResetCamerazoomBy(vtkRenderer*, factor)In=1.2/Out=1/1.2fit(=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<vtkCubeAxesActor>,由 I3dSceneView 加入场景(经 addViewProp)。
  • GeoLocalFrame 补反算LocalXY → (lat,lon),加 toLatLon(double x,double y)等距圆柱反算lon=lon0+x/mPerDegLonlat=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

  1. 基线:build.bat test 全绿。
  2. GeoLocalFrame.toLatLonTDD往返 toLocal∘toLatLon≈恒等 测试。
  3. CameraPreset 6 向 + zoomTDD各 ViewDir 断言 position/focalPoint/viewUp 方向正确(如 Top: pos.z>focal.z、viewUp=+yFront: pos.y<focal、viewUp=+z 等zoomBy 改变 parallelScale/距离。
  4. AxesActor 构建TDD给定 bounds+unit 产出 vtkCubeAxesActor断言单位换算英尺/经纬度标签)、不显示返回空。
  5. I3dSceneView 扩接口 + VtkSceneView 实现 + 控制器槽TDD 控制器编排fake view 断言 axes/camera 调用)。
  6. UI 接入 main.cpp:三维视图工具条加 坐标轴下拉/刻度下拉/比例滑块/6 向快捷钮/Zoom 钮;连到控制器槽。仅三维模式显示该工具条。
  7. build.bat test 全绿 + build.bat app 链接通过;目视清单交用户。
  8. cpp-reviewer 审查 + 提交。

风险/注意

  • Ninja/工具链:增量构建若链接错用 cmake --build build\release --clean-first(保留 cache勿删 build 目录vcpkg baseline 已修但仍按记忆 build-vs2026-vcpkg-gotchas 谨慎)。
  • 坐标轴 "标准 vs 三维立体" 语义无 1.0 参考 → 先合理近似UI 可切换,待 1.0 实地学习再精修(记忆 study-original-via-playwright)。
  • 经纬度刻度仅在有 frame 配准的 3D 世界系下有意义;纯剖面坐标系下退化为米。
  • 比例滑块改变 → 控制器 setVerticalExaggeration → 全 3D actor SetScale 同步P1 已统一)。
  • 字体中文标签需可用字体VTK 文本默认 Arial中文可能缺字形 → 标签用数字/英文单位优先。