4.2 Using VTK Interactors
- VTK提供了兩種和可視化結(jié)果互動(dòng)的方法:
- 用系統(tǒng)自帶的
vtkRenderWindowInteractor
- 創(chuàng)建自己的Interactor,綁定一些事件在上面
- 用系統(tǒng)自帶的
- 如果是用解釋性語(yǔ)言(python, tcl)編寫的程序膘融,還可以在運(yùn)行時(shí)敲入命令來交互嚎尤。
vtkRenderWindowInteractor
- 最簡(jiǎn)單的和可視化數(shù)據(jù)交互的方式就是例化一個(gè)
vtkRenderWindowInteractor
踢关,這個(gè)類有一些事先設(shè)定好的事件(event)和動(dòng)作(action)勺馆,并且可以被override。它可以控制camera和actor拗秘,由兩種交互風(fēng)格(interaction style):- position sensitive (joystick mode) 操縱桿模式
- motion sensitive (trackball mode) 軌跡球模式
-
vtkRenderWindowInteractor
支持以下事件:- j / t : j是切換到joystick mode, t是切換到trackball mode圣絮。joystick模式下,鼠標(biāo)在顯示窗口中按住雕旨,動(dòng)作就會(huì)持續(xù)發(fā)生扮匠;trackball模式下,鼠標(biāo)按下并且拖動(dòng)鼠標(biāo)凡涩,動(dòng)作才會(huì)發(fā)生棒搜。
- c / a : c是切換到camera控制,a是切換到actor控制活箕。
- 鼠標(biāo)左鍵:旋轉(zhuǎn)
- 鼠標(biāo)中鍵:拖動(dòng)
- 鼠標(biāo)右鍵:縮放
- 3:切換到紅藍(lán)3D顯示力麸,戴上紅藍(lán)眼鏡能看到3D效果
- e:退出程序
- f:fly-to the point under the cursor,個(gè)人測(cè)試下來覺得是將物體以鼠標(biāo)當(dāng)前位置為中心顯示出來育韩。
-
p:進(jìn)行pick操作克蚂,
vtkRenderWindowInteractor
有一個(gè)內(nèi)置的vtkPropPicker
成員用來執(zhí)行pick操作。(pick的含義在后文會(huì)解釋) - r:reset座慰,沿著當(dāng)前的視角方向重置camera視角陨舱,將actor放置在中心,重置camera使得所有的actor都能顯示出來版仔。
- s:使所有的actors都以surface的形式顯示
- u:在解釋型語(yǔ)言中游盲,按u來輸入用戶指令。
- w:使所有的actors都以wireframe的形式顯示
wireframe
surface
4.3 Filtering Data
之前的例子都是source object直接連入mapper object蛮粮,中間沒有filters益缎。filters的連接是通過SetInput()
和GetOutput()
方法。
這里舉的一個(gè)例子就是在之前的例子中加入了一個(gè)filter然想。核心的代碼如下:
// set filter
vtkShrinkPolyData shrink = vtkShrinkPolyData::New();
shrink->SetInput(part->GetOutput());
shrink->SetShrinkFactor(0.85);
// set Mapper
vtkPolyDataMapper partMapper = vtkPolyDataMapper::New();
partMapper->SetInput(shrink->GetOutput());
由于vtk這個(gè)例子只有python和tcl的版本莺奔,這里我就偷懶直接用python腳本運(yùn)行了,要用vtk的python wrapper变泄,可以用$VTK_BUILD/bin/vtkpython令哟,在/usr/local/bin中也有vtkpython恼琼,但不知道為何顯示import vtk
失敗,可能是環(huán)境變量沒有配置好屏富,不過在vtk安裝目錄下的那個(gè)是可以用的晴竞,運(yùn)行結(jié)果如下:
shrink filter
這個(gè)shrink filter的含義從字面上沒法理解,有待進(jìn)一步研究……
4.4 Controlling The Camera
- 有兩種方式來操控camera:
- 先例化camrea狠半,再設(shè)置給renderer
vtkCamera cam1 = vtkCamera::New();
cam1->... // 設(shè)置cam1的屬性
vtkRenderer ren1 = vtkRenderer::New();
ren1->SetActiveCamera(cam1);
- 從renderer中得到默認(rèn)的camera噩死,對(duì)其進(jìn)行屬性設(shè)置
cam1 = ren1->GetActiveCamera();
cam1->... // 設(shè)置cam1屬性
- camera的屬性設(shè)置在使用時(shí)才有體會(huì),這個(gè)在日后的使用中可以逐漸學(xué)習(xí)神年。
4.5 Controlling Lights
- Light比camera更容易控制已维,常見的幾個(gè)方法是
SetPosition()
,SetFocalPoint()
,SetColor()
。默認(rèn)情況下已日,vtkLight
是一個(gè)平行光源垛耳,即光源在無限遠(yuǎn)的位置,投射在物體上的光線是平行的捂敌。 - 常用的Light設(shè)置為headlight艾扮,即light和camera的位置、焦點(diǎn)都一致占婉。
4.6 Controlling 3D Props
- Prop這個(gè)詞本意是舞臺(tái)上的道具泡嘴,在VTK里面引申為顯示在窗口中的物體。
vtkActor
是vtkProp3D
的一個(gè)子類逆济,它的幾何構(gòu)成由多邊形和連線確定酌予。
vtkProp3D的位置
- 我們已經(jīng)看過如何控制camera來改變物體的顯示。同樣的奖慌,我們可以保持camera不變抛虫,直接控制Prop:
-
SetPosition(x, y, z)
:在世界坐標(biāo)系(world coordinate)中指定vtkProp3D
的位置。 -
AddPosition(x, y, z)
:Translate the Prop. -
RotateX(theta)
,RotateY(theta)
,RotateZ(theta)
简僧,繞坐標(biāo)軸旋轉(zhuǎn)theta角度建椰。 -
SetOrientation(x, y, z)
:指定Prop的朝向,先調(diào)整Z軸岛马,其次X棉姐,最后Y軸。 -
AddOrientation(x, y, z)
:在現(xiàn)有的朝向上增加角度啦逆。 -
RotateWXYZ(theta, x, y, z)
:以指定的xyz向量旋轉(zhuǎn)Prop theta角度伞矩。 -
Scale(sx, sy, sz)
:在xyz軸上調(diào)整Prop的大小。 -
SetOrigin(x, y, z)
:設(shè)置Prop的原點(diǎn)夏志,Prop的旋轉(zhuǎn)和放大都是圍繞著Origin操作的乃坤。
-
- 最重要的一點(diǎn):上述這些操作在VTK中是以一個(gè)固定的順序執(zhí)行的:
Shift to Origin -> Scale -> Rotate Y -> Rotate X -> Rotate X -> Shift from Origin -> Translate
- 不同的操作順序?qū)е碌慕Y(jié)果會(huì)大相徑庭。
Actors
- Actors是最常用的
vtkProp3D
子類,它把一系列的渲染屬性例如表面屬性(e.g. 反射光照)湿诊,表現(xiàn)方式(e.g. surface模式/wireframe模式)狱杰,材質(zhì)貼圖等集合在一起。(class的作用) - 定義Geometry數(shù)據(jù)來源用
SetMapper()
方法厅须,之前已經(jīng)見過多次浦旱。Mapper是連接Visualization pipeline和Graphics pipeline的橋梁。 -
vtkProperty
的class控制著Actor的屬性九杂,和camera一樣,可以先例化再賦值(actor->SetProperty(property)
)宣蠕,或者先得到再寫屬性(actor->GetProperty()
)例隆。 - 顏色可能是actor最重要的屬性。
SetColor(doule r, double g, double b)
抢蚀,rgb的值都在[0, 1]的范圍內(nèi)镀层。也可以分別設(shè)置Ambient/Diffuse/Specular的顏色。 - Actor的透明度可以設(shè)置皿曲,尤其在需要看到內(nèi)部結(jié)構(gòu)的時(shí)候有用唱逢。
actor->GetProperty()->SetOpacity(double opacity);
。透明度的渲染是用了α-blending的方法屋休,所以當(dāng)有多個(gè)透明actor時(shí)坞古,渲染的順序尤為重要,最好是把透明的actor放在渲染列表的最后(這一段現(xiàn)在還不是很理解 TODO)
Level-Of-Detail Actors
- 加入了interactor之后劫樟,它會(huì)自動(dòng)控制顯示的幀率痪枫,在運(yùn)動(dòng)時(shí)以高幀率/低分辨率顯示,在靜止時(shí)以低幀率/高分辨率顯示
Assemblies
- Actors可以被組合成有層次的集合叠艳,當(dāng)assembly中一個(gè)actor運(yùn)動(dòng)的時(shí)候奶陈,其他actor也會(huì)隨之而動(dòng)。例如機(jī)器人的手臂可能由上臂附较、小臂吃粒、手腕、手構(gòu)成拒课,他們之間通過joint連接徐勃,而上臂繞著肩膀旋轉(zhuǎn)時(shí),下面的部分也應(yīng)該跟著旋轉(zhuǎn)捕发。這時(shí)就可以用到Assembly疏旨,它也是
vtkActor
的一個(gè)子類。
cone + cylinder + cube + sphere 構(gòu)成的 assembly
-
vtkAssembly
盡管是vtkActor
的子類扎酷,但它并沒有自身的Property和Mapper檐涝,只能設(shè)置它的Position信息。因此Assembly內(nèi)部的元素必須自身包含了各自的屬性和連接的Mapper。 - Assembly可以層級(jí)包含谁榜,在最后renderer中
AddActor()
時(shí)只需要添加最外圍的Assembly幅聘,里面的各個(gè)元素包括內(nèi)部的小Assembly會(huì)遞歸渲染。一個(gè)actor可以被包含在多個(gè)Assembly中窃植,只要不出現(xiàn)自身包含自身的情況即可帝蒿。
Volumes
- 回憶上一章中,
vtkProp3D
主要有兩個(gè)子類:vtkActor
和vtkVolume
巷怜,vtkVolume
也從vtkProp3D
中繼承了一系列操作position和orientation的方法葛超,此外,它也有自身的屬性設(shè)置vtkVolumeProperty
延塑。(Volume這個(gè)詞的含義還需要探究绣张,有些資料里說是“體渲染” TODO) 下面是一個(gè)Volume的例子:
SimpleRayCast.py