#ifndef NMVTKCAMERACONTROLLER_H #define NMVTKCAMERACONTROLLER_H #include "nmRender_global.h" class vtkRenderer; /** * @brief 无业务含义的 VTK 相机控制器。 * * 控制器不拥有 Renderer,也不主动 Render。操作成功后由容器统一渲染一次。 * 无 Renderer、无可见 Prop 或边界无效时,各操作返回 false 且不移动相机。 */ class NM_RENDER_EXPORT nmVTKCameraController { public: /** @brief 绑定 Renderer 非所有权指针;允许传入 NULL 延后初始化。 */ explicit nmVTKCameraController(vtkRenderer* pRenderer = NULL); /** @brief 只解除 Renderer 引用,不修改相机和场景。 */ ~nmVTKCameraController(); /** @brief 切换非所有权 Renderer;传入 NULL 表示解除。 */ void setRenderer(vtkRenderer* pRenderer); /** @brief 返回当前 Renderer 非所有权指针。 */ vtkRenderer* getRenderer() const; /** @brief 恢复透视投影并适配当前可见边界。 */ bool resetCamera(); /** @brief 按固定倍率 1.2 放大当前视图,保持观察方向和投影方式。 */ bool zoomIn(); /** @brief 按固定倍率 1.0 / 1.2 缩小当前视图。 */ bool zoomOut(); /** @brief 保持当前观察方向和投影方式,仅适配可见边界。 */ bool fitView(); /** @brief 沿 +Z 方向设置正交顶视图。 */ bool setTopView(); /** @brief 沿 -Y 方向设置正交前视图。 */ bool setFrontView(); /** @brief 沿 +X 方向设置正交右视图。 */ bool setRightView(); /** @brief 设置透视等轴视图。 */ bool setIsometricView(); /** @brief 保持观察方向和距离,将焦点平移到指定世界坐标。 */ bool setRotationCenter(double dX, double dY, double dZ); /** @brief 将旋转中心恢复为当前可见边界中心。 */ bool resetRotationCenter(); private: Q_DISABLE_COPY(nmVTKCameraController) /** @brief 读取并验证当前可见 Prop 的有限包围盒。 */ bool getVisibleBounds(double dBounds[6]) const; /** @brief 设置观察方向和投影方式,再按可见边界适配相机。 */ bool applyStandardView(double dDirectionX, double dDirectionY, double dDirectionZ, double dViewUpX, double dViewUpY, double dViewUpZ, bool bParallelProjection); /** @brief 按给定倍率调整透视距离或正交投影比例。 */ bool zoom(double dFactor); vtkRenderer* m_pRenderer; ///< 非所有权指针,由渲染容器持有。 }; #endif // NMVTKCAMERACONTROLLER_H