#include "CameraPreset.hpp" #include namespace geopro::render { namespace { // 三维斜视方位角 / 仰角。 constexpr double kAzimuth = 30.0; constexpr double kElevation = 25.0; } // namespace void applyTop2D(vtkRenderer* r) { if (!r) return; auto* c = r->GetActiveCamera(); c->ParallelProjectionOn(); // 正对 XY 平面:position 在 +Z,focalpoint 在原点(ResetCamera 会重定位到场景中心),viewUp = +Y。 c->SetFocalPoint(0, 0, 0); c->SetPosition(0, 0, 1); c->SetViewUp(0, 1, 0); r->ResetCamera(); } void applyFree3D(vtkRenderer* r) { if (!r) return; auto* c = r->GetActiveCamera(); c->ParallelProjectionOff(); // 先回到俯视基准,再叠加方位 / 仰角,得到稳定的斜视立体视角。 c->SetFocalPoint(0, 0, 0); c->SetPosition(0, 0, 1); c->SetViewUp(0, 1, 0); c->Azimuth(kAzimuth); c->Elevation(kElevation); c->OrthogonalizeViewUp(); r->ResetCamera(); } void applyView(vtkRenderer* r, ViewDir dir) { if (!r) return; auto* c = r->GetActiveCamera(); // 6 向均为正交快捷视图。焦点先置原点,ResetCamera 再按场景重定位相机距离; // 方向由 (position-focalPoint) 与 viewUp 决定(世界系 x=East,y=North,z=-depth)。 c->SetFocalPoint(0, 0, 0); switch (dir) { case ViewDir::Top: // 俯视:相机在 +Z 向下看,北(+Y)朝上 c->SetPosition(0, 0, 1); c->SetViewUp(0, 1, 0); break; case ViewDir::Bottom: // 仰视:相机在 -Z 向上看 c->SetPosition(0, 0, -1); c->SetViewUp(0, 1, 0); break; case ViewDir::Front: // 北望:相机在 -Y 看向 +Y,上(+Z)朝上 c->SetPosition(0, -1, 0); c->SetViewUp(0, 0, 1); break; case ViewDir::Back: // 南望:相机在 +Y 看向 -Y c->SetPosition(0, 1, 0); c->SetViewUp(0, 0, 1); break; case ViewDir::Left: // 东望:相机在 -X 看向 +X c->SetPosition(-1, 0, 0); c->SetViewUp(0, 0, 1); break; case ViewDir::Right: // 西望:相机在 +X 看向 -X c->SetPosition(1, 0, 0); c->SetViewUp(0, 0, 1); break; } c->OrthogonalizeViewUp(); r->ResetCamera(); } void zoomBy(vtkRenderer* r, double factor) { if (!r || factor <= 0.0) return; // vtkCamera::Zoom 同时覆盖透视(改视角)与正交(改 parallelScale):factor>1 放大。 r->GetActiveCamera()->Zoom(factor); } void fitView(vtkRenderer* r) { if (!r) return; r->ResetCamera(); } } // namespace geopro::render