当前位置: 首页 > news >正文

VTK交互系统 2 交互器样式

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

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交互系统 3 自定义交互器样式
  • VTK交互系统 4 自定义交互器样式2 键盘鼠标交互器设置
  • Qt多线程1
  • Qt多线程2
  • 基于QT的文件管理软件编写 系列 引言
  • 基于QT的文件管理软件编写 系列 1
  • python安装tensorflow
  • 机器学习之 Keras默认数据集/模型存放位置
  • 从零开始写出分而治之查找最大子列表的算法
  • 学机器学习必备的一些python句法基础 1 列表 元组 字典 条件语句
  • 学机器学习必备的一些python句法基础 2 循环
  • 学机器学习必备的一些python句法基础 3 函数 内建函数 模块 包 全局局部变量
  • 学机器学习必备的一些python句法基础 4 Python类和对象
  • 学机器学习必备的一些python句法基础 5 文件读写
  • 算法 后缀表达式计算加减乘除
  • 【RocksDB】TransactionDB源码分析
  • Babel配置的不完全指南
  • C学习-枚举(九)
  • Java多态
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • Leetcode 27 Remove Element
  • Linux链接文件
  • Python进阶细节
  • socket.io+express实现聊天室的思考(三)
  • Vue 2.3、2.4 知识点小结
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 给初学者:JavaScript 中数组操作注意点
  • 工程优化暨babel升级小记
  • 数据科学 第 3 章 11 字符串处理
  • 听说你叫Java(二)–Servlet请求
  • 我的面试准备过程--容器(更新中)
  • 延迟脚本的方式
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • scrapy中间件源码分析及常用中间件大全
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​如何防止网络攻击?
  • # 飞书APP集成平台-数字化落地
  • #、%和$符号在OGNL表达式中经常出现
  • #laravel 通过手动安装依赖PHPExcel#
  • (2020)Java后端开发----(面试题和笔试题)
  • (4) PIVOT 和 UPIVOT 的使用
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (全注解开发)学习Spring-MVC的第三天
  • (十六)一篇文章学会Java的常用API
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET Framework 4.6.2改进了WPF和安全性
  • .NET Standard 的管理策略
  • .net 程序发生了一个不可捕获的异常
  • .NET 设计一套高性能的弱事件机制
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET企业级应用架构设计系列之结尾篇
  • /使用匿名内部类来复写Handler当中的handlerMessage()方法