BestMPRBaseVtk-012-vtk交互器vtkRenderWindowInteractor

Posted DreamLife.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BestMPRBaseVtk-012-vtk交互器vtkRenderWindowInteractor相关的知识,希望对你有一定的参考价值。

BestMPRBaseVtk vtk交互器vtkRenderWindowInteractor

​ 今天想好好学习一下vtkRenderWindowInteractorvtkRenderWindowInteractor是一个独立于平台的渲染窗口交互类,包括拾取和帧速率控制。


关键字: 交互器鼠标键盘控制vtk

1 vtk 交互器 vtkRenderWindowInteractor

​ 以下内容来之谷歌翻译官方文档:

  `vtkRenderWindowInteractor`为鼠标/按键/时间事件提供了独立于平台的交互机制。它用作平台相关实现的基类,这些实现处理将鼠标/按键/计时器消息路由到`vtkInteractorObserver`及其子类。`vtkRenderWindowInteractor`还提供用于拾取、渲染帧速率和前灯的控件。

vtkRenderWindowInteractor与之前的实现有所不同,现在仅用作外壳来保存用户首选项并将消息路由到vtkInteractorStyle。回调可用于许多事件。特定于平台的子类应提供操作计时器、TerminateApp 和事件循环的方法(如果需要)通过 Initialize/Start/Enable/Disable。

vtkRenderWindowInteractor通过 VTK 的命令/观察者设计模式路由事件。也就是说,当vtkRenderWindowInteractor(实际上是它的子类之一)看到一个平台相关事件时,它会使用InvokeEvent()方法将其转换为 VTK 事件。然后任何为该事件注册的 vtkInteractorObservers 都应该适当地响应。

vtkRenderWindowInteractor的继承图如下图所示:

​ 简单点说,就是vtkRenderWindowInteractor能够捕捉渲染窗口中的鼠标事件和键盘事件,并将这些事件转变为对相机、Actor和属性对象的相应操作。

2 实际代码

​ 这个代码要看我注释掉部分,哪里是交互器相关的。

void BPPMPRWidget::setRenderWindow(vtkGenericOpenGLRenderWindow *win)

    if(this->RenderWindow == win)                                                       //判断当前窗口是不是传进来的,是就返回不是继续
    
        return;
    

    if(this->RenderWindowAdapter)                                                       // 这将释放所有与旧窗口相关的OpenGL资源
    
        this->makeCurrent();                                                            //为窗口绘制OpenGL内容做准备,将上下文设置为当前,并为该上下文绑定framebuffer
        this->RenderWindowAdapter.reset(nullptr);                                       //删除并重置指针
    

    this->RenderWindow = win;                                                           //赋新值
    if(this->RenderWindow)
    
        this->RenderWindow->SetReadyForRendering(false);

//        if(!this->RenderWindow->GetInteractor())                                        //如果没有提供交互器,我们默认将创建一个
//        
//            vtkNew<QVTKInteractor> iren;                                                //创建一个默认交互器
//            this->RenderWindow->SetInteractor(iren);                                    //为RenderWindow添加交互器
//            iren->Initialize();                                                         //交互器初始化

//            vtkNew<myVtkInteractorStyleImage> style;                                    //设置交互器默认样式
//            style->SetImageViewer(m_PipeLine);
//            iren->SetInteractorStyle(style);                                            //设置交互器
//        
        if(this->isValid())
        
            this->makeCurrent();                                                        //为窗口绘制OpenG内容做准备,将上下文设置为当前,并为该上下文绑定framebuffer paintGL会自动调用。
            this->initializeGL();                                                       //初始化Openg
            this->updateSize();                                                         //更新窗口尺寸
        
    

3 交互

​ 剩下的交互就好整了,根据需求,重写下面的函数就可以实现自定义交互了,也可以不用他的交互,直接使用Qt的事件,把这些再实现一遍就可以了。

​ 后面就可以根据业务需求自己重写这个类就可以了。

☞ 源码

源码链接:GitHub仓库自取

使用方法:☟☟☟


以上是关于BestMPRBaseVtk-012-vtk交互器vtkRenderWindowInteractor的主要内容,如果未能解决你的问题,请参考以下文章

Android MVP:啥是交互器?

在身份检查器、属性检查器中启用用户交互?

清洁架构中的“用例交互器”和“服务”有啥区别?

清洁架构:结合交互器

交互式决策树分类器

BestMPRBaseVtk-11-Qt交互器QVTKInteractor