91 lines
2.7 KiB
C++
91 lines
2.7 KiB
C++
#include "CameraPreset.hpp"
|
||
|
||
#include <vtkCamera.h>
|
||
|
||
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
|