天天看點

VTK學習-第一個多柱體生成

寫在前面:

開始新學習VTK,目前對于VTK的了解就是一個三維渲染庫,主要用于醫學三維重建方面,不能說對這方面很感興趣,但是總要往前走,希望能從VTK學習中學習一些計算機圖形學中三維模組化的知識。

多柱體生成:

#include <vtkRenderWindow.h>
#include <vtkSmartPointer.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkCylinderSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>

int main(){
    vtkSmartPointer<vtkCylinderSource>cylinder=
    vtkSmartPointer<vtkCylinderSource>::New();
    cylinder->SetHeight();
    cylinder->SetRadius();
    cylinder->SetResolution();

    vtkSmartPointer<vtkPolyDataMapper>cylinderMapper=
    vtkSmartPointer<vtkPolyDataMapper>::New();
    cylinderMapper->SetInputConnection(cylinder->GetOutputPort());

    vtkSmartPointer<vtkActor>cylinderActor=
    vtkSmartPointer<vtkActor>::New();
    cylinderActor->SetMapper(cylinderMapper);

    vtkSmartPointer<vtkRenderer>renderer=
    vtkSmartPointer<vtkRenderer>::New();
    renderer->AddActor(cylinderActor);
    renderer->SetBackground(,,);

    vtkSmartPointer<vtkRenderWindow>renwin=
    vtkSmartPointer<vtkRenderWindow>::New();
    renwin->AddRenderer(renderer);
    renwin->SetSize(,);

    vtkSmartPointer<vtkRenderWindowInteractor>iren=
    vtkSmartPointer<vtkRenderWindowInteractor>::New();
    iren->SetRenderWindow(renwin);

    vtkSmartPointer<vtkInteractorStyleTrackballCamera>style=
    vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
    iren->SetInteractorStyle(style);

    iren->Initialize();
    iren->Start();

    return ;
}
           

程式運作結果如下:

VTK學習-第一個多柱體生成

程式學習:

1.VTK對類的命名都是以小寫的vtk開頭,每個類的關鍵字首字母大寫,類似駝峰命名法。

2.程式中有許多vtkSmartPointer,這是VTK的類執行個體化對象的基本用法。因為VTK裡每個類的構造函數都定義為保護成員,是以常用的C++中定義語句:

vtkRenderWindow renWin;
           

這樣的定義方法是不可取的,會出現錯誤:

error C2248:vtkRenderWindow::vtkRenderWindow:cannot access protected member declared in class vtkRenderWindow.
           

是以構造VTK的對象主要有兩種方法:

//vtkClassExample是不存在,隻是例子類,用來說明格式
//方法1:
vtkSmartPointer<vtkClassExample>instance=vtkSmartPointer<vtkClassExample>::New();
//方法2:
vtkClassExample* instance=vtkClassExample::New();
           

vtkCylinderSource:

該類派生自vtkPolyDataAlgorithm。那麼該類生成的資料類型就是vtkPolyData,該類的主要功能是生産一個中心在渲染場景原點的柱體, 初始時,柱體長軸在Y軸,柱體的高度、截面半徑與多邊形邊數可以通過這三個函數設定:

vtkCylinderSource::SetHeight();

vtkCylinderSource::SetRadius();

vtkCylinderSource::SetResolution();

vtkPolyDataMapper:

該類用于渲染多邊形幾何資料(就是之前的vtkPolyData),派生自類vtkMapper,将輸入的資料轉換為幾何圖元(點、線、多邊形)進行渲染。通過函數:

vtkPolyDataMapper:SetInputConnection();接收參數為一個輸入資料接口,通過vtkCylinderSource::GetOutputPort();擷取。

vtkActor:

該類派生自vtkProp類。負責渲染場景中資料的可視化表達。資料在場景中渲染時,是将資料轉換為vtkProo的形式存在與渲染場景之中。表達場景中的幾何資料常用vtkActor類;表達場景中的體術常用vtkVolume類。二維空間中的資料通過vtkActor2D表達。

vtkProp子類負責确定熏染場景中對象的位置、大小和方向等資訊。vtkPro類依賴兩個對象:

1.Mapper對象,負責存放資料和渲染資訊;

2.屬性(vtkProperty)對象,負責控制顔色、不透明度等參數。

3.vtkActor可以通過vtkTexture對象,進行紋理貼圖。

vtkActor::SetMapper();該方法用于設定生成幾何圖元的Mapper,即連接配接一個Actor到可視化管線的末端(Mapper)。這個函數就接收Mapper執行個體。

vtkRenderWindow:

該類将作業系統與VTK渲染引擎連接配接到一起。使用VTK進行開發時,系統會自動将vtkRenderWindo替換為平台相關的vtkRendererWindow子類。程式中調用函數:

vtkRenderWindow::AddRenderer();加入vtkRenderer對象。

vtkRenderWindow::SetSize();從vtkWindow繼承來,設定視窗大小,以像素為基本機關。

vtkRenderer:

該類負責管理場景的渲染過程。組成對象包括Prop,照相機(vtkCamera)和光照(vtkLight)。一個vtkRenderWindow中可以有多個vtkRenderer對象,這些vtkRenderer可以渲染在視窗不同的矩形區域(視口)或者覆寫整個視窗區域。

vtkRenderer:AddActor)();将vtkProp類型的對象添加到渲染場景中,本程式中用到就是cylinderActor。

vtkRenderer:SetBackground();從vtkRenderer的父類vtkViewport繼承來的,用于來設定渲染場景的背景顔色。按照R、G、B的格式設定,三個取值為0.0~1.0,(0.0,0.0,0.0)為黑色,(1.0,1.0,1.0)為白色。

當然還可以設定漸變顔色,利用函數:

vtkRenderer:SetBackground2();但還需要調用函數:

vtkViewport::SetGradentBackground(bool):參數為0,關閉;1,打開;

vtkViewport::GradentBackgroundOn()與vtkViewport::GradentBackgroundOff()前者打開背景漸變顔色,後者關閉。

vtkRenderWindowInteractor:

該類提供平台獨立的響應滑鼠、鍵盤和時鐘事件的互動機制。這個具體的到學習到對應章節再說~先簡單的介紹一些這個程式中用到的函數。

vtkRenderWindowInteractor::SetRenderWindow():設定渲染視窗。由于我們是通過渲染視窗進行互動的,素以要給叫胡琪對象設定渲染視窗。這裡接收的就是renwin。

vtkRenderWindowInteractor::SetInteractorStyle():定義互動器樣式,預設樣式為vtkInteractorStyleSwitch。

vtkRenderWindowInteractor::Initialize();該函數為處理視窗時間做準備。互動器工作之前要先調用這個方法進行初始化。

vtkRenderWindowInteractor::Start();調用該函數,辨別程式開始進入事件響應循環。互動器處于等待狀态。在調用該函數之前要先調用Initialize()函數。

vtkInteractorStyleTrackballCamera:

互動器樣式的一種,該樣式下,使用者通過控制相機對物體作旋轉、放大、縮小等操作。本程式中,執行個體化該類為style,然後通過SetInteractorStyle()函數,将style傳入。完成對vtkRenderInteractor樣式的設定。

寫在最後:

書中有一個形象的比喻。VTK與觀看舞台劇演出做對比。

整個大劇院<—->vtkRenderWindow的渲染視窗。

劇院中舞台<—->vtkRenderer的渲染場景。

舞台上演員<—->vtkActor的的渲染對象。

表演中互動<—->vtkRenderWindowInteractor的互動。

互動的方式<—->vtkInteractorSyle的互動器樣式。

演員的特性<—->vtkActor的不同屬性vtkProperty。

觀衆的視角<—->vtkCamera。

這是我寫的第一個VTK程式,這裡隻是初步的第一印象,後面需要在實際寫程式中不斷加深印象。

繼續閱讀