所谓交互器样式,就是你设置了交互器,然后它里面会有各种默认的或者你自己定义的交互方式,比如你可以设置滚轮来将图片放大或者缩小。或者你可以设置鼠标点击移动来改变摄像机的视角,从而看到物体的不同面。

VTK程序需要首先捕获你的事件,然后根据你触发的事件,结合交互器的样式,来执行相应的函数。

之前在学习的时候我看了很多例子,模仿着写了很多自定义的样式,但是对里面的机制有些难以理解。后来我看了《VTK图形图像开发进阶》张晓东,罗火灵编著的书,个人觉得这本书针对这种交互器的执行内容比较浅显,但是用来了解交互器样式已经很足够了,毕竟我们的主要目标是为了使用,而不是完全理解里面的机制。

但是这里并不打算介绍太多机制,因为用处其实也不是很大,这一节就简单介绍一点内容,然后下一节开始自己写相应的交互器样式。

首先我们来介绍vtkRenderWindowInteractor,即渲染窗口交互器,用来提供鼠标按键等事件的交互机制,然后将事件的消息传送给vtkInteractorObserver或者其子类。

我们先使用一个程序:

#include<vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
#include <iostream>
using std::cout;
using std::endl;
#include <vtkSmartPointer.h>
#include <vtkPNGReader.h>
#include <vtkImageViewer2.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkCallbackCommand.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkInteractorStyleImage.h>void MywCallbackFunc(vtkObject*, unsigned long eid, void* clientdata, void *calldata)
{cout << "aaaaaaa "<<endl;
}int main(int argc, char* argv[])
{vtkSmartPointer<vtkPNGReader> reader = vtkSmartPointer<vtkPNGReader>::New();reader->SetFileName("timg.png");vtkSmartPointer<vtkImageViewer2> viewer = vtkSmartPointer<vtkImageViewer2>::New();viewer->SetInputConnection(reader->GetOutputPort());vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();viewer->SetupInteractor(interactor);viewer->Render();viewer->GetRenderer()->SetBackground(1.0, 1.0, 1.0);viewer->SetSize(640, 480);viewer->GetRenderWindow()->SetWindowName("ai jiao sha jiao sha");vtkSmartPointer<vtkCallbackCommand> mouseCallback =vtkSmartPointer<vtkCallbackCommand>::New();mouseCallback->SetCallback(MywCallbackFunc);interactor->SetRenderWindow(viewer->GetRenderWindow());interactor->AddObserver(vtkCommand::LeftButtonPressEvent, mouseCallback);vtkSmartPointer<vtkInteractorStyleImage> style =vtkSmartPointer<vtkInteractorStyleImage>::New();interactor->SetInteractorStyle(style);interactor->Initialize();interactor->Start();return EXIT_SUCCESS;
}

vtkRenderWindowInteractor在系统上创建与windows相关的子类对象(比如windows系统上与windows相关的子类,linux上与linux相关的子类),然后使用Start函数不断地从消息队列中获取消息,把获得的消息分发给回调函数,回调函数根据不同的消息来调用不同的响应消息函数,在每个响应函数通过vtkObject::InvokeEvent将平台相关的消息翻译为vtk事件,例如我们上面写的事件,会被翻译成类似onMousePressEvent这样的事件。

vtkInteractorStyle:

vtkObject::InvokeEvent()将各个VTK事件分发到不同的观察者中,观察者调用回调函数vtkInteractorStyle::ProcessEvents()处理不同的VTK事件,再将这些事件分发至vtkInteractorStyle的消息响应函数中,然后完成整个消息的传递。

VTK交互系统 2 交互器样式相关推荐

  1. VTK交互系统 1 交互模式入门

    在VTK中,交互一般使用 命令/观察者模式来进行交互,即观察者等待命令,一旦有命令触发,就去执行该交互函数. 有两种实现模式: 1. 设置回调函数   2. 继承command类,然后实现内部函数 我 ...

  2. 基于meanshift的手势跟踪与电脑鼠标控制(手势交互系统)

    基于meanshift的手势跟踪与电脑鼠标控制(手势交互系统) zouxy09@qq.com http://blog.csdn.net/zouxy09 一年多前开始接触计算机视觉这个领域的时候,年幼无 ...

  3. 交互系统的构建之(四)手掌与拳头检测加盟TLD

    交互系统的构建之(四)手掌与拳头检测加盟TLD zouxy09@qq.com http://blog.csdn.net/zouxy09 人机交互系统的构建之(一)http://blog.csdn.ne ...

  4. Qt - 驾校科目-考试系统-窗口交互

    Qt - 驾校科目-考试系统-窗口交互 如果登录成功 编译执行 这样子就能避免一闪而过(方法一) 编译执行也没有问题 内存分配方法(二) #ifndef EXANDIALOG_H #define EX ...

  5. SteamVR 2.x UGUI交互系统(7)

    之前的文章有介绍使用SteamVR_LaserPointer来直接实现UGUI交互,相信各位同学也会发现这种方式比较难受,还是摆脱不了UI要挂载Collider,不是完整的UGUI交互系统. 注意:S ...

  6. java毕业设计医疗病历交互系统Mybatis+系统+数据库+调试部署

    java毕业设计医疗病历交互系统Mybatis+系统+数据库+调试部署 java毕业设计医疗病历交互系统Mybatis+系统+数据库+调试部署 本源码技术栈: 项目架构:B/S架构 开发语言:Java ...

  7. 订单系统和前台系统的交互---预订单--订单--支付--登录?

    订单单点登录功能实现 导入shop-sso依赖 开启@EnableDubbo 配置yml文件中的dubbo服务 提供应用信息和zookeeper地址 拦截器和配置拦截器类 因为订单这个系统是没有登录页 ...

  8. 用户和计算机通信的界面设计,数据分析系统的交互界面设计

    摘要:针对位置敏感探测器件构成的数据分析系统,借助开发工具及MFC消息映射机制,实现系统交互界面的设计.界面通过对串口通信和USB通信方法的研究,利用按钮控件实现并控制上下位机数据通信:数据传输处理之 ...

  9. 《自己动手做交互系统》——2.3 制作过程

    本节书摘来异步社区<自己动手做交互系统>一书中的第2章,第2.3节,作者:徐皓祎,更多章节内容可以访问云栖社区"异步社区"公众号查看 2.3 制作过程 2.3.1 准备 ...

最新文章

  1. 深度学习原理与框架-CNN在文本分类的应用 1.tf.nn.embedding_lookup(根据索引数据从数据中取出数据) 2.saver.restore(加载sess参数)...
  2. 前端知识之HTML内容
  3. linux zip 命令详解
  4. windows redis sentinel install
  5. 默认析构函数与空析构函数并不完全等价
  6. ajax判断密码是否一致,jquery.validate ajax方式验证密码是否正确
  7. X~exponential 指数分布
  8. 【uniapp】swiper 自定义轮播图指示点
  9. 语言for循环联程_Lua循环
  10. python向上取整 向下取整
  11. 悲观锁定时如何避免可怕的死锁-以及Java 8的一些用法!
  12. mac 本地安装mysql_mac 本地安装mysql服务
  13. webpack——文件和图片打包
  14. 【本人秃顶程序员】Java程序员成长三部曲!
  15. python防反编译_linux python如何反编译成源码
  16. 前端实现用户自定义建表_Excel、SQL、Python分别实现行列转换
  17. mac上数据库管理工具Navicat Premium 连接mySQL
  18. Java项目中使用OpenOffice转PDF
  19. 基于BIM+3DGIS的智慧城市基础设施管理
  20. 图书信息管理系统C语言IPO,基于IPO的Python教学设计

热门文章

  1. 当3万座加油站遇到京东无人科技,3亿车主生活或迎新变化
  2. Centos7安装go1.14.4超级详细(两种安装方式)
  3. Python面向对象编程---多态
  4. python入门程序有趣例子_10 个最值得 Python 新人练手的有趣项目
  5. [转]告别写计划的烦恼!一页纸四步打造出一份牛逼的商业计划
  6. CHIL-ORACLE-修改
  7. HTML5开发APP页面(动效篇)
  8. java 判断是否是手机号码_Java工具类:(1)判断String是否为手机号码
  9. 冥想基础知识(总结于冥想相关书)
  10. 暑假期间,怎么保护好孩子的视力?盘点适合孩子用的护眼台灯