refactor(vtk): TileBasemap groundZ 参数化支持多实例平面底图
This commit is contained in:
parent
15c30a5821
commit
55085208bb
|
|
@ -52,7 +52,6 @@ constexpr double kRangeCeil = 30000.0; // 最多 30km(防远裁剪面失控)
|
||||||
constexpr int kMaxConcurrent = 12; // 瓦片请求最大并发(天地图 8 子域+Mapbox,适度提高吞吐)
|
constexpr int kMaxConcurrent = 12; // 瓦片请求最大并发(天地图 8 子域+Mapbox,适度提高吞吐)
|
||||||
constexpr int kMinZoom = 3;
|
constexpr int kMinZoom = 3;
|
||||||
constexpr int kMaxZoom = 18;
|
constexpr int kMaxZoom = 18;
|
||||||
constexpr double kGroundZ = 0.0; // 底图置于 z=0 地面参考(剖面深度向下为负,落其下)
|
|
||||||
constexpr double kZEps = 0.02; // 每层级 Z 微偏移:高层级压上面,避免共面瓦片 z-fighting
|
constexpr double kZEps = 0.02; // 每层级 Z 微偏移:高层级压上面,避免共面瓦片 z-fighting
|
||||||
constexpr int kHardCap = 400; // 瓦片硬上限:超过则即便未落地也强制清理,兜底内存
|
constexpr int kHardCap = 400; // 瓦片硬上限:超过则即便未落地也强制清理,兜底内存
|
||||||
constexpr double kPi = 3.14159265358979323846;
|
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,
|
TileBasemap::TileBasemap(geopro::render::Scene& scene, vtkRenderWindow* rw,
|
||||||
std::shared_ptr<geopro::core::GeoLocalFrame> frame, QObject* parent)
|
std::shared_ptr<geopro::core::GeoLocalFrame> frame, QObject* parent,
|
||||||
: QObject(parent), scene_(scene), rw_(rw), frame_(std::move(frame)) {}
|
double groundZ)
|
||||||
|
: QObject(parent), scene_(scene), rw_(rw), frame_(std::move(frame)), groundZ_(groundZ) {}
|
||||||
|
|
||||||
void TileBasemap::requestRender() {
|
void TileBasemap::requestRender() {
|
||||||
// 合并渲染:同一事件循环轮次内的多次请求只渲染一帧(标准做法,避免逐瓦片重复 Render 卡顿)。
|
// 合并渲染:同一事件循环轮次内的多次请求只渲染一帧(标准做法,避免逐瓦片重复 Render 卡顿)。
|
||||||
|
|
@ -445,7 +445,7 @@ vtkSmartPointer<vtkActor> TileBasemap::buildFlat(int z, int x, int y,
|
||||||
const auto sw = frame_->toLocal(b.south, b.west);
|
const auto sw = frame_->toLocal(b.south, b.west);
|
||||||
const auto se = frame_->toLocal(b.south, b.east);
|
const auto se = frame_->toLocal(b.south, b.east);
|
||||||
const auto nw = frame_->toLocal(b.north, b.west);
|
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(与翻转后纹理对齐)。
|
// PlaneSource 自动 tcoord:origin=SW→u 西0东1、v 南0北1(与翻转后纹理对齐)。
|
||||||
vtkNew<vtkPlaneSource> plane;
|
vtkNew<vtkPlaneSource> plane;
|
||||||
|
|
@ -534,7 +534,7 @@ vtkSmartPointer<vtkActor> TileBasemap::buildWarped(int sz, int sx, int sy, int d
|
||||||
const auto sw = frame_->toLocal(sb.south, sb.west);
|
const auto sw = frame_->toLocal(sb.south, sb.west);
|
||||||
const auto se = frame_->toLocal(sb.south, sb.east);
|
const auto se = frame_->toLocal(sb.south, sb.east);
|
||||||
const auto nw = frame_->toLocal(sb.north, sb.west);
|
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。
|
// PlaneSource(等距圆柱下平面插值即正确 x/y) + 自动 tcoord;再按各点真实经纬采 DEM 位移 Z。
|
||||||
vtkNew<vtkPlaneSource> plane;
|
vtkNew<vtkPlaneSource> plane;
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,8 @@ class TileBasemap : public QObject {
|
||||||
public:
|
public:
|
||||||
enum Kind { Street = 0, Satellite = 1, Hidden = 2 };
|
enum Kind { Street = 0, Satellite = 1, Hidden = 2 };
|
||||||
TileBasemap(geopro::render::Scene& scene, vtkRenderWindow* rw,
|
TileBasemap(geopro::render::Scene& scene, vtkRenderWindow* rw,
|
||||||
std::shared_ptr<geopro::core::GeoLocalFrame> frame, QObject* parent = nullptr);
|
std::shared_ptr<geopro::core::GeoLocalFrame> frame, QObject* parent = nullptr,
|
||||||
|
double groundZ = 0.0);
|
||||||
~TileBasemap() override;
|
~TileBasemap() override;
|
||||||
|
|
||||||
void show(Kind kind); // 显示某底图(Hidden 等同 hide);记住类型供 LOD 刷新复用
|
void show(Kind kind); // 显示某底图(Hidden 等同 hide);记住类型供 LOD 刷新复用
|
||||||
|
|
@ -76,6 +77,7 @@ private:
|
||||||
std::set<long long> inFlight_; // 在途瓦片(续到起伏/平面最终落地)
|
std::set<long long> inFlight_; // 在途瓦片(续到起伏/平面最终落地)
|
||||||
std::map<long long, QImage> demCache_; // DEM 块缓存(key=DEMz/x/y),跨隐藏/重选复用
|
std::map<long long, QImage> demCache_; // DEM 块缓存(key=DEMz/x/y),跨隐藏/重选复用
|
||||||
std::map<long long, vtkSmartPointer<vtkTexture>> texCache_; // 影像纹理缓存,重选/缩放回看免重拉
|
std::map<long long, vtkSmartPointer<vtkTexture>> texCache_; // 影像纹理缓存,重选/缩放回看免重拉
|
||||||
|
double groundZ_ = 0.0; // 底图地面参考 z(per-instance):3D 底图=0;2D 平面底图=各类型平面高程
|
||||||
double ve_ = 1.0; // 地形垂向夸张(与剖面 verticalExaggeration 一致才对齐)
|
double ve_ = 1.0; // 地形垂向夸张(与剖面 verticalExaggeration 一致才对齐)
|
||||||
double opacity_ = 0.5; // 底图半透明:地下剖面可从任意角度透过地面看到(不再被遮挡)
|
double opacity_ = 0.5; // 底图半透明:地下剖面可从任意角度透过地面看到(不再被遮挡)
|
||||||
double maxTileDist_ = 2000.0; // 底图最大距离(米),每次刷新按剖面范围动态算
|
double maxTileDist_ = 2000.0; // 底图最大距离(米),每次刷新按剖面范围动态算
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue