王家林 王松
摘要:由于vtk在可视化软件开发中,其提供的交互器不能满足开发者的要求。基于vtk的各种交互类,提出自定义交互器的开发方法。利用vc++和MFC开发了基于vtk的可视化软件,并进行可视化操作。通过开发的交互器与vtk自带的交互器相比,结果得出,能够更加方便地操作视图,提高了对数据可视化的效率。
关键词:可视化;vtk;软件开发;MFC;交互器
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2015)14-0088-02
Abstract:Beacuase the vtks interactor do not meet the requirements of the developers during the visualization software development.Based on the vtks interactor,this paper delevelop user-defined interactor and utilize it.Compared user-defined interactor with the vtk own interactor,which show the user-defined is more convenient to manipilate interface and more efficient for dara visualization.
Key words:Visualization;vtk;software;MFC;Interactor
1 vtk简介
开源免费可视化工具包VTK[1,6],是目前最为流行的软件之一,并且具有强大的数据图形显示功能,优越的结构体系,优秀的移植性,是以OpenGL[2]图形库为基础开发的。目前VTK主要用于医学图像三维重建[3]和虚拟手术[4],也有国内学者[5]应用于桥梁建模。为了直接对数据操作,就需要良好的交互操作。但vtk软件提供的交互操作不能满足研究者的要求,不利于可视化程序的开发与应用。
图形(Graphic)模型指通过转换几何体而形成图像,达到显示对象的目的。图形模型包括了可视化渲染窗口类(vtkRenderWindow)、渲染器类(vtkRender)和交互器类(vtkRenderWindowInteractor)。它们可以在屏幕上显示可视化对象或角色并且进行交互操作。
可视化模型采用可视化管道机制(PipeLine)以源数据vtkSource为起点,经过过滤器(vtkFilter),最终到达可视化管道机制的终点—映射器(vtkMapper)。网络结构如图1。
2 vtk软件中交互式类的简介
vtkObject[7]在vtk软件中几乎是所有类的基类,拥有自动更新,调试,打印,事件回调等功能。vtkInteractorStyle继承于vtkObject,是所有交互方式的父类,并且拥有一些最简单的交互功能。由于操作需求的不同,在此类的基础上衍生了一部分交互类。部分交互类如下:
2.1 vtkInteractorStyle
vtkInteractorStyle是其他交互类的基类,提供了与交互器vtkRenderWindowInteractor的接口,能对事件进行响应。其提供了大量键盘事件进行响应的功能,但没有响应鼠标操作的功能。键盘操作包括如下部分:
1)按下键盘w键以线框方式显示物体
2)按下键盘p键拾取单个物体
3)按下键盘q或e键关闭应用程序以及其他键盘操作方式。
2.2 vtkInteractorStyleJoystickActor
vtkInteractorStyleJoystickActor开发了不同于父类的操作方式,能在视图中对某个独立的显示对象进行缩放、平移和旋转。缩放比例决定于鼠标位置与显示对象中心位置竖直方向的差。差为正时,角色放大,反之缩小。平移是变速移动,速度大小取决于鼠标与角色中心的相对距离。旋转时,角色绕其中心转动。此交互方式主要针对单个显示对象操作,并且操作不影响其他角色。
2.3 vtkInteractorStyleJoystickCamera
vtkInteractorStyleJoystickCamera类对相机进行操作,其并不能对单个对象操作,而是改变相机的位置,从不同角度来观察整个空间。同样,此类也可以实现基于相机变换的缩放,平移和旋转。通过所有显示对象的几何中心来确定平移和旋转中心。
2.4 vtkInteractorStyleSwitch
vtkInteractorStyleSwitch 类合并了四个交互类,通过按键j,t,c,a来切换不同的交互模式(vtkInteractoStylejoystickactorvtkInteractoStylejoystickcamera,vtkInteractoStyletrackballactor,vtkInteractoStyletrackballcamera)。能够自由切换四种交互方式,但四种交互方式效率并不高。
3 应用需求分析
在GUI应用开发中,对于图形交互有如下需求:
1) 平移:按下鼠标左键,通过移动鼠标实现显示对象跟随鼠标进行平行移动;
2) 缩放,通过鼠标滚轮的前后滚动实现显示对象的放大、缩小显示,或者通过弹出菜单切换到缩放模式后,通过鼠标的竖向坐标实现显示对象的缩放;
3)旋转,按下鼠标左键,通过移动鼠标实现显示对象绕窗口中心的旋转。
4) 矩形框,按下鼠标左键,同时移动鼠标,以鼠标按下左键的位置和当前位置的连线为对角线画一矩形框。
5) 窗选放大,按下鼠标左键并移动鼠标画一矩形框,根据矩形框与窗口的比例放大显示对象。
6) 点选对象,通过单击鼠标左键实现对显示对象的拾取。
7) 窗选对象,通过按下鼠标左键并移动鼠标画一矩形框,实现对矩形框内所有显示对象的拾取。
由于上述各项交互中,根据鼠标运动实现的交互行为有重叠之处,因此加入了利用弹出菜单进行交互模式切换的功能,见图2。
通过对VTK交互类的功能分析发现,没有一个类能够完全实现了所有的功能。因此,作者通过分析研究现有VTK交互类的实现方法,开发了一个具有前述各项功能的交互类。
3 软件的实现方法
MFC[9]是微软开发的一个基础的框架类,能够响应消息,创建控件来开发一些简单而实用的软件。以c++为基础,结合MFC与VTK共同开发一个可视化软件(VTKMFC),以此来现实本文开发的交互类。
本文开发的新型交互类vtkWInteractor以vtkInteractorStyle为基类,封装了以上各类的鼠标与键盘的响应函数。
3.1 功能函数的定义
作者设计的交互类vtkWInteractor中的功能函数取自其他交互类并在此基础上改进。各功能函数实现如下:
1)平移,取自vtkInteractorStyleJoystickCamera交互类的pan()函数。
2)缩放,取自vtkInteractorStyleJoystickCamera交互类的Dolly()函数。
3)旋转,取自vtkInteractorStyleJoystickCamera交互类的Rotate()函数。
4)矩形框,取自vtkInteractorStyleRubberBand2D交互类的RedrawRubberBand()函数。
5)窗选放大,取自vtkInteractorStyleRubberBandZoom交互类的Zoom()函数。
6)点选对象,取自vtkInteractorStyle交互类的OnCha-r()函数的一部分,vtkInteractorStyle以P键来拾取显示对象,而本文设计的vtkWInteractor根据鼠标左键单击时的位置来拾取对象。
7)窗选对象,根据vtkInteractorStyleRubberBand2D交互类的RedrawRubberBand()函数绘制矩形框,再用vtkAreaPicker类中的AreaPick函数对框内的显示对象进行拾取。
3.2 实例应用与效果展示
在vtk可视化管道中加入六面体(vtkCubeSource),在渲染窗口中显示,并在窗口中单击右键弹出菜单,应用界面如图2。
右键弹出菜单,依次选择操作方式,对窗口中的角色进行操作。仅凭鼠标右键、中键和右键就能够完成各种操作。操作方式类似于日常的电脑界面操作方式,所以使用者可以很快的熟悉。各种操作方式的效果如图3。
图中得到的操作画面能全视角的对物体进行观察,且窗选对象之后能够实现对物体本身的转化,但本文欠妥没能实现这一功能。
4 结束语
基于VTK自带交互类的缺点,开发更为通用且高效的交互类是很有必要的。本文对VTK自带交互类进行研究并 开发了新的交互类vtkWInteractor。从方法上给VTK进一步的研究带来启示,研究了如何快捷的继承VTK自带交互类的特点。并且基于VTK开发的vtkWInteractor类可以运用于今后的软件开发,通过加入新设计的交互类实现数据的可视化交互。
参考文献:
[1] 周振环, 肖汝. ITK和VTK及其应用新进展[J]. 计算机应用究, 2009, 26(6): 2027-2031.
[2] 王兰美, 赵继成, 秦华东. OpenGL及其在VC++下的开发应用[J]. 武汉大学学报: 工学版, 2006, 39(4): 62-65.
[3] 陈洁敏. 基于VTK的医学图像体绘制及交互实现[J]. 现代计算机: 专业版, 2009(8): 176-178.
[4] 王利, 姜红, 张兆臣, 等. 基于VTK的虚拟手术系统中的关键技术[J]. 中国医疗设备, 2009, 24(5): 58-59.
[5] 马林, 李兴田. 三维可视化方法研究与应用[J]. 兰州交通大学报, 2013, 32(6): 77-81.
[6] Will S, Martin K, Lorensen B.The Visualization Toolkit An Object-Oriented Approach To 3D Graphics[M]. 3rd ed. Kitware, 2002.
[7] Will Schroeder. The VTK Users Guide[M]. Kitware, 2002.
[8] 谢裕敏, 舒辉, 陈建敏, 等. MFC消息响应函数的逆向定位[J]. 计算机应用, 2009(5): 1393-1396.