diff --git a/src/app/VtkSceneView.cpp b/src/app/VtkSceneView.cpp index 5893001..e335d4b 100644 --- a/src/app/VtkSceneView.cpp +++ b/src/app/VtkSceneView.cpp @@ -188,11 +188,13 @@ void VtkSceneView::applyCameraView(geopro::controller::ViewDir dir) { scene_.renderer()->ResetCamera(bounds); // 重新取景到数据(否则被~公里级底图推到超远) scene_.renderer()->ResetCameraClippingRange(); // 裁剪面含底图 if (renderWindow_) renderWindow_->Render(); + if (onCameraChanged) onCameraChanged(); // 相机变了 → 底图按新视锥重算覆盖 } void VtkSceneView::zoom(double factor) { geopro::render::zoomBy(scene_.renderer(), factor); if (renderWindow_) renderWindow_->Render(); + if (onCameraChanged) onCameraChanged(); } void VtkSceneView::fitView() { @@ -203,6 +205,7 @@ void VtkSceneView::fitView() { geopro::render::fitView(scene_.renderer()); scene_.renderer()->ResetCameraClippingRange(); // 裁剪面含底图 → 不被"蒙版"切掉 if (renderWindow_) renderWindow_->Render(); + if (onCameraChanged) onCameraChanged(); // 取景后 → 底图按新视锥重算覆盖(治首帧部分瓦片不出) } void VtkSceneView::rebuildAxes() { @@ -246,6 +249,7 @@ void VtkSceneView::render(bool is2D) { scene_.renderer()->ResetCamera(); scene_.renderer()->ResetCameraClippingRange(); // 裁剪面含底图 → 不被"蒙版"切掉 if (renderWindow_) renderWindow_->Render(); + if (onCameraChanged) onCameraChanged(); // 取景后 → 底图按新视锥重算覆盖 } void VtkSceneView::renderIncremental() { diff --git a/src/app/VtkSceneView.hpp b/src/app/VtkSceneView.hpp index ae67e60..615947d 100644 --- a/src/app/VtkSceneView.hpp +++ b/src/app/VtkSceneView.hpp @@ -62,6 +62,9 @@ public: // frame 原点重锚(首个带经纬剖面到达)后回调,供底图等随之刷新到数据所在位置。 std::function onFrameReanchored; + // 相机程序化变化(取景/预设/缩放)后回调,供底图按新视锥重算覆盖(否则首帧部分瓦片要手动微动才出)。 + std::function onCameraChanged; + private: // 按当前坐标轴设置 + 场景包围盒重建坐标轴 prop(render 末尾调)。 void rebuildAxes(); diff --git a/src/app/main.cpp b/src/app/main.cpp index 2892f5a..75345f2 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -412,6 +412,8 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re sceneView->onFrameReanchored = [basemap, basemapKind]() { if (*basemapKind != geopro::app::TileBasemap::Hidden) basemap->show(*basemapKind); }; + // 相机程序化变化(取景/预设/缩放)后,底图按新视锥重算覆盖(治首帧部分瓦片需手动微动才出)。 + sceneView->onCameraChanged = [basemap]() { basemap->refresh(); }; // ── 中央“空状态”引导浮层:未接入真实 sections 时,引导首次使用者从左侧入手。── // 透明背景 + 鼠标穿透(不挡 QVTK 交互);CenterOverlay 随视口尺寸保持居中;