vtk基礎知識及測試例子
VTK基礎知識儲備及example
1. Vtk簡介:
vtk是一個支援三維資料顯示和互動的面向物件開發庫。Vtk提供的對三維資料的操作是通過一個管道(pipeline)體系實現的,在管道體系中多個元素結合在一起共同完成一個複雜的任務。一個典型的管道結構可以分為兩個部分:
1.1.資料生成和處理的元素:
Sources:產生資料的類,可分為兩種(1)通過演算法直接生成資料,被稱為procedural sourceobject,如vtkSphereSource,vtkCylinderSource;(2)從檔案或資料流中讀入資料,稱為reader sourceobject,如vtkJPEGReader是從檔案中讀入JPEG影象並生成一個影象輸出。
Filters: 應用在資料上以產生一個濾過後的版本。如vtkImageGuassianSmooth是在一個影象執行高斯濾波並生成一個新的平滑後的影象。
Mappers: 定義資料和圖形框架或軟體渲染技術間的介面。多個mapper可以共享一個輸入,但用不同的方式進行渲染。
1.2.構成虛擬三維世界的元素:
Props/Actors: 將mapper的輸出作為輸入,並“知道”如何去生成資料的視覺化表示;渲染由附加的資料結構-屬性控制;mapper不能由多個props共享;Volumes是一種特定的props,用於顯示體渲染影象。
Renderer:
Render Window: 實際的用於顯示虛擬照相機影象的螢幕區域。一個render window有一個互動器interactor,用於處理該螢幕區域中收到的鍵盤和滑鼠輸入,以完成與使用者的互動任務。
簡而言之,VTK管道提供了三維資料互動途徑,其使用過程:讀取/生成(read/generate)源資料;對源資料進行濾波(filter);渲染(render)濾波後的資料;在視窗(window)中顯示渲染後的資料,與顯示資料進行互動(interact)。
更多相關知識,可瞭解CSDN 東靈的部落格,講解的很全面。
2. Vtk examples:
2.1 SphereSource:(最基本的一個管道實現)
#include <vtkSphereSource.h>
#include <vtkPolyData.h>
#include <vtkSmartPointer.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
int main(int, char *[])
{
// Create a sphere
vtkSmartPointer<vtkSphereSource> sphereSource =
vtkSmartPointer<vtkSphereSource>::New();
sphereSource->SetCenter(0.0, 0.0, 0.0);
sphereSource->SetRadius(5.0);
//mapper
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(sphereSource->GetOutputPort());
//actor
vtkSmartPointer<vtkActor> actor =
vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
//renderer ,renderWindow, renderWindowInteractor.
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> renderWindow =
vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
renderer->AddActor(actor);
renderer->SetBackground(.3, .6, .3); // Background color green
renderWindow->Render();
renderWindowInteractor->Start();
return EXIT_SUCCESS;
}
2.2 Plane
2.3 DisplayCoordinateAxes:
2.4 vtkOrientationMarkerWidget:
基於例2.4,在醫學影像處理軟體中,可以在顯示三維體資料的Render Window中,增加一個顯示當前影像方位的立方體,也即OrientationMarkerWidget。採用一個renderWindow中放置兩個render的方式實現。
實現程式碼基於2.4 py。為了保證醫學體資料和顯示方位的widget的方位同步,可在初始化時,將醫學影像的render的camera的view up和position傳給顯示方位的render。當影象發生旋轉時,也實時進行照相機引數的傳遞。這樣便可以實現二者的同步。
實現的效果如下圖所示。