BestMPRBaseVtk-012-vtk交互器vtkRenderWindowInteractor

vtkRenderWindowInteractor是一个独立于平台的渲染窗口交互类,用于处理鼠标、键盘事件,提供拾取和帧速率控制。它是vtkInteractorObserver和vtkInteractorStyle的基础,通过VTK的命令/观察者模式响应事件。实际应用中,可以重写相关函数实现自定义交互。代码示例展示了如何设置和使用vtkRenderWindowInteractor。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

头图

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的继承图如下图所示:

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
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DreamLife.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值