activiz自己自帶的user guide 比較簡單,因此我按着vtk的user guide來慢慢學。從簡單例子入手去學習VTK。固然我以前已經看過不少VTK相關的東西了,可是沒有本身去寫去總結,致使我一段時間不用就忘記了。因此此次寫博客就從簡單的開始,一步一步寫下來。記錄本身的學習過程。web
不過,(⊙﹏⊙)b 我英文不太好,因此是看中文版的來學習的。參考的是這一本:算法
有須要的小夥伴們能夠本身下載。緩存
《VTK用戶手冊》 P20app
VTK 創建應用程序的基本過程以下:ide
1) 讀取/生成數據工具
2)過濾數據學習
3) 繪製圖形網站
4) 交互操做ui
VTK 提供了兩種獲取數據的方法,一種是讀取已經存在的數據文件,另外一種是經過算法或數學表達式生成數據。
在可視化流水線中起始節點對象被稱爲源對象,源對象又被分爲程序源對象、讀源對象,經過數學方法生成數據的對象稱爲程序源對象,從數據文件中讀取數據的對象被稱爲讀源對象。
首先,作一個程序源對象的讀取:
(額,在寫代碼以前的如何添加引用和添加renderwindowcontrol到工具欄就再也不重複了,直接進入代碼階段)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Kitware.VTK; namespace test1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void renderWindowControl1_Load(object sender, EventArgs e) { //vtkCylinderSource cylinder = new vtkCylinderSource(); vtkCylinderSource cylinder = vtkCylinderSource.New();//建立圓柱體 cylinder.SetResolution(8);//生成圓柱體多邊形的數目 vtkPolyDataMapper mymapper = vtkPolyDataMapper.New();//建立映射器對象 mymapper.SetInput(cylinder.GetOutput());//圓柱體的輸出做爲映射器的輸入 vtkLODActor myactor = vtkLODActor.New();//建立演員對象 myactor.SetMapper(mymapper);//爲演員對象設置映射器 myactor.GetProperty().SetDiffuseColor(1.0,1.0,1.0);//設定顏色 vtkRenderer ren1 = renderWindowControl1.RenderWindow.GetRenderers().GetFirstRenderer();//獲取renderwindowcontrol的繪製者 vtkRenderWindow renwin = renderWindowControl1.RenderWindow;//獲取renderwindowcontrol的繪製窗口 ren1.AddActor(myactor);//爲繪製者(我感受能夠翻譯爲渲染器)添加演員 renwin.SetSize(520,520);//設定窗口的大小 vtkRenderWindowInteractor iren = renderWindowControl1.RenderWindow.GetInteractor();//獲取交互器 iren.Start();//開始交互 vtkCamera camera = ren1.GetActiveCamera();//獲取活動的相機 ren1.ResetCamera(); } } }
運行效果:
 ̄へ ̄,上面的代碼有點小問題,就是程序一運行的時候,柱體有點大,估計是個人相機沒有設置好。
後面等看到了相機再說吧,也但願能有高手指點一下,我相機的一些操做還不是特別熟。
好了下面作一個 讀源對象的例子:
這個書上給的例子好簡單,我本身在vtk的例子網站上找了一個,讀取dicom序列文件的。下面用activiz實現一下。
例子的網址:
http://www.vtk.org/Wiki/VTK/Examples/Cxx/IO/ReadDICOM
下面是本身的實現:
(一樣前面的添加引用和添加renderwinowcontrol就不講了,能夠按照第一篇筆記添加上。)
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Kitware.VTK;
namespace test2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btn_openfile_Click(object sender, EventArgs e)
{
OpenFileDialog openDicomImage = new OpenFileDialog();
openDicomImage.Filter = "DICOM文件|*.dcm";
if(openDicomImage.ShowDialog()==DialogResult.OK)
{
vtkDICOMImageReader reader = vtkDICOMImageReader.New();
reader.SetFileName(openDicomImage.FileName);
reader.Update();
vtkImageViewer2 view = vtkImageViewer2.New();
view.SetInputConnection(reader.GetOutputPort());
view.SetRenderWindow(renderWindowControl1.RenderWindow);
view.SetRenderer(renderWindowControl1.RenderWindow.GetRenderers().GetFirstRenderer());
view.Render();
view.GetRenderer().ResetCamera();
view.Render();
view.SetupInteractor(renderWindowControl1.RenderWindow.GetInteractor());
renderWindowControl1.RenderWindow.GetInteractor().Start();
}
}
}
}
實現效果:
(能夠實現交互調節窗寬窗位)
上面兩個數據源的讀取例子寫完了,得加上點理論知識才顯得高大上啊!下面是我以前學VTK的時候作的筆記,貼在下面,儘可能記得來源的就加上來源,不記得的若是有侵權,請告訴我一聲我刪掉。
VTK 流水線機制:
以上基本對應以前講的VTK 創建應用程序的基本過程,也和咱們以前作的兩個小例子相對應,固然前面的兩個小例子比較簡單,沒有涉及到filter。
可視化模型圖形流水線的角色是將圖形數據變換成圖片,可視化流水線是將信息變換成圖形數據。換句話說,可視化流水線負責幾何表達,而後由圖形流水線來繪製。VTK使用數據流方法將信息變換成圖形數據,在這個方法中涉及兩個基本對象類型。vtkDataObject 數據對象vtkProcessObject處理對象(過程對象?)數據對象表示各類類型的數據,
vtkDataObject能夠當作是通用的「blob」數據(blob數據類型的列能夠存儲大型二進制對象,如圖形、視頻和聲音等。具備正式結構的數據稱爲數據集(DataSet類)。
處理對象也常指濾波器,做用於數據對象,產生新的數據對象(注意這裏與Mapper的不一樣,濾波器讀取的是數據對象,產生的是新的數據對象。而mapper讀取的是數據對象,產生的是圖形對象(圖形對象是什麼呢?看下面總結的九種圖形對象
http://blog.csdn.net/williamyk/article/details/6014276
)
vtkMapper指定了渲染數據和圖形庫中基本圖元之間的聯繫)。處理對象表示系統的算法。處理對象和數據對象經過可視化流水線相連(數據流網)
關於構建可視化流水線有一些重要的問題,簡要在這裏介紹一下。首先,流水線拓撲結構由方法變化而構成
A Filter->SetInput (anotherFilter->GetOutput());
這些方法將一個過濾器的輸出做爲另外一個過濾器的輸入(具備多輸入和輸出的過濾器相似)。其次,必須創建一個機制來控制流水線的執行,僅執行那些流水線的必要部分,產生輸出的更新。可視化工具箱使用一個懶評估(惰性賦值這個翻譯更貼切一些)方案(當數據被請求時才執行),依據每一個對象內部修改時間。第三,流水線組裝僅須要那些兼容的對象,使用SetInput() 和GetOutput()方法能與其它對象很好地結合在一塊兒。在VTK中,C++編譯時類型檢查強迫作到這一點。最後,咱們必須決定一旦流水線執行,數據對象是否須要緩存或保留。因爲可視化數據集至關大,如何成功應用VTK工具至關重要。VTK提供了將數據緩存開或關的方法,使用計數參數來避免拷貝數據,以及當整個數據不能裝入內存時將數據流分塊的方法(建議參考第四章可視化工具箱內容得到更多的信息)。