1. 程式人生 > >vtk基礎知識及測試例子

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:

從三維場景中生成二維顯示用影象的類,它與actor,light和camera有直接聯絡。Render將幾何形體,特定光線和照相機視角轉換到二維影象表示。同時,完成世界座標系,檢視座標系(計算機圖形渲染座標系)和顯示座標系(顯示裝置上真實的螢幕座標系)之間的座標轉換。

      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。當影象發生旋轉時,也實時進行照相機引數的傳遞。這樣便可以實現二者的同步。

     實現的效果如下圖所示。