寫在前面:
開始新學習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 ;
}
程式運作結果如下:
程式學習:
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程式,這裡隻是初步的第一印象,後面需要在實際寫程式中不斷加深印象。