VTK草稿4

4.2 Using VTK Interactors

  • VTK提供了兩種和可視化結(jié)果互動(dòng)的方法:
    • 用系統(tǒng)自帶的vtkRenderWindowInteractor
    • 創(chuàng)建自己的Interactor,綁定一些事件在上面
  • 如果是用解釋性語(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:退出程序
    • ffly-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ì)解釋)
    • rreset座慰,沿著當(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里面引申為顯示在窗口中的物體。vtkActorvtkProp3D的一個(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è)子類:vtkActorvtkVolume巷怜,vtkVolume也從vtkProp3D中繼承了一系列操作position和orientation的方法葛超,此外,它也有自身的屬性設(shè)置vtkVolumeProperty延塑。(Volume這個(gè)詞的含義還需要探究绣张,有些資料里說是“體渲染” TODO) 下面是一個(gè)Volume的例子:
SimpleRayCast.py
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市关带,隨后出現(xiàn)的幾起案子侥涵,更是在濱河造成了極大的恐慌,老刑警劉巖宋雏,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芜飘,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡磨总,警方通過查閱死者的電腦和手機(jī)嗦明,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舍败,“玉大人招狸,你說我怎么就攤上這事×谑恚” “怎么了裙戏?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)厕诡。 經(jīng)常有香客問我累榜,道長(zhǎng),這世上最難降的妖魔是什么灵嫌? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任壹罚,我火速辦了婚禮,結(jié)果婚禮上寿羞,老公的妹妹穿的比我還像新娘猖凛。我一直安慰自己,他們只是感情好绪穆,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布辨泳。 她就那樣靜靜地躺著虱岂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪菠红。 梳的紋絲不亂的頭發(fā)上第岖,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音试溯,去河邊找鬼蔑滓。 笑死,一個(gè)胖子當(dāng)著我的面吹牛遇绞,可吹牛的內(nèi)容都是我干的键袱。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼摹闽,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼杠纵!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起钩骇,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎铝量,沒想到半個(gè)月后倘屹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡慢叨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年纽匙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拍谐。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡烛缔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出轩拨,到底是詐尸還是另有隱情践瓷,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布亡蓉,位于F島的核電站晕翠,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏砍濒。R本人自食惡果不足惜淋肾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望爸邢。 院中可真熱鬧樊卓,春花似錦、人聲如沸杠河。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至七扰,卻和暖如春奢赂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背颈走。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工膳灶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人立由。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓轧钓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親锐膜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子毕箍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)道盏,斷路器而柑,智...
    卡卡羅2017閱讀 134,715評(píng)論 18 139
  • 一、實(shí)驗(yàn)?zāi)康?學(xué)習(xí)使用 weka 中的常用分類器荷逞,完成數(shù)據(jù)分類任務(wù)媒咳。 二、實(shí)驗(yàn)內(nèi)容 了解 weka 中 explo...
    yigoh閱讀 8,570評(píng)論 5 4
  • 來源 https://zhuanlan.zhihu.com/p/24425116 給深度學(xué)習(xí)入門者的Python快...
    海浪java閱讀 5,811評(píng)論 0 40
  • =========================================================...
    高速路邊數(shù)車車閱讀 1,636評(píng)論 2 4
  • 真真來自農(nóng)村种远,一個(gè)天真無邪涩澡、內(nèi)向羞澀的女孩,這是外人眼中這個(gè)女孩的樣子坠敷。她一直避免和大家對(duì)視妙同,因?yàn)樗J(rèn)為自己的眼睛...
    秤心閱讀 349評(píng)論 0 0