基于VTK User Guide和VTK Textbook学习
Vtk userguide
組織:分為三部分,parti通用介紹,如VTK安裝方法;part ii是核心部分,提供了大量的示例;partiii介紹高級應用,如何創建自己的類。
HOW TO USEVTK
vtk創建者和應用者。創建或修改必須熟悉C++,并且知悉VTK的編程約定;對于應用者可以從TCL,PYTHON,VB,JAVA,VC等中選擇自己熟悉的語言,但需熟悉VTK的對象接口及其關系。
ADDITIONRESOURCES
The Visualization ToolktAn Object-Oriented Approach to 3D Graphics(2rdEdition):該書詳細描述了VTK中的多個算法,數據結構等。
http://public.kitware.com/:提供有在線手冊,FAQ和用戶郵件列表等
http://public.kitware.com/VTK/doc/nightly/html:在線VTK文檔
http://www.barre.nom.fr/vtk/links.html:SebastienBarre的網站
Installation
Windows
直接下載安裝文件,執行setup.exe
安裝后文件包含5個部分:
vtkNNCore:用于Windows的VTKDLL
vtkNNCpp:用于VC++的文件和庫
vtkNNTcl:用于Tcl的文件和庫
vtkNNJava::用于Java的文件和庫
vtknnPython::用于Python的文件和庫
CMake:從源碼構建VTK的工具
源碼安裝
SystemOverview
對于VTK的系統的概述:介紹基本系統概念和對象模型抽象
VTK由兩個基本子系統構成:已編譯C++類庫和已解釋的封裝器用于其他語言,如Tcl,java,Python等
VTK本身是基于OO模型構建的,因此僅需理解主要對象就可以構建應用系統:圖形模型GraphicsModel和可視化模型Visualization Model
The GraphicsModel
下面是一些常用的核心對象:
vtkActor, vtkActor2D,vtkVolume--vtkProp和/或vtkProp3D的子類
vtkLight--燈光
vtkCamera--鏡頭,照相機
vtkProperty,vtkProperty2D--
vtkMapper,vtkMapper2D--vtkAbstractMapper的子類
vtkTransform--
vtkLookupTable,vtkColorTransferFunction--vtkScalarsToColors的子類
vtkRender
vtkRenderWindow
vtkRenderWindowInteractor
可以通過對上述對象的組合形成場景Scene。
Props表示在場景所見到的物體。三維場景中的通常是vtkProp3D對象,如vtkActor,vtkVolume等;二維場景中的則通常是vtkActor2D對象。
Props不能直接表示其幾何形狀,通過其相關的mappers表示。
Props還可以通過屬性對象控制其外觀,如顏色,燈光,繪制方式等。
Actors和Volumes具備內部轉換對象vtkTransform,其封裝了4*4的變換矩陣,可以調整其幾何參數(位置,朝向和縮放)。
燈光vtkLight對象用于設置場景中的燈源,只能用于3D場景。
相機對象vtkCamera控制3D物體如何投影成2D圖形。只在3D場景有必要設置。可以控制幾何參數以及投影方式:正交投影和透視投影。
繪圖器vtkMapper對象以及相關的查找表vtkLookupTable對象用于變換和繪制幾何圖形。mapper提供了可視化管道和圖形模型之間的接口。
渲染器vtkRenders對象和渲染窗口vtkRenderWindow對象用于管理圖形引擎和計算機視窗系統之間的接口。一個渲染窗口可以同時支持多個渲染器。渲染器作圖的區域即為視口viewport。
場景交互可以通過vtkRenderWindowInteractor對象完成。操作相機,拾取物體,激活用戶定義的方法,進入或退出透視投影以及設置actors的某些屬性。
上述描述的類通常都有特殊行為的子類,如vtkAssembly,vtkFollower,vtkLODActor均是vtkActor的子類。vtkAssembly允許層次式組織actors;vtkFollwer是一個總是面向指定相機的actor,尤其對于文本和廣告顯示是十分有用的;vtkLODActor是允許改變角色actors的幾何表示的actor
圖像數據ImageData:vtkImageData
矩陣線性數據RectilinearGrid:vtkRectilinearGrid,其數據組織形式是行列方向線性增長
結構化數據vtkStructuredGrid,無結構化數據點,多邊形數據vtkPolyData,無結構化柵格數據vtkUnstructuredGrid
圖形管道的作用是將圖形數據轉換成圖片。可視化管道的作用是將信息轉換成圖形數據。換句話說,就是可視化管道是用于構造幾何表達,而后經由圖形管道渲染。VTK使用數據流的形式轉換,其中涉及兩個基本對象:vtkDataObject和vtkProcessObject。
DataObject數據對象:
???表示不同類型的數據。數據的組織形式由vtkDataSet對象表示。由幾何和拓撲結構(點和穴)組成。
DataSet數據集:圖像數據ImageData:vtkImageData
矩陣線性數據Rectilinear Grid:vtkRectilinearGrid,其數據組織形式是行列方向線性增長
結構化數據vtkStructuredGrid,無結構化數據點,多邊形數據vtkPolyData,無結構化柵格數據vtkUnstructuredGrid
? 屬性數據:單個數據Scalar,3D方向和幅度Vector:(u, v,w);3D方向Normal:(nx, ny, nz), |n|=1,n維索引數據到文理的映射TextureCoordinate,n*n矩陣Tensor,陣列數據vtkFieldArray,其中每一列可以是不同類型的數據。
Cell:是點的拓撲組織,構成數據集的基本形式,用作點之間的插值信息。
處理對象vtkProcessObject:也稱作過濾器,濾波器,將已有數據處理形成新的數據。代表了系統所用的算法。Process和數據對象連接在一起形成可視化管道,即數據流網絡。
--------?????????--------??????????---------???????? --------
|Source?????????|????????|Filter????????|??????????|Filter???N???????|????????|Mapper?????? |
|?????????????????|--- | ???????????????|---??|??????????????????|---|??????????????|---------Graphics Interface
|DataObject???|?????????|Data Ojbect??|?????????? |DataObject????|?????????|?????????????? |
--------??????????--------??????????---------???????? --------
源Source對象:通過讀取文件或重構數據對象產生數據。
過濾器Filter:將輸入數據處理后生成新的數據,其中輸入或輸出數據可以單個,或多個Source object
繪圖器Mapper:位于圖形模型中,將數據轉成圖形數據(可由圖形引擎渲染)
Writer:是一種Mapper,可以將數據寫入文件或輸出流中。
| ? | ? |
<--------------------------------Update()方法的方向--------------------------------------------------
Source--->Filter---->Mapper------>Actor<-------------Render()
-------------------------------數據生成方向------------------------------------------->
通常不需手動激活Update()方法:濾波器是嵌入在可視化管道內
其中的Render方法經常用于初始化數據請求
Image Processing
VTK中2D和3D數據都稱作vtkImageData。
圖像數據對象是一個規則的,軸向組織的數組。
處理對象Process在管道中總是輸入和輸出圖像數據對象。
體繪制使用3D vtkImageData
幾乎所有的處理對象在圖像管道中都是多線程的,且有能力分段處理流數據(滿足用戶指定的內存限制)。
濾波器可以自動感知系統中的有效處理器的數目,并在執行過程中創建多線程,以及自動分割數據成片段。 VTK學習筆記5--創建應用程序 (2007-05-22 10:42:16)
| ? | ? |
User Methods, Observers, and Commands
Callback/User method:在VTK中使用Subject/Observer和Command設計模式。
vtkObject中的每個子類都具有AddObserver()方法,可以用于設置觀察者--捕獲對象的事件。
在其示例Examples程序中有不同語言的示例。
回調函數:
myCallback:public vtkCommand{
???static myCallback *New() {return new myCallback;}
???virtual void Execute(vtkObject *caller, unsigned long, void*callData){ cerr << "Starting toRender...n";}
};
通常在Execute中無需處理調用者對象。如用,則可以用類型重塑方法vtkRenderer::SafeDownCast(caller)。
不同語言之間的切換比較直接,因為類名和方法名稱都是相同的,不同的只是不同語言的語法。
VTK設計流程:讀取、產生數據--過濾--渲染--交互
VTK學習筆記6--事件管理 (2007-05-22 10:41:17)
| ? | ? |
Procedural Source Object:
Reader Source Object:
vtkRenderWindowInteractor:控制相機camera和角色actor;兩種交互模式:位置joystick和移動trackball。
Interactor可以支持同一窗口中的多個渲染器。
默認的按鍵:
j/t:開關控制joystick(位置)和trackball(移動)
c/a:開關控制camera(相機)和actor(對象)模式
Button1:旋轉相機,沿著focal point;或角色actor,沿著其原點
Button2:搖攝相機或平移角色
Button3:縮放相機或角色
3:開關控制場景立體模式。對于配備水晶眼LCD立體眼睛,需要激活SetStereoTypeToCrystalEyes()
e:退出應用程序
f:設定當前光標位置為焦點focal point
p:執行拾取操作。基于vtkPropPicker對象。
r:沿著當前視向復位相機。將actors移到中心位置,移動相機確保所有角色可見。
s:改變所有角色的表示成surfaces。
u:激活用戶自定義的方法。
w:改變所有角色的表示成wireframe。
可以自定義自己的類或者重新覆蓋這些默認的行為。
默認行為還具備激活燈源的作用,LightFollowCameraOn()方法使燈源和相機的位置與焦點同步,默認為頭燈headlight。
Interactor Styles
兩種截然不同的方法控制交互方式。
一、使用vtkInteractorStyle的子類對象。使用vtkRenderWindowInteractor::SetInteractorSytle(vtkInteractorSytleFlight::New())
二、直接管理事件循環。在Linux中可以使用vtkmm與GTKMM合成使用,必須基于gtkglextmm組件。?
VTK學習筆記7--數據過濾、相機控制 (2007-05-22 10:40:15)
| ? | ? |
如對于數據縮小濾波器可以使用vtkShrinkPolyData。
其中輸入源必須與輸出源類型兼容,但即使不兼容,可視化管道也能維持運行。
3D場景中會默認設定相機和燈光。
初始化相機
vtkCamera* cam1 = vtkCamera::New();
cam1->SetClippingRange(0.0475572,2.337786);??????????????//參數分別為沿著視向的近、遠剪切面的距離
cam1->SetFocalPoint(0.052665, -0.129454,-0.0573973);?????//焦點:世界坐標系,控制相機方向
cam1->SetPosition(0.327637, -0.116299,-0.256418);????????//位置:世界坐標系,設置相機位置
cam1->ComputeViewPlaneNormal();??????????????????????????//重置視平面法向,基于當前的位置和焦點。否則會出現斜推剪切效果
cam1->SetViewUp(-0.0225386, 0.999137,0.034901);????????//設置相機的“上”方向
ren1->SetActiveCamera(cam1);???????????????????????????? //設置渲染器的相機
設置已有的相機
cam1 =ren1->GetActiveCamera();???????????????????????? //獲取渲染器的相機
cam1->Zoom(1.4);????????????????????????????????????????????//放大相機,通過改變視角(SetViewAngle()),
另外,也可以使用Dolly()方法沿著視平面法向移動相機,實現放大或縮小可見角色物體。
基于焦點,使用Azimuth()和Elevation()方法設置相機的方位角和高度角/仰角(度,degree)[球坐標系統]。
注意其中在南極和北極存在奇異點,即視向量平行于視平面法向。此時可以使用OrthogonalizeViewUp()方法強制其正交。但這會改變相機坐標系統。
正交投影vs透視投影
vtkCamera::ParallelProjectionOn()開啟平行/正交投影。此時需通過SetParallelScale()方法控制角色物體的縮放。Zoom不再有效。
http://shenaodong.blogchina.com/viewdiary.15515438.html
VTK學習筆記8--燈源控制 (2007-05-22 10:38:08)
| ? | ? |
常用方法:
SetColor:設置RGB顏色
SetFocalPoint:設置焦點
SetPosition:設置位置
繪制器vtkRender::AddLight()方法加入燈源。
通常來說燈源的焦點和位置設置成相機一樣,即頭燈。
點光源設置:使用PositionalOn()方法,同時使用SetConeAngle()方法設置其覆蓋范圍,如設為180則無點源效果。
http://shenaodong.blogchina.com/viewdiary.15515463.html
VTK學習筆記9--Prop控制 (2007-05-22 10:35:56)
| ? | ? |
vtkActor是通過幾何圖元構成的prop,如多邊形和直線等。
SetPositon(x, y,z)--設置在世界坐標系中的位置
AddPosition(delaX, deltaY,deltaZ)--平移,沿著各個軸
RotateX(theta),RotateY(theta), RotateZ(theta)--分別沿著三個軸旋轉角度,單位為度degree
SetOrientation(x, y,z)--設置方向,先繞z軸旋轉,而后是x軸,而后是y軸
AddOrientation(a1, a2,a3)--增加方向量
RotateWXYZ(theta, x, y,z)--沿著給定的(x,y,z)向量旋轉theata角度
Scale(sx, sy,sz)--縮放
SetOrigin(x, y,z)--指定prop的原點。該點是作為其旋轉和縮放的參考點。
重點是要注意其中的變換順序,順序不同結果會不同。在VTK中,其變換順序是:
先平移到原點--縮放--繞Y軸旋轉--繞X軸旋轉--繞Z軸旋轉--在從原點恢復--平移
來源:http://shenaodong.blogchina.com/viewdiary.15515615.html
vtk學習筆記11--Picking拾取 (2007-05-22 10:35:15)
| ? | ? |
其返回的內容根據拾取的類型而定,可能是最簡單的全局坐標,或者是穴,單元格,點,參數坐標,vtkProp,組裝路徑等。
拾取語法:Pick(SelectionX,selectionY, selectionZ,Renderer)其中Renderer中的actor都有可能被選擇。
通常,selectionZ設置成0.0。當然,典型的用法是不必直接調用上述方法,而是通過vtkRenderWindowInteractor管理拾取操作。 VTK學習筆記10--Actor角色/演員 (2007-05-22 10:31:18)
| 標簽:科學? | ? |
定義幾何體:演員的幾何形狀是由SetMapper()方法確定。如
vtkPolyDataMapper* mapper = vtkPolyDataMapper::New();
mapper->setInput(aFilter->GetOutput());
vtkActor* actor = vtkActor::New();
actor->SetMapper(mapper);
上述的mapper使用分析圖元如點,線,多邊形和三角面片繪制幾何體。mapper是可視化管道的終點,也是可視化管道和圖形管道的橋梁。
ACTOR Properties:演員提供vtkProperty的實例,其控制actor的表現、外觀。
具體有顏色,表示[點,線框,面],光影模式[平面,Gouraud],透明度[相對透明度],環境,漫反射,鏡面反射顏色等。
Actor color:其分量值為[0,1]
可以使用SetColor()直接設定;也可以分別設定環境,漫反射,鏡面反射顏色。
注意:顏色設置僅當actor的mapper中沒有標量數據時才有效。默認mapper輸入標量數據顏色設置actor時,actor的顏色被忽略。
可以通過忽略標量數據ScalarVisibilityOff()方法。
透明度設置:需要考慮渲染順序。可以使用深度排序濾波器vtkDepthSortPolyData沿著視向將多邊形排序。
組裝:可以使用vtkAssembly將多個部件組裝后形成一個新的整體。AddPart()方法加入新的部分(actor演員)。其中組裝體不能設置屬性,必須尤其部分設定。
Volumes:vtkVolume用于體繪制。類似于vtkActor。其相關的屬性對象類型為vtkVolumeProperty。
總結
以上是生活随笔為你收集整理的基于VTK User Guide和VTK Textbook学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GPB | 陈润生/何顺民团队发布新版S
- 下一篇: 监督学习 | 决策树之网络搜索