VTK圖形圖像開發進階-學習筆記 02 VTK的基本概念

2.1 一個稍微複雜的VTK程序

創建VTK程序的步驟可以參考上一篇,這裏直接列出CMakeLists.txt 和2.1_RenderCylinder.cpp內容

CMakeLists.txt

CMAKE_MINIMUM_REQUIRED(VERSION 3.13.4)
PROJECT(Chap02)
FIND_PACKAGE(VTK REQUIRED)
INCLUDE(${VTK_USE_FILE})
ADD_EXECUTABLE(2.1_RenderCylinder 2.1_RenderCylinder.cpp)
TARGET_LINK_LIBRARIES(2.1_RenderCylinder ${VTK_LIBRARIES} )

2.1_RenderCylinder.cpp

#include <vtkSmartPointer.h>
#include <vtkRenderWindow.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(3.0);
	 cyLinder->SetRadius(1.0);
	 cyLinder->SetResolution(10);
	 
	 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(0.1,0.2,0.4);
	    
	  vtkSmartPointer<vtkRenderWindow> renWin=
	  vtkSmartPointer<vtkRenderWindow>::New();
	  renWin->AddRenderer(renderer);
	  renWin->SetSize(300,300);
	  
	  vtkSmartPointer<vtkRenderWindowInteractor> iren=
	  vtkSmartPointer<vtkRenderWindowInteractor>::New();
	  iren->SetRenderWindow(renWin);
	
	vtkSmartPointer<vtkInteractorStyleTrackballCamera> style=
	vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
	iren->SetInteractorStyle(style);
	
	iren->Initialize();
	iren->Start();
	
	return 0;
	
}

運行效果:

詳解:

(1)vtkCylinderSource

生成的數據類型是vtkPolyData,柱體。


(2)vtkPolyDataMapper

將輸入的數據轉換爲幾何圖元(點、線、多邊形)進行渲染。


(3)vtkActor

a.派生自vtkProp,渲染場景中數據的可視化表達通過vtkProp的子類負責。

b.數據要在場景中渲染時,不是直接把數據加入渲染場景,而是以vtkProp的形式存在於渲染場景中。

c.三維空間中渲染對象最常用的vtkProp子類有vtkActor(表達場景中的幾何數據)和vtkVolume(表達場景中的體數據)

d.二維空間中的數據用vtkActor2D表達

e.vtkProp子類負責確定渲染場景中對象的位置、大小和方向等信息

f.Prop依賴兩個對象:Mapper(vtkMapper)對象,負責存放對象和渲染信息

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

g.vtkActor中還可以設置紋理(vtkTexture)對象,用於紋理貼圖

h.vtkActor子類vtkFollower可以自動更新方向信息使其始終面向一個特定的相機,這樣無論怎樣旋轉該對象都是可見的,例如三維場景中的廣告板或者文本。

i.vtkActor子類vtkLODActor可以自動改變自身的幾何表達形式來實現所需的交互幀率。

j.vtkAssembly建立了各個Actor的層次結構以便在整個結構平移,旋轉或縮放等變換時能更合理的控制

 

 

 

(4)vtkRenderWindow

vtkRenderWindow平臺無關類,將操作系統與VTK渲染引擎連接到一起。


(5)vtkRenderer

a.負責管理場景的渲染過程。組成場景的對象包括:Prop,照相機(vtkCamera)和光照(vtkLight)

b.一個vtkRenderWindow中可以有多個vtkRenderer對象,而這些vtkRenderer可以渲染在窗口不同的矩形區域中(即視口)或者覆蓋整個窗口區域。


(6)vtkRenderWindowInteractor 交互器

a.提供平臺獨立的響應鼠標、鍵盤和時鐘事件的交互機制,通過VTK的觀察者/命令模式將監聽到的特定平臺的鼠標、鍵盤和時鐘事件交由vtkinteractorObserver或其子類,如vtkInteractorStyle進行處理。

vtkInteractorStyle監聽這些消息並進行處理以完成旋轉、拉伸和縮放等運動控制。

b.vtkRenderWindowInteractor::SetRenderWindow():該方法用於設置渲染窗口

c.vtkRenderWindowInteractor::SeInteractorStyle():該方法用於定義交互器樣式,默認交互樣式爲vtkInteractorStyleSwitch.

 

 


(7)vtkInteractorStyleTrackballCamera

交互器樣式的一種

總結:經典比喻,加深理解。

2.2  三維場景的基本要素

2.2.1 燈光

a三維渲染場景中可以有多個燈光存在,燈光和相機是三維渲染場景中必備的要素,會自動創建默認的燈光和相機。

b.VTK中的vtkLight實例可以打開、關閉,設置燈光顏色,照射位置(焦點),燈光所在位置、強度等。

示例:

          vtkSmartPointer<vtkLight> myLight =
		  vtkSmartPointer<vtkLight>::New();
	  myLight->SetColor(0, 1, 0);
	  myLight->SetPosition(0, 0, 1);
	  myLight->SetFocalPoint(renderer->GetActiveCamera()->GetFocalPoint());
	  renderer->AddLight(myLight);

	  vtkSmartPointer<vtkLight> myLight2 =
		  vtkSmartPointer<vtkLight>::New();
	  myLight2->SetColor(1, 0, 0);
	  myLight2->SetPosition(0, 0, -1);
	  myLight2->SetFocalPoint(renderer->GetActiveCamera()->GetFocalPoint());
	  renderer->AddLight(myLight2);

效果圖:

2.2.2 相機

 

示例:

          vtkSmartPointer<vtkCamera> myCamera =
		  vtkSmartPointer<vtkCamera>::New();
	  myCamera->SetClippingRange(0.0475, 2.3786);
	  myCamera->SetFocalPoint(0.0573, -0.2134, -0.0523);
	  myCamera->SetPosition(0.3245, -0.1139, -0.2932);
	  myCamera->SetViewUp(-0.2234, 0.9983, 0.0345);
	  renderer->SetActiveCamera(myCamera);

2.2.3 顏色

2.2.4 紋理映射

紋理映射是創建逼真效果的強大的圖形工具,其原理是渲染時把二維的圖像“貼”到物體的表面。

紋理映射三要素:待貼圖的表面、紋理映射、紋理座標。

紋理映射在VTK中就是vtkImageData的數據集。

示例:

          vtkSmartPointer<vtkJPEGReader> reader =
		  vtkSmartPointer<vtkJPEGReader>::New();
	  reader->SetFileName("D:\\1.jpg");

	  vtkSmartPointer<vtkTexture> texture =
		  vtkSmartPointer<vtkTexture>::New();
	  texture->SetInputConnection(reader->GetOutputPort());
	  texture->InterpolateOn();

	  vtkSmartPointer<vtkPlaneSource> plane =
		  vtkSmartPointer<vtkPlaneSource>::New();
	  vtkSmartPointer<vtkPolyDataMapper> mapper =
		  vtkSmartPointer<vtkPolyDataMapper>::New();
	  mapper->SetInputConnection(plane->GetOutputPort());

	  vtkSmartPointer<vtkActor> actor =
		  vtkSmartPointer<vtkActor>::New();
	  actor->SetMapper(mapper);
	  actor->SetTexture(texture);
	  renderer->AddActor(actor);

效果:

2.3 座標系統及空間轉換

2.3.1 座標系統

計算機圖形學常用的座標系統:Model座標系統、World座標系統、View座標系統和Display座標系統

兩種表示座標點的方式:以屏幕像素值爲單位和歸一化座標值(各座標軸取值範圍爲[-1,1])

未完,待補充...

2.3.2 空間變換

未完,待補充...

2.4VTK管線

2.4.1 VTK渲染引擎

VTK兩個重要概念:

1.渲染引擎(Rendering Engine)主要負責數據的可視化表達

2.可視化管線(Visualization Pipeline)

 

代碼:

#include <vtkSmartPointer.h>
#include <vtkStructuredPointsReader.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkMarchingCubes.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>


int main(int argc, char *argv[]) {
	vtkSmartPointer<vtkStructuredPointsReader> reader =
		vtkSmartPointer<vtkStructuredPointsReader>::New();
	reader->SetFileName("D:\\head.vtk");

	vtkSmartPointer<vtkMarchingCubes> marchingCubes =
		vtkSmartPointer<vtkMarchingCubes>::New();
	marchingCubes->SetInputConnection(reader->GetOutputPort());
	marchingCubes->SetValue(0, 500);

	vtkSmartPointer<vtkPolyDataMapper> mapper =
		vtkSmartPointer<vtkPolyDataMapper>::New();
	mapper->SetInputConnection(marchingCubes->GetOutputPort());

	vtkSmartPointer<vtkActor> actor =
		vtkSmartPointer<vtkActor>::New();
	actor->SetMapper(mapper);

	vtkSmartPointer<vtkRenderer> renderer =
		vtkSmartPointer<vtkRenderer>::New();
	vtkSmartPointer<vtkRenderWindow> renWin =
		vtkSmartPointer<vtkRenderWindow>::New();
	vtkSmartPointer<vtkRenderWindowInteractor> interactor =
		vtkSmartPointer<vtkRenderWindowInteractor>::New();

	renWin->AddRenderer(renderer);
	interactor->SetRenderWindow(renWin);
	renderer->AddActor(actor);
	renderer->Render();

	interactor->Initialize();
	interactor->Start();

	return 0;

}

2.4.2 VTK可視化管線

 

2.5 VTK智能指針

2.5.1引用計數

2.5.2 智能指針

2.5.3 運行時類型識別

VTK裏在vtkObjectBase定義了獲取對象類型的方法-GetClassName()和IsA()

基類向子類的類型轉換,稱爲向下轉型,VTK定義SafeDownCast()

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