012_BestMPRBaseVtk vtk交互器vtkRenderWindowInteractor

306 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

头图

BestMPRBaseVtk vtk交互器vtkRenderWindowInteractor

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


BestMPRBaseVtk vtk交互器vtkRenderWindowInteractor1 vtk 交互器 vtkRenderWindowInteractor2 实际代码3 交互☞ 源码

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

1 vtk 交互器 vtkRenderWindowInteractor

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

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

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

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

vtkRenderWindowInteractor的继承图如下图所示:

image-20211221135246854

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

image-20211222103010796

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的事件,把这些再实现一遍就可以了。

image-20211222134054839

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

☞ 源码

源码链接:GitHub仓库自取

使用方法:☟☟☟

源码


博客签名2021

\