From e15930d8fb37e55d6454cf07d634662c6ea5752f Mon Sep 17 00:00:00 2001 From: gaozheng Date: Wed, 17 Jun 2026 15:30:59 +0800 Subject: [PATCH] =?UTF-8?q?fix(vtk):=20=E6=B2=BB=E9=A6=96=E5=B8=A7?= =?UTF-8?q?=E9=83=A8=E5=88=86=E7=93=A6=E7=89=87=E9=9C=80=E6=89=8B=E5=8A=A8?= =?UTF-8?q?=E5=BE=AE=E5=8A=A8=E6=89=8D=E5=87=BA-=E7=9B=B8=E6=9C=BA?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=8C=96=E5=8F=98=E5=8C=96(=E5=8F=96?= =?UTF-8?q?=E6=99=AF/=E9=A2=84=E8=AE=BE/=E7=BC=A9=E6=94=BE)=E5=90=8E?= =?UTF-8?q?=E7=BB=8FonCameraChanged=E9=80=9A=E7=9F=A5=E5=BA=95=E5=9B=BE?= =?UTF-8?q?=E6=8C=89=E6=96=B0=E8=A7=86=E9=94=A5=E9=87=8D=E7=AE=97=E8=A6=86?= =?UTF-8?q?=E7=9B=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/VtkSceneView.cpp | 4 ++++ src/app/VtkSceneView.hpp | 3 +++ src/app/main.cpp | 2 ++ 3 files changed, 9 insertions(+) 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 随视口尺寸保持居中;