VTK资料收集
使用Qt Creator開發VTK
原文鏈接:http://blog.csdn.net/numit/article/details/10200507
VTK應用系列:非常強大!非常善良
05-VTK在圖像處理中的應用(1)
原文鏈接:http://blog.csdn.net/www_doling_net/article/details/8541534VTK概述
原文鏈接:http://blog.csdn.net/numit/article/details/11619069?VTK(visualization toolkit),直譯為可視化工具包,主要用于醫學圖像重建,帶有部分圖像處理功能。屬于科學性數據分析三維成像的函數庫。
1.1 ? vtk歷史:
? ? ? ? VTK最早是作為Prentice Hall出版的"TheVisualization Toolkit: An Object-Oriented Approach to 3DGraphics"一書的附件釋出,該書及其軟件是由奇異研發部Corporate R&D的三位研究人員:WillSchroeder、Ken Martin與Bill Lorensen用其閑暇時間合作。主要用于三維計算機圖形學、圖像處理和可視化。
1.2 ? vtk簡介:
? ? ? ? Vtk是在面向對象原理的基礎上設計和實現的,它的內核是用C++構建的,包含有大約250,000行代碼,2000多個類,還包含有幾個轉換界面,因此也可以自由的通過Java,Tcl/Tk和Python各種語言使用vtk。
? ? ? ?雖然vtk被NA-Mic(美國國家醫學影像計算聯盟)列為關鍵計算工具,vtk在醫學核試驗的研究中也起到重大作用,但是vtk也運用于其他領域,地理信息,建筑學,氣象學,航空航天等領域的逼真三維效果圖的實現也都能用vtk解決。
1.3 ?與其他三維引擎對比:
? ? ? vtk 更加靈活,封裝了c++和OpenGL的代碼,簡化編程。當vtk需要精確實現曲面時也需要用到OpenGL及c++完善效果。和其他三維引擎繪圖不同的是更加注重對數據分析處理后的可視化,而osg,ogre等都是基于場景的繪制。Vtk主要用于科學計算可視化領域,osg主要用于虛擬現實領域。
2 vtk流程
vtk模式是基于pipeline設計模式,流線型執行數據流。
Two segment:可視化管線和圖形化管線
可視化管線:source->[多個filter]形象的說是數據在可視化管線中流動,然后用圖顯示出數據信息。數據以原始的形式變換成圖元形式(vtk內部定義的數據結構,形成數據集)最后以圖形形式表現。
圖形化管線:actor(prop對象的子類)->render->renderWindow->renderWindowInteractor
? ? ?可視化管線輸出的是可被繪制的幾何體,圖形模型主要是對幾何體進行繪制,需要一個接口將兩個管線連接起來,就是mapper對象。
4 ?vtk簡單對象
vtk的數據處理方式將數據分為數據對象和處理對象。
其中源對象、過濾器對象(可選)、映射器對象?、繪制器對象、繪制窗口為處理對象,?Props對象為數據對象(vtk中數據都是由數據對象表示的,數據對象是數據的集合),映射器對象是可視化模型和圖形模型的接口。
1、源對象
?????? 數據生成的源頭,數據來源主要包括從磁盤讀取數據文件,如VTK所支持的各種格式文件生成數據源對象,這種源對象被稱為讀源對象,或者利用數學方法生成源對象,如利用多個四邊形構建一個圓柱體,這種對象被稱為程序源對象。
2、過濾器對象
????? 對源對象進行處理,生成新的數據集輸出。
3、映射器對象
???? 映射器對象主要作用是將可視化模型生成的數據轉換到圖形模型進行繪制,或者以磁盤文件的形式進行輸出。
5 ?演示例子
[cpp] view plaincopyprint?#include<vtkSmartPointer.h> #include<vtkCylinderSource.h> #include<vtkPolyDataMapper.h> #include<vtkActor.h> #include<vtkProperty.h> #include<vtkRenderer.h> #include<vtkRenderWindow.h> #include<vtkRenderWindowInteractor.h> int main(int, char *[]) { vtkSmartPointer<vtkCylinderSource>source = vtkSmartPointer<vtkCylinderSource>::New();//創建一個source對象 source->SetResolution(16); //設置source屬性 source->Update(); vtkSmartPointer<vtkPolyDataMapper>mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); //創建映射對象 mapper->SetInputConnection(source->GetOutputPort()); //將source的流出變成mapper的流入 vtkSmartPointer<vtkActor>cylinder = vtkSmartPointer<vtkActor>::New(); //創建一個演員對象 cylinder->SetMapper(mapper); //設置演員對象的屬性 cylinder->SetPosition(10,2,4); cylinder->GetProperty()->SetColor(1,1,0); cylinder->RotateWXYZ(30,1,1,1); vtkSmartPointer<vtkRenderer>render = //創建渲染對象 vtkSmartPointer<vtkRenderer>::New(); vtkSmartPointer<vtkRenderWindow>renwin = //創建渲染窗口 vtkSmartPointer<vtkRenderWindow>::New(); renwin->AddRenderer(render); //在渲染窗口添加渲染場景。一個窗口可以添加多個場景 vtkSmartPointer<vtkRenderWindowInteractor>iren = vtkSmartPointer<vtkRenderWindowInteractor>::New(); render->AddActor(cylinder); //在渲染對象上添加actor或其他prop(比如相機,光照) iren->SetRenderWindow(renwin); //將渲染窗口設置交互屬性對象 renwin->Render(); //啟動渲染 iren->Start(); //啟動交互 returnEXIT_SUCCESS; }
6 ? vtk可視化執行管線的解釋
? ? ? ?
? ? ? ?首先數據流執行的原則是上游對象輸出的數據類型和下游對象輸入的數據類型要一致,注意輸入輸出數據之間的匹配問題,如果不一致,執行管線就不能正常運行。
? ? ? ?構建好可視化管線后,構成可視化管線的各個對象對數據的處理過程,成為可視化管線的執行,當管線中的過程對象或數據發生改變時,可視化管線都要重新執行,為了保證管線的執行效率,管線在執行過程中必須保持處理對象的同步,VTK采用隱式執行的方式保持同步。
隱式執行包含兩個互逆的過程:
1.??????Execute():source->filter->mapper
當可視化管線中的對象創建時間發生改變,表示對象已經更新了,這時執行了execute()
2.??????update(): mapper-->filter->source
當renderWindowàRender()發出繪制請求,actor對象將繪制信息給mapper,管線開始執行,然后mapper、filter、source對象依次調用upDate()方法,源對象調用了update()方法后,開始比較當前修改時間和最后執行時間,如果當前被修改的時間比最后執行的時間新,則執行execute(),filter對象和mapper對象比較他們的修改時間和最后執行的時間,根據比較結果看是否需要調用execute()。
總結
- 上一篇: boost::function和boos
- 下一篇: Gartner:6个容器和Kuberne