From 55085208bbfd83b776b225d9a521ed796ed6b472 Mon Sep 17 00:00:00 2001 From: gaozheng Date: Tue, 30 Jun 2026 23:46:44 +0800 Subject: [PATCH] =?UTF-8?q?refactor(vtk):=20TileBasemap=20groundZ=20?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E5=8C=96=E6=94=AF=E6=8C=81=E5=A4=9A=E5=AE=9E?= =?UTF-8?q?=E4=BE=8B=E5=B9=B3=E9=9D=A2=E5=BA=95=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/TileBasemap.cpp | 10 +++++----- src/app/TileBasemap.hpp | 4 +++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/app/TileBasemap.cpp b/src/app/TileBasemap.cpp index dabef54..25ffd33 100644 --- a/src/app/TileBasemap.cpp +++ b/src/app/TileBasemap.cpp @@ -52,7 +52,6 @@ constexpr double kRangeCeil = 30000.0; // 最多 30km(防远裁剪面失控) constexpr int kMaxConcurrent = 12; // 瓦片请求最大并发(天地图 8 子域+Mapbox,适度提高吞吐) constexpr int kMinZoom = 3; constexpr int kMaxZoom = 18; -constexpr double kGroundZ = 0.0; // 底图置于 z=0 地面参考(剖面深度向下为负,落其下) constexpr double kZEps = 0.02; // 每层级 Z 微偏移:高层级压上面,避免共面瓦片 z-fighting constexpr int kHardCap = 400; // 瓦片硬上限:超过则即便未落地也强制清理,兜底内存 constexpr double kPi = 3.14159265358979323846; @@ -120,8 +119,9 @@ long long TileBasemap::tileKey(int z, int x, int y) { } TileBasemap::TileBasemap(geopro::render::Scene& scene, vtkRenderWindow* rw, - std::shared_ptr frame, QObject* parent) - : QObject(parent), scene_(scene), rw_(rw), frame_(std::move(frame)) {} + std::shared_ptr frame, QObject* parent, + double groundZ) + : QObject(parent), scene_(scene), rw_(rw), frame_(std::move(frame)), groundZ_(groundZ) {} void TileBasemap::requestRender() { // 合并渲染:同一事件循环轮次内的多次请求只渲染一帧(标准做法,避免逐瓦片重复 Render 卡顿)。 @@ -445,7 +445,7 @@ vtkSmartPointer TileBasemap::buildFlat(int z, int x, int y, const auto sw = frame_->toLocal(b.south, b.west); const auto se = frame_->toLocal(b.south, b.east); const auto nw = frame_->toLocal(b.north, b.west); - const double gz = kGroundZ + (z - kMinZoom) * kZEps; // 高层级略抬高,压在旧层之上防共面闪烁 + const double gz = groundZ_ + (z - kMinZoom) * kZEps; // 高层级略抬高,压在旧层之上防共面闪烁 // PlaneSource 自动 tcoord:origin=SW→u 西0东1、v 南0北1(与翻转后纹理对齐)。 vtkNew plane; @@ -534,7 +534,7 @@ vtkSmartPointer TileBasemap::buildWarped(int sz, int sx, int sy, int d const auto sw = frame_->toLocal(sb.south, sb.west); const auto se = frame_->toLocal(sb.south, sb.east); const auto nw = frame_->toLocal(sb.north, sb.west); - const double base = kGroundZ + (sz - kMinZoom) * kZEps; + const double base = groundZ_ + (sz - kMinZoom) * kZEps; // PlaneSource(等距圆柱下平面插值即正确 x/y) + 自动 tcoord;再按各点真实经纬采 DEM 位移 Z。 vtkNew plane; diff --git a/src/app/TileBasemap.hpp b/src/app/TileBasemap.hpp index 3119d3e..5474b2c 100644 --- a/src/app/TileBasemap.hpp +++ b/src/app/TileBasemap.hpp @@ -33,7 +33,8 @@ class TileBasemap : public QObject { public: enum Kind { Street = 0, Satellite = 1, Hidden = 2 }; TileBasemap(geopro::render::Scene& scene, vtkRenderWindow* rw, - std::shared_ptr frame, QObject* parent = nullptr); + std::shared_ptr frame, QObject* parent = nullptr, + double groundZ = 0.0); ~TileBasemap() override; void show(Kind kind); // 显示某底图(Hidden 等同 hide);记住类型供 LOD 刷新复用 @@ -76,6 +77,7 @@ private: std::set inFlight_; // 在途瓦片(续到起伏/平面最终落地) std::map demCache_; // DEM 块缓存(key=DEMz/x/y),跨隐藏/重选复用 std::map> texCache_; // 影像纹理缓存,重选/缩放回看免重拉 + double groundZ_ = 0.0; // 底图地面参考 z(per-instance):3D 底图=0;2D 平面底图=各类型平面高程 double ve_ = 1.0; // 地形垂向夸张(与剖面 verticalExaggeration 一致才对齐) double opacity_ = 0.5; // 底图半透明:地下剖面可从任意角度透过地面看到(不再被遮挡) double maxTileDist_ = 2000.0; // 底图最大距离(米),每次刷新按剖面范围动态算