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

VTK交互系统 3 自定义交互器样式

我觉得还是从头到尾教大家写一个交互器样式比较好,而不是直接列上一大堆程序。

可能一节到两节就能写完了,因为内容也不复杂。

首先我们把之前写好的数组显示vtk程序放上,我们在它的基础上添加自己想要等功能。

#include<vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
#include <vtkImageImport.h>
#include <vtkSmartPointer.h>
#include <vtkRenderer.h>
#include <vtkImageActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <iostream>
using std::cout;
using std::endl;
#include <vtkInteractorStyleImage.h>


int main(int argc, char *argv[])
{

	vtkSmartPointer<vtkImageImport>imageImport = 
		vtkSmartPointer<vtkImageImport>::New();
	vtkSmartPointer<vtkRenderer>sceneRenderer = 
		vtkSmartPointer<vtkRenderer>::New();
	vtkSmartPointer<vtkImageActor>imageActor = 
		vtkSmartPointer<vtkImageActor>::New();
	vtkSmartPointer<vtkRenderWindow>renderWindow = 
		vtkSmartPointer<vtkRenderWindow>::New();
	vtkSmartPointer<vtkRenderWindowInteractor> interactor = 
		vtkSmartPointer<vtkRenderWindowInteractor>::New();

	renderWindow->SetSize(600,600);
	sceneRenderer->SetBackground(0.8, 0.0, 0.0);
	renderWindow->AddRenderer(sceneRenderer);	
	sceneRenderer->AddActor(imageActor);
	//renderWindow->SetMultiSamples(0);
	interactor->SetRenderWindow(renderWindow);


	int width = 512;//(renderWindow->GetSize())[0];
	int height = 512;//(renderWindow->GetSize())[1];
	//cout << width << "  " << height<<endl;
	
	const int Size = width* height * 3 * sizeof(unsigned char);
	unsigned char* m_pPixels = (unsigned char*)malloc(Size);

	for (int i = 0;i<width;i++){
		for (int j = 0;j < height;j+=1) {
			m_pPixels[(i*width + j) * 3] = 0;
			m_pPixels[(i*width + j) * 3 + 1] = 255;
			m_pPixels[(i*width + j) * 3 + 2] = 0;
		}
	}
	for (int i = 0;i<20;i++) {
		for (int j = 0;j < 20;j += 1) {
			m_pPixels[(i*width + j) * 3] = 0;
			m_pPixels[(i*width + j) * 3 + 1] = 0;
			m_pPixels[(i*width + j) * 3 + 2] = 255;
		}
	}
	for (int i = 40;i<60;i++) {
		for (int j = 0;j < 20;j += 1) {
			m_pPixels[(i*width + j) * 3] = 0;
			m_pPixels[(i*width + j) * 3 + 1] = 0;
			m_pPixels[(i*width + j) * 3 + 2] = 255;
		}
	}
	imageImport->SetImportVoidPointer(m_pPixels);
	//imageImport->SetDataOrigin(-0.5f * (float)width, -0.5f * (float)height, 0);
	imageImport->SetWholeExtent(0, width - 1, 0, height - 1, 0, 0);
	imageImport->UpdateWholeExtent();
	imageImport->SetDataExtentToWholeExtent();
	imageImport->SetDataScalarTypeToUnsignedChar();
	imageImport->SetNumberOfScalarComponents(3);
	imageImport->Update();
	


	imageActor->SetInputData(imageImport->GetOutput());
	renderWindow->Render();
	interactor->Start();


	return EXIT_SUCCESS;

}

这个工程是没有交互器样式的,所以它用的是默认样式。在这里我们开始自定义。

现在,我们加入头文件。

#include <vtkInteractorStyleImage.h>
#include <vtkInteractorStyleUser.h>
#include <vtkObjectFactory.h>

然后定义一个类:

class my3DCameraStyle : public vtkInteractorStyleUser
{
public:
	static my3DCameraStyle* New();
	vtkTypeMacro(my3DCameraStyle, vtkInteractorStyleUser);

	virtual void OnLeftButtonDown(void);
	virtual void OnLeftButtonUp(void);
	virtual void OnRightButtonDown(void);
	virtual void OnRightButtonUp(void);
	virtual void OnMiddleButtonDown(void);
	virtual void OnMiddleButtonUp(void);
	virtual void OnMouseWheelForward(void);
	virtual void OnMouseWheelBackward(void);
	virtual void OnMouseMove(void);

	int m_OldPos[2];
	int m_NewPos[2];
};

这个类主要就是实现一些虚函数,里面的m_OldPos和m_NewPos是代表鼠标点击的时候和移动的时候用来记录点击位置和移动后的位置,来计算点击然后移动的距离的。这是自己定义的。

然后我们再在主程序里添加:

	vtkSmartPointer<my3DCameraStyle> style =
		vtkSmartPointer<my3DCameraStyle>::New();

	interactor->SetInteractorStyle(style);

创建交互器样式,并把交互器样式添加到窗口交互器中。

然后开始实现类里面的函数:

vtkStandardNewMacro(my3DCameraStyle);//必须加!!!!
void my3DCameraStyle::OnLeftButtonDown(void)
{
	vtkInteractorStyleUser::OnLeftButtonDown();

}

void my3DCameraStyle::OnLeftButtonUp(void)
{
	vtkInteractorStyleUser::OnLeftButtonUp();

}

void my3DCameraStyle::OnRightButtonDown(void)
{
	vtkInteractorStyleUser::OnRightButtonDown();

}

void my3DCameraStyle::OnRightButtonUp(void)
{
	vtkInteractorStyleUser::OnRightButtonUp();

}

void my3DCameraStyle::OnMiddleButtonDown(void)
{
	vtkInteractorStyleUser::OnMiddleButtonDown();


}

void my3DCameraStyle::OnMiddleButtonUp(void)
{
	vtkInteractorStyleUser::OnMiddleButtonUp();


}

void my3DCameraStyle::OnMouseWheelForward(void)
{
	vtkInteractorStyleUser::OnMouseWheelForward();

};

void my3DCameraStyle::OnMouseWheelBackward(void)
{
	vtkInteractorStyleUser::OnMouseWheelBackward();

};

void my3DCameraStyle::OnMouseMove(void)
{
	// Forward events
	vtkInteractorStyleUser::OnMouseMove();

}

先不实现任何功能,只是先把函数定义一下。

注意第一句的 vtkStandardNewMacro(my3DCameraStyle); 必须要加上,要让vtk的智能指针知道我们创建的这个变量属于被创建对象的New(),否则会报错。

现在编译一下,能通过。说明我们的交互器没有问题了。下一节开始设计功能。

相关文章:

  • VTK交互系统 4 自定义交互器样式2 键盘鼠标交互器设置
  • Qt多线程1
  • Qt多线程2
  • 基于QT的文件管理软件编写 系列 引言
  • 基于QT的文件管理软件编写 系列 1
  • python安装tensorflow
  • 机器学习之 Keras默认数据集/模型存放位置
  • 从零开始写出分而治之查找最大子列表的算法
  • 学机器学习必备的一些python句法基础 1 列表 元组 字典 条件语句
  • 学机器学习必备的一些python句法基础 2 循环
  • 学机器学习必备的一些python句法基础 3 函数 内建函数 模块 包 全局局部变量
  • 学机器学习必备的一些python句法基础 4 Python类和对象
  • 学机器学习必备的一些python句法基础 5 文件读写
  • 算法 后缀表达式计算加减乘除
  • 算法题分析 出入栈问题
  • ES6指北【2】—— 箭头函数
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • E-HPC支持多队列管理和自动伸缩
  • Java|序列化异常StreamCorruptedException的解决方法
  • JavaScript标准库系列——Math对象和Date对象(二)
  • js递归,无限分级树形折叠菜单
  • uva 10370 Above Average
  • vue学习系列(二)vue-cli
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 经典排序算法及其 Java 实现
  • 开发基于以太坊智能合约的DApp
  • 普通函数和构造函数的区别
  • 前端工程化(Gulp、Webpack)-webpack
  • 使用putty远程连接linux
  • - 转 Ext2.0 form使用实例
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • !!java web学习笔记(一到五)
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (rabbitmq的高级特性)消息可靠性
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)计算机毕业设计高校学生选课系统
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (十)T检验-第一部分
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (算法)Travel Information Center
  • .NET : 在VS2008中计算代码度量值
  • .net core webapi 大文件上传到wwwroot文件夹
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • .Net语言中的StringBuilder:入门到精通
  • @Autowired多个相同类型bean装配问题
  • [ vulhub漏洞复现篇 ] Celery <4.0 Redis未授权访问+Pickle反序列化利用
  • [ 蓝桥杯Web真题 ]-Markdown 文档解析
  • []利用定点式具实现:文件读取,完成不同进制之间的
  • [20190416]完善shared latch测试脚本2.txt
  • [bbk5179]第66集 第7章 - 数据库的维护 03
  • [cocos2d-x]关于CC_CALLBACK
  • [EFI]Lenovo ThinkPad X280电脑 Hackintosh 黑苹果引导文件