feat/vtk-3d-view #7
|
|
@ -259,6 +259,7 @@ void TileBasemap::refresh() {
|
||||||
}
|
}
|
||||||
|
|
||||||
purgeStale();
|
purgeStale();
|
||||||
|
ren->ResetCameraClippingRange(); // 交互后扩裁剪面以含新载入的底图瓦片(防被"蒙版"切)
|
||||||
if (rw_) rw_->Render();
|
if (rw_) rw_->Render();
|
||||||
refreshing_ = false;
|
refreshing_ = false;
|
||||||
}
|
}
|
||||||
|
|
@ -380,7 +381,8 @@ vtkSmartPointer<vtkActor> TileBasemap::buildFlat(int z, int x, int y,
|
||||||
actor->SetMapper(mapper);
|
actor->SetMapper(mapper);
|
||||||
actor->SetTexture(tex);
|
actor->SetTexture(tex);
|
||||||
actor->GetProperty()->LightingOff(); // 底图不受场景光照
|
actor->GetProperty()->LightingOff(); // 底图不受场景光照
|
||||||
actor->SetUseBounds(false); // 底图不参与包围盒/相机取景:否则坐标轴/适配被~公里级底图撑大
|
// 注意:UseBounds 保持默认 true → 参与相机裁剪面计算,否则底图会被裁剪面"蒙版"切掉。
|
||||||
|
// 坐标轴/取景不被底图撑大,由 VtkSceneView 改用"数据自身包围盒"解决(非靠 UseBounds=false)。
|
||||||
return actor;
|
return actor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -493,8 +495,7 @@ vtkSmartPointer<vtkActor> TileBasemap::buildWarped(int sz, int sx, int sy, int d
|
||||||
actor->SetMapper(mapper);
|
actor->SetMapper(mapper);
|
||||||
actor->SetTexture(tex);
|
actor->SetTexture(tex);
|
||||||
actor->GetProperty()->LightingOff();
|
actor->GetProperty()->LightingOff();
|
||||||
actor->SetUseBounds(false); // 同 buildFlat:底图不参与包围盒/相机取景
|
return actor; // UseBounds 默认 true:参与裁剪面,避免被"蒙版"切掉
|
||||||
return actor;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace geopro::app
|
} // namespace geopro::app
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
#include <vtkActor.h>
|
#include <vtkActor.h>
|
||||||
|
#include <vtkBoundingBox.h>
|
||||||
#include <vtkCubeAxesActor.h>
|
#include <vtkCubeAxesActor.h>
|
||||||
#include <vtkProp.h>
|
#include <vtkProp.h>
|
||||||
#include <vtkRenderWindow.h>
|
#include <vtkRenderWindow.h>
|
||||||
|
|
@ -68,6 +69,18 @@ void VtkSceneView::removeProps(std::vector<vtkSmartPointer<vtkProp>>& props) {
|
||||||
props.clear();
|
props.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool VtkSceneView::computeDataBounds(double out[6]) const {
|
||||||
|
vtkBoundingBox bb;
|
||||||
|
for (const auto& kv : dsProps_)
|
||||||
|
for (const auto& p : kv.second)
|
||||||
|
if (p) { if (double* b = p->GetBounds()) bb.AddBounds(b); }
|
||||||
|
for (const auto& p : miscProps_)
|
||||||
|
if (p) { if (double* b = p->GetBounds()) bb.AddBounds(b); }
|
||||||
|
if (!bb.IsValid()) return false;
|
||||||
|
bb.GetBounds(out);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void VtkSceneView::clear() {
|
void VtkSceneView::clear() {
|
||||||
// 只移除数据 prop(按 ds 跟踪)+ 杂项(地形/测线)+ 坐标轴;不动底图(TileBasemap 自管)→ 重建不丢图。
|
// 只移除数据 prop(按 ds 跟踪)+ 杂项(地形/测线)+ 坐标轴;不动底图(TileBasemap 自管)→ 重建不丢图。
|
||||||
for (auto& kv : dsProps_) removeProps(kv.second);
|
for (auto& kv : dsProps_) removeProps(kv.second);
|
||||||
|
|
@ -179,7 +192,12 @@ void VtkSceneView::zoom(double factor) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void VtkSceneView::fitView() {
|
void VtkSceneView::fitView() {
|
||||||
geopro::render::fitView(scene_.renderer());
|
double bounds[6];
|
||||||
|
if (computeDataBounds(bounds))
|
||||||
|
scene_.renderer()->ResetCamera(bounds); // 取景到数据(不含底图)
|
||||||
|
else
|
||||||
|
geopro::render::fitView(scene_.renderer());
|
||||||
|
scene_.renderer()->ResetCameraClippingRange(); // 裁剪面含底图 → 不被"蒙版"切掉
|
||||||
if (renderWindow_) renderWindow_->Render();
|
if (renderWindow_) renderWindow_->Render();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -190,10 +208,10 @@ void VtkSceneView::rebuildAxes() {
|
||||||
scene_.renderer()->RemoveViewProp(currentAxes_);
|
scene_.renderer()->RemoveViewProp(currentAxes_);
|
||||||
currentAxes_ = nullptr;
|
currentAxes_ = nullptr;
|
||||||
}
|
}
|
||||||
// 坐标轴随数据包围盒重建:按已加入的数据图元算 bounds,再造 vtkCubeAxesActor 入场。
|
// 坐标轴随数据包围盒重建:仅按数据图元算 bounds(不含底图,否则被~公里级底图撑大),
|
||||||
// None 模式或无内容 → buildAxes 返回 nullptr,场景无坐标轴。
|
// 再造 vtkCubeAxesActor 入场。None 模式或无数据 → buildAxes 返回 nullptr,场景无坐标轴。
|
||||||
double bounds[6];
|
double bounds[6];
|
||||||
scene_.renderer()->ComputeVisiblePropBounds(bounds);
|
if (!computeDataBounds(bounds)) return; // 无数据 → 不建坐标轴
|
||||||
geopro::render::AxesOptions opts;
|
geopro::render::AxesOptions opts;
|
||||||
opts.mode = toRenderMode(axesMode_);
|
opts.mode = toRenderMode(axesMode_);
|
||||||
opts.unit = toRenderUnit(axesUnit_);
|
opts.unit = toRenderUnit(axesUnit_);
|
||||||
|
|
@ -217,13 +235,19 @@ void VtkSceneView::render(bool is2D) {
|
||||||
geopro::render::applyTop2D(scene_.renderer());
|
geopro::render::applyTop2D(scene_.renderer());
|
||||||
else
|
else
|
||||||
geopro::render::applyFree3D(scene_.renderer());
|
geopro::render::applyFree3D(scene_.renderer());
|
||||||
scene_.renderer()->ResetCamera();
|
double bounds[6];
|
||||||
|
if (computeDataBounds(bounds))
|
||||||
|
scene_.renderer()->ResetCamera(bounds); // 取景到数据(不含底图,否则数据缩成小点)
|
||||||
|
else
|
||||||
|
scene_.renderer()->ResetCamera();
|
||||||
|
scene_.renderer()->ResetCameraClippingRange(); // 裁剪面含底图 → 不被"蒙版"切掉
|
||||||
if (renderWindow_) renderWindow_->Render();
|
if (renderWindow_) renderWindow_->Render();
|
||||||
}
|
}
|
||||||
|
|
||||||
void VtkSceneView::renderIncremental() {
|
void VtkSceneView::renderIncremental() {
|
||||||
// 增量渲染:仅按新包围盒重建坐标轴并提交,不动相机(勾选/取消时视角不跳)。
|
// 增量渲染:仅按新包围盒重建坐标轴并提交,不动相机(勾选/取消时视角不跳)。
|
||||||
rebuildAxes();
|
rebuildAxes();
|
||||||
|
scene_.renderer()->ResetCameraClippingRange(); // 数据/底图变化后扩裁剪面,防被切
|
||||||
if (renderWindow_) renderWindow_->Render();
|
if (renderWindow_) renderWindow_->Render();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -66,6 +66,8 @@ private:
|
||||||
// 按当前坐标轴设置 + 场景包围盒重建坐标轴 prop(render 末尾调)。
|
// 按当前坐标轴设置 + 场景包围盒重建坐标轴 prop(render 末尾调)。
|
||||||
void rebuildAxes();
|
void rebuildAxes();
|
||||||
void removeProps(std::vector<vtkSmartPointer<vtkProp>>& props); // 从 renderer 移除并清空
|
void removeProps(std::vector<vtkSmartPointer<vtkProp>>& props); // 从 renderer 移除并清空
|
||||||
|
// 仅数据图元(剖面/体素/地形/测线)的包围盒,不含底图 → 坐标轴/取景不被~公里级底图撑大。
|
||||||
|
bool computeDataBounds(double out[6]) const;
|
||||||
|
|
||||||
geopro::render::Scene& scene_;
|
geopro::render::Scene& scene_;
|
||||||
vtkRenderWindow* renderWindow_;
|
vtkRenderWindow* renderWindow_;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue