geopro/src/render/CameraPreset.cpp

91 lines
2.7 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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 在 +Zfocalpoint 在原点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