VTK 交互方式 之 SetInteractorStyle() 和 AddObserver()

VTK的交互方式

  • 交互样式 (Interactor Styles)
  • 事件机制

一、通过设置交互样式(Interactor Styles)来实现交互行为
交互样式主要有

  1. vtkInteractorStyleTrackballCamera
    功能:允许用户通过拖动鼠标来旋转、缩放和移动相机。
    适用场景:3D 场景的自由视角交互。
  2. vtkInteractorStyleImage
    功能:专门用于图像的交互,比如在医学图像中进行切片浏览。
    适用场景:处理和查看图像数据集。
  3. vtkInteractorStyleRubberBandZoom
    功能:允许用户使用橡皮带框选区域进行缩放。
    适用场景:需要局部放大查看的情况。
  4. 等…
    在这里插入图片描述
    其具体使用方法如下所示:
vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
interactor->SetRenderWindow(renderWindow);
vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
interactor->SetInteractorStyle(style);

有时候我们需要自定义一些交互方式,可以选择继承上述交互样式,然后具体重写某个交互方式,以vtkInteractorStyleTrackballCamera 为例子:

  • 其主要功能为
    vtkInteractorStyleTrackballCamera 的主要功能是通过鼠标事件控制相机的行为:

  • 旋转:通过鼠标左键拖动,旋转场景。

  • 平移:通过鼠标中键拖动,平移场景。

  • 缩放:通过鼠标右键拖动或滚轮滚动,缩放场景。

  • 重置:支持将相机重置到初始位置。
    在这里插入图片描述
    我们可以根据需要自定义交互行为,通过继承 vtkInteractorStyleTrackballCamera 并重写事件处理方法。例如,以下代码展示了如何禁用右键缩放功能:

class CustomInteractorStyle : public vtkInteractorStyleTrackballCamera {
public:
    static CustomInteractorStyle* New() {
        return new CustomInteractorStyle;
    }

    virtual void OnRightButtonDown() override {
        // 禁用右键缩放功能
        std::cout << "Right button pressed, but zoom is disabled." << std::endl;
    }
};

int main() {
    // ...(省略前面的代码)

    // 使用自定义的交互风格
    vtkSmartPointer<CustomInteractorStyle> style = vtkSmartPointer<CustomInteractorStyle>::New();
    interactor->SetInteractorStyle(style);

    // ...(省略后面的代码)

这样便完成了 自定义的交互样式。

二、通过设置事件机制来实现交互行为
具体可参考下面这篇文章:
VTK交互(三维图像切片切换)
通过为renderWindowInteractor 添加事件观察器 AddObserver(event, callback) 来实现一些特定的交互。

总结

  • 交互样式(Interactor Styles) 主要用于设置全局的交互行为
  • 事件机制主要更倾向于用于监听和处理特定的事件。
  • 我们可以同时使用 SetInteractorStyle 和 AddObserver 来实现复杂的交互逻辑
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值