VTK教程之一:可視化管線

VTK是一個基於面向對象的開源三維繪圖軟件包,和其它的的三維繪圖引擎如OSG、OGRE不同之處在於,VTK可視化對象主要是各種數據,更加註重對數據分析處理後的可視化,可視化的內容是人們無法直接感受到的東西,如地質構造、地層分佈、礦牀分佈、三維空間應力場的狀態變化等等,而OSG、OGRE是基於場景的可視化,更強調視覺感官的感受,所以OSG主要應用於虛擬現實領域,而VTK主要應用於科學計算可視化領域,本教程主要介紹VTK的可視化應用。

VTK的可視化設計是基於管線流的設計模式,將要處理的數據作爲流動介質在管線中流動,不同的階段對數據有不同的處理方式,VTK的可視化管線主要由圖形模型和可視化模型組成,如下圖所示:



可視化模型主要對數據進行處理,生成可被繪製的幾何體,而圖形模型主要對生成的幾何體進行繪製,在VTK的可視化管線中所包含的對象一般包括:源對象、過濾器對象(可選)、映射器對象、Props對象、繪製器對象、繪製窗口,其中源對象、過濾器對象(可選)、映射器對象、繪製器對象、繪製窗口爲處理對象,Props對象爲數據對象,映射器對象是可視化模型和圖形模型的接口。

有了可視化管線,VTK的可視化過程就可以用數據在可視化管線流動的過程來描述(數據在管線中流動過程中,被管線不同的對象處理,最終以圖形的方式表現數據信息),VTK的可視化管線具有如下特點:

1、變換

數據從原始的形式變換成圖元的形式,最終以圖形的形式顯示。

2、表現

用VTK內部定義的數據結構描述數據,形成數據集,用圖形的方式表現數據。

3、是基於面向對象的

用面向對象的觀點描述可視化管線,表現是數據對象,變換是處理對象。

下面我們對VTK可視化管線的各個對象分別介紹,在可視化管線中,按對數據處理方式的不同,分爲數據對象和處理對象,其中數據對象主要作用是表現數據信息,並對錶現的信息進行維護(創建、訪問、刪除),處理對象主要是對輸入的數據進行處理後生成輸出新的數據,處理對象主要包括:

1、源對象

數據生成的源頭,數據來源主要包括從磁盤讀取數據文件,如VTK所支持的各種格式文件生成數據源對象,這種源對象被稱爲讀源對象,或者利用數學方法生成源對象,如利用多個四邊形構建一個圓柱體,這種對象被稱爲程序源對象。

2、過濾器對象

對源對象進行處理,生成新的數據集輸出。

3、映射器對象

映射器對象主要作用是將可視化模型生成的數據轉換到圖形模型進行繪製,或者以磁盤文件的形式進行輸出。

以上對VTK可視化管線做了一個簡單的介紹,下面通過一個示例程序來說明數據是如何在可視化管線中流動的。

#include "stdafx.h"
#include "vtkCamera.h"
#include "vtkGenericRenderWindowInteractor.h"
#include "vtkInteractorStyleJoystickCamera.h"
#include "vtkInteractorStyleTrackballCamera.h"
#include "vtkLODActor.h"
#include "vtkLight.h"
#include "vtkPolyData.h"
#include "vtkPolyDataMapper.h"
#include "vtkPropPicker.h"
#include "vtkProperty.h"
#include "vtkRenderWindow.h"
#include "vtkRenderer.h"
#include "vtkSTLReader.h"
#include "vtkShrinkPolyData.h"

int main( int argc, char *argv[] ) {
//創建繪製器對象
vtkRenderer *ren1 = vtkRenderer::New();
//設置相機
ren1->GetActiveCamera()->SetClippingRange(0.294421, 29.4421);
ren1->GetActiveCamera()->SetDistance(7.94348);
ren1->GetActiveCamera()->SetFocalPoint(-66.9367, -49.4539 , 258.453);
ren1->GetActiveCamera()->SetPosition(-67.8091, -57.3489 , 258.377);
ren1->GetActiveCamera()->SetViewAngle(20);
ren1->GetActiveCamera()->SetViewUp(-0.82718, 0.0860684 , 0.555306);
ren1->GetActiveCamera()->SetParallelProjection(0);
ren1->GetActiveCamera()->SetUseHorizontalViewAngle(0);
ren1->SetBackground(0.1 , 0.2 , 0.4);
ren1->SetLightFollowCamera(1);
//創建繪製窗口
vtkRenderWindow *renWin = vtkRenderWindow::New();
renWin->AddRenderer(ren1);
renWin->SetSize(1134 , 624);
//創建交互器
vtkRenderWindowInteractor *iren =vtkRenderWindowInteractor::New();
iren->SetRenderWindow(renWin);
iren->SetLightFollowCamera(1);
//讀源對象讀取stl數據文件
vtkSTLReader *part = vtkSTLReader::New();
part->SetOutput(part->GetOutput());
part->SetFileName("42400-IDGH.stl");
//創建過濾器對象,該對象將輸入數據集的每個單元向單元質心收縮
//將會導致相鄰單元之間出現裂縫
vtkShrinkPolyData *shrink = vtkShrinkPolyData::New();
//將源對象和過濾器連接
shrink->SetInput((vtkPolyData *)part->GetOutput());
//設置收縮係數,如果爲1,不收縮
shrink->SetShrinkFactor(0.9);
//創建映射器對象
vtkPolyDataMapper *partMapper = vtkPolyDataMapper::New();
partMapper->SetInput((vtkPolyData *)shrink->GetOutput());
partMapper->SetNumberOfPieces(1);
partMapper->SetScalarRange(0 , 1);
partMapper->SetColorMode(0);
partMapper->SetResolveCoincidentTopology(0);
partMapper->SetScalarMode(0);
partMapper->SetImmediateModeRendering(0);
partMapper->SetScalarVisibility(1);
partMapper->SetUseLookupTableScalarRange(0);
//創建Props對象(Actor)
vtkLODActor *partActor = vtkLODActor::New();
partActor->SetMapper(partMapper);
partActor->GetProperty()->SetAmbientColor(0.8275, 0.8275 , 0.8275);
partActor->GetProperty()->SetColor(0.8275, 0.8275 , 0.8275);
partActor->GetProperty()->SetDiffuseColor(0.8275, 0.8275 , 0.8275);
partActor->GetProperty()->SetOpacity(1);
partActor->GetProperty()->SetInterpolation(1);
partActor->GetProperty()->SetRepresentation(2);
partActor->GetProperty()->SetBackfaceCulling(0);
partActor->GetProperty()->SetEdgeVisibility(0);
partActor->GetProperty()->SetFrontfaceCulling(0);
partActor->SetOrigin(0 , 0 , 0);
partActor->SetPosition(0 , 0 , 0);
partActor->SetScale(1 , 1 , 1);
partActor->SetVisibility(1);
//將Actor對象添加到繪製器中
ren1->AddActor( partActor );
//繪製
ren1->ResetCamera();
ren1->ResetCameraClippingRange();
renWin->Render();
iren->Initialize();
iren->Start();
//刪除對象
iren->Delete();
part->Delete();
partActor->Delete();
partMapper->Delete();
ren1->Delete();
renWin->Delete();
shrink->Delete();
return 0;
}
轉自:http://lzchenheng.blog.163.com/blog/static/8383353620107161131013/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章