王家林 王松
摘要:由于vtk在可視化軟件開發(fā)中,其提供的交互器不能滿足開發(fā)者的要求?;趘tk的各種交互類,提出自定義交互器的開發(fā)方法。利用vc++和MFC開發(fā)了基于vtk的可視化軟件,并進(jìn)行可視化操作。通過開發(fā)的交互器與vtk自帶的交互器相比,結(jié)果得出,能夠更加方便地操作視圖,提高了對數(shù)據(jù)可視化的效率。
關(guān)鍵詞:可視化;vtk;軟件開發(fā);MFC;交互器
中圖分類號:TP311 文獻(xiàn)標(biāo)識碼: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],是目前最為流行的軟件之一,并且具有強(qiáng)大的數(shù)據(jù)圖形顯示功能,優(yōu)越的結(jié)構(gòu)體系,優(yōu)秀的移植性,是以O(shè)penGL[2]圖形庫為基礎(chǔ)開發(fā)的。目前VTK主要用于醫(yī)學(xué)圖像三維重建[3]和虛擬手術(shù)[4],也有國內(nèi)學(xué)者[5]應(yīng)用于橋梁建模。為了直接對數(shù)據(jù)操作,就需要良好的交互操作。但vtk軟件提供的交互操作不能滿足研究者的要求,不利于可視化程序的開發(fā)與應(yīng)用。
圖形(Graphic)模型指通過轉(zhuǎn)換幾何體而形成圖像,達(dá)到顯示對象的目的。圖形模型包括了可視化渲染窗口類(vtkRenderWindow)、渲染器類(vtkRender)和交互器類(vtkRenderWindowInteractor)。它們可以在屏幕上顯示可視化對象或角色并且進(jìn)行交互操作。
可視化模型采用可視化管道機(jī)制(PipeLine)以源數(shù)據(jù)vtkSource為起點,經(jīng)過過濾器(vtkFilter),最終到達(dá)可視化管道機(jī)制的終點—映射器(vtkMapper)。網(wǎng)絡(luò)結(jié)構(gòu)如圖1。
2 vtk軟件中交互式類的簡介
vtkObject[7]在vtk軟件中幾乎是所有類的基類,擁有自動更新,調(diào)試,打印,事件回調(diào)等功能。vtkInteractorStyle繼承于vtkObject,是所有交互方式的父類,并且擁有一些最簡單的交互功能。由于操作需求的不同,在此類的基礎(chǔ)上衍生了一部分交互類。部分交互類如下:
2.1 vtkInteractorStyle
vtkInteractorStyle是其他交互類的基類,提供了與交互器vtkRenderWindowInteractor的接口,能對事件進(jìn)行響應(yīng)。其提供了大量鍵盤事件進(jìn)行響應(yīng)的功能,但沒有響應(yīng)鼠標(biāo)操作的功能。鍵盤操作包括如下部分:
1)按下鍵盤w鍵以線框方式顯示物體
2)按下鍵盤p鍵拾取單個物體
3)按下鍵盤q或e鍵關(guān)閉應(yīng)用程序以及其他鍵盤操作方式。
2.2 vtkInteractorStyleJoystickActor
vtkInteractorStyleJoystickActor開發(fā)了不同于父類的操作方式,能在視圖中對某個獨立的顯示對象進(jìn)行縮放、平移和旋轉(zhuǎn)??s放比例決定于鼠標(biāo)位置與顯示對象中心位置豎直方向的差。差為正時,角色放大,反之縮小。平移是變速移動,速度大小取決于鼠標(biāo)與角色中心的相對距離。旋轉(zhuǎn)時,角色繞其中心轉(zhuǎn)動。此交互方式主要針對單個顯示對象操作,并且操作不影響其他角色。
2.3 vtkInteractorStyleJoystickCamera
vtkInteractorStyleJoystickCamera類對相機(jī)進(jìn)行操作,其并不能對單個對象操作,而是改變相機(jī)的位置,從不同角度來觀察整個空間。同樣,此類也可以實現(xiàn)基于相機(jī)變換的縮放,平移和旋轉(zhuǎn)。通過所有顯示對象的幾何中心來確定平移和旋轉(zhuǎn)中心。
2.4 vtkInteractorStyleSwitch
vtkInteractorStyleSwitch 類合并了四個交互類,通過按鍵j,t,c,a來切換不同的交互模式(vtkInteractoStylejoystickactorvtkInteractoStylejoystickcamera,vtkInteractoStyletrackballactor,vtkInteractoStyletrackballcamera)。能夠自由切換四種交互方式,但四種交互方式效率并不高。
3 應(yīng)用需求分析
在GUI應(yīng)用開發(fā)中,對于圖形交互有如下需求:
1) 平移:按下鼠標(biāo)左鍵,通過移動鼠標(biāo)實現(xiàn)顯示對象跟隨鼠標(biāo)進(jìn)行平行移動;
2) 縮放,通過鼠標(biāo)滾輪的前后滾動實現(xiàn)顯示對象的放大、縮小顯示,或者通過彈出菜單切換到縮放模式后,通過鼠標(biāo)的豎向坐標(biāo)實現(xiàn)顯示對象的縮放;
3)旋轉(zhuǎn),按下鼠標(biāo)左鍵,通過移動鼠標(biāo)實現(xiàn)顯示對象繞窗口中心的旋轉(zhuǎn)。
4) 矩形框,按下鼠標(biāo)左鍵,同時移動鼠標(biāo),以鼠標(biāo)按下左鍵的位置和當(dāng)前位置的連線為對角線畫一矩形框。
5) 窗選放大,按下鼠標(biāo)左鍵并移動鼠標(biāo)畫一矩形框,根據(jù)矩形框與窗口的比例放大顯示對象。
6) 點選對象,通過單擊鼠標(biāo)左鍵實現(xiàn)對顯示對象的拾取。
7) 窗選對象,通過按下鼠標(biāo)左鍵并移動鼠標(biāo)畫一矩形框,實現(xiàn)對矩形框內(nèi)所有顯示對象的拾取。
由于上述各項交互中,根據(jù)鼠標(biāo)運動實現(xiàn)的交互行為有重疊之處,因此加入了利用彈出菜單進(jìn)行交互模式切換的功能,見圖2。
通過對VTK交互類的功能分析發(fā)現(xiàn),沒有一個類能夠完全實現(xiàn)了所有的功能。因此,作者通過分析研究現(xiàn)有VTK交互類的實現(xiàn)方法,開發(fā)了一個具有前述各項功能的交互類。
3 軟件的實現(xiàn)方法
MFC[9]是微軟開發(fā)的一個基礎(chǔ)的框架類,能夠響應(yīng)消息,創(chuàng)建控件來開發(fā)一些簡單而實用的軟件。以c++為基礎(chǔ),結(jié)合MFC與VTK共同開發(fā)一個可視化軟件(VTKMFC),以此來現(xiàn)實本文開發(fā)的交互類。
本文開發(fā)的新型交互類vtkWInteractor以vtkInteractorStyle為基類,封裝了以上各類的鼠標(biāo)與鍵盤的響應(yīng)函數(shù)。
3.1 功能函數(shù)的定義
作者設(shè)計的交互類vtkWInteractor中的功能函數(shù)取自其他交互類并在此基礎(chǔ)上改進(jìn)。各功能函數(shù)實現(xiàn)如下:
1)平移,取自vtkInteractorStyleJoystickCamera交互類的pan()函數(shù)。
2)縮放,取自vtkInteractorStyleJoystickCamera交互類的Dolly()函數(shù)。
3)旋轉(zhuǎn),取自vtkInteractorStyleJoystickCamera交互類的Rotate()函數(shù)。
4)矩形框,取自vtkInteractorStyleRubberBand2D交互類的RedrawRubberBand()函數(shù)。
5)窗選放大,取自vtkInteractorStyleRubberBandZoom交互類的Zoom()函數(shù)。
6)點選對象,取自vtkInteractorStyle交互類的OnCha-r()函數(shù)的一部分,vtkInteractorStyle以P鍵來拾取顯示對象,而本文設(shè)計的vtkWInteractor根據(jù)鼠標(biāo)左鍵單擊時的位置來拾取對象。
7)窗選對象,根據(jù)vtkInteractorStyleRubberBand2D交互類的RedrawRubberBand()函數(shù)繪制矩形框,再用vtkAreaPicker類中的AreaPick函數(shù)對框內(nèi)的顯示對象進(jìn)行拾取。
3.2 實例應(yīng)用與效果展示
在vtk可視化管道中加入六面體(vtkCubeSource),在渲染窗口中顯示,并在窗口中單擊右鍵彈出菜單,應(yīng)用界面如圖2。
右鍵彈出菜單,依次選擇操作方式,對窗口中的角色進(jìn)行操作。僅憑鼠標(biāo)右鍵、中鍵和右鍵就能夠完成各種操作。操作方式類似于日常的電腦界面操作方式,所以使用者可以很快的熟悉。各種操作方式的效果如圖3。
圖中得到的操作畫面能全視角的對物體進(jìn)行觀察,且窗選對象之后能夠?qū)崿F(xiàn)對物體本身的轉(zhuǎn)化,但本文欠妥沒能實現(xiàn)這一功能。
4 結(jié)束語
基于VTK自帶交互類的缺點,開發(fā)更為通用且高效的交互類是很有必要的。本文對VTK自帶交互類進(jìn)行研究并 開發(fā)了新的交互類vtkWInteractor。從方法上給VTK進(jìn)一步的研究帶來啟示,研究了如何快捷的繼承VTK自帶交互類的特點。并且基于VTK開發(fā)的vtkWInteractor類可以運用于今后的軟件開發(fā),通過加入新設(shè)計的交互類實現(xiàn)數(shù)據(jù)的可視化交互。
參考文獻(xiàn):
[1] 周振環(huán), 肖汝. ITK和VTK及其應(yīng)用新進(jìn)展[J]. 計算機(jī)應(yīng)用究, 2009, 26(6): 2027-2031.
[2] 王蘭美, 趙繼成, 秦華東. OpenGL及其在VC++下的開發(fā)應(yīng)用[J]. 武漢大學(xué)學(xué)報: 工學(xué)版, 2006, 39(4): 62-65.
[3] 陳潔敏. 基于VTK的醫(yī)學(xué)圖像體繪制及交互實現(xiàn)[J]. 現(xiàn)代計算機(jī): 專業(yè)版, 2009(8): 176-178.
[4] 王利, 姜紅, 張兆臣, 等. 基于VTK的虛擬手術(shù)系統(tǒng)中的關(guān)鍵技術(shù)[J]. 中國醫(yī)療設(shè)備, 2009, 24(5): 58-59.
[5] 馬林, 李興田. 三維可視化方法研究與應(yīng)用[J]. 蘭州交通大學(xué)報, 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消息響應(yīng)函數(shù)的逆向定位[J]. 計算機(jī)應(yīng)用, 2009(5): 1393-1396.