VTK修炼之道6_仔细分析一个复杂程序
生活随笔
收集整理的這篇文章主要介紹了
VTK修炼之道6_仔细分析一个复杂程序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.程序代碼
#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL); / #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);//生成VTK數據結構vtkSmartPointer<vtkPolyDataMapper> cylinderMapper=vtkSmartPointer<vtkPolyDataMapper>::New();cylinderMapper->SetInputConnection(cylinder->GetOutputPort());//給演員化妝vtkSmartPointer<vtkActor> cylinderActor =vtkSmartPointer<vtkActor>::New();cylinderActor->SetMapper(cylinderMapper);//布置舞臺vtkSmartPointer<vtkRenderer> cylinderRenderer =vtkSmartPointer<vtkRenderer>::New();cylinderRenderer->AddActor(cylinderActor);cylinderRenderer->SetBackground(1,0,0);//裝飾劇院vtkSmartPointer<vtkRenderWindow> renwin=vtkSmartPointer<vtkRenderWindow>::New();renwin->AddRenderer(cylinderRenderer); //搭建舞臺renwin->SetSize(400,400);//觀眾席和舞臺的互動vtkSmartPointer<vtkRenderWindowInteractor> renwininter=vtkSmartPointer<vtkRenderWindowInteractor>::New();renwininter->SetRenderWindow(renwin);//觀眾席的行為(單方面互動)vtkSmartPointer<vtkInteractorStyleTrackballCamera> style=vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();renwininter->SetInteractorStyle(style);renwininter->Initialize(); //初始化renwininter->Start(); //等待交互手段(事件)return 0; }
2.代碼分析及釋義
上述程序可以完成鼠標與圓柱交互,比如放大、縮小,平移、旋轉等。2.1?vtkCylinderSource:
派生自vtkPolyDataAlgorithm。顧名思義,vtkCylinderSource生成的數據類型就是PolyData(vtkPolyData)的,它主要是生成一個中心在渲染場景原點的柱體,柱體的長軸沿著Y軸,柱體的高度、截面半徑等都可以任意指定。vtkCylinderSource::SetHeight() ——設置柱體的高。
vtkCylinderSource::SetRadius() ——設置柱體橫截面的半徑。
vtkCylinderSource::SetResolution() ——設置柱體橫截面的等邊多邊形的邊數。轉動一下柱體,然后數數柱體橫截面有多少條邊,應該就能明白這個參數表示什么意思。
2.2??vtkPolyDataMapper:
渲染多邊形幾何數據(vtkPolyData),派生自類vtkMapper,將輸入的數據轉換為幾何圖元(點、線、多邊形)進行渲染。vtkPolyDataMapper::SetInputConnection() —— VTK可視化管線的輸入數據接口,對應的可視化管線輸出數據的接口為GetOutputPort();VTK5.0之前的版本使用SetInput()和GetOutput()作為輸入輸出接口,VTK 5.0以后版本保留了對這兩個接口的支持。2.3?vtkActor:
派生自vtkProp類,渲染場景中數據的可視化表達是通過vtkProp的子類負責的。比如,本例要渲染一個柱體,柱體的數據類型是vtkPolyData,數據要在場景中渲染時,不是直接把數據加入渲染場景就可以,待渲染的數據是以vtkProp的形式存在于渲染場景中。三維空間中渲染對象最常用的vtkProp子類是vtkActor(表達場景中的幾何數據)和vtkVolume(表達場景中的體數據);二維空間中的數據則是用vtkActor2D表達。vtkProp子類負責確定渲染場景中對象的位置、大小和方向信息。Prop依賴于兩個對象,一個是Mapper(vtkMapper)對象,負責存放數據和渲染信息,另一個是屬性(vtkProperty)對象,負責控制顏色、不透明度等參數。VTK中定義了大量(超過50個)的Prop類,如vtkImageActor(負責圖像顯示)和vtkPieChartActor(用于創建數組數據的餅圖可視化表達)。其中的一些Prop內部直接包括了控制顯示的參數和待渲染數據的索引,因此并不需要額外的Property和Mapper對象。vtkActor的子類vtkFollower可以自動的更新方向信息以保持始終面向一個特定的相機。這樣無論怎樣旋轉,三維場景中的廣告板(Billboards)或者文本都是可見的。vtkActor的子類vtkLODActor可以自動改變自身的幾何表達來實現需要達到的交互幀率。vtkProp3D的子類vtkLODProp3D則是通過從許多Mapper(可以是體數據的Mapper和幾何數據的Mapper集合)中進行選擇來實現交互。vtkAssembly建立Actor的等級結構以便在整個結構平移、旋轉或者縮放時能夠更合理的控制變換。
vtkActor::SetMapper()——設置生成幾何圖元的Mapper。即連接一個Actor到可視化管線的末端(可視化管線的末端就是Mapper)。
2.4??vtkRenderWindow:
將操作系統與VTK渲染引擎連接到一起。不同平臺下的vtkRenderWindow子類負責本地計算機系統中窗口創建和渲染過程管理。當使用VTK開發應用程序時,你只需要使用平臺無關的vtkRendererWindow類,運行時,系統會自動替換為平臺相關的vtkRendererWindow子類。比如,Windows下運行上述的VTK程序,實際創建的是vtkWin32OpenGLRenderWindow(vtkRenderWindow的子類)對象。vtkRenderWindow中包含了vtkRenderer集合、渲染參數,如立體顯示(Stereo),反走樣,運動模糊(Motion Blur)和焦點深度(Focal Depth)等。vtkRenderWindow::AddRenderer() ——加入vtkRenderer對象。
vtkRenderWindow::SetSize() ——該方法是從vtkRenderWindow的父類vtkWindow繼承過來的,用于設置窗口的大小,以像素為單位。
2.5?vtkRenderer:
負責管理場景的渲染過程。組成場景的所有對象包括Prop,照相機(Camera)和光照(Light)都被集中在一個vtkRenderer對象中。一個vtkRenderWindow中可以有多個vtkRenderer對象,而這些vtkRenderer可以渲染在窗口中不同的矩形區域中(即視口),或者覆蓋整個窗口區域。vtkRenderer::AddActor() ——添加vtkProp類型的對象到渲染場景中。
vtkRenderer::SetBackground() ——該方法是從vtkRenderer的父類vtkViewport繼承的,用于設置渲染場景的背景顏色,用R、G、B的格式設置,三個分量的取值為0.0~ 1.0。除了可以設置單一的背景顏色之外,還可以設置漸變的背景顏色,vtkViewport::SetBackground2()用于設置漸變的另外一種顏色,但是要使背景顏色漸變生效或者關閉,必須調用以下的方法:
vtkViewport::SetGradientBackground(bool) ——參數為0是關閉,反之,打開。
vtkViewport::GradientBackgroundOn()—— 打開背景顏色漸變效果,相當于調用方法SetGradientBackground(1)。
vtkViewport::GradientBackgroundOff() ——關閉背景顏色漸變效果。相當于調用方法SetGradientBackground(0)。
2.6?vtkRenderWindowInteractor:
提供平臺獨立的響應鼠標、鍵盤和時鐘事件的交互機制,通過VTK的Command/Observer設計模式將監聽到的特定平臺的鼠標、鍵盤和時鐘事件交由vtkInteractorObserver或其子類,如vtkInteractorStyle進行處理。vtkInteractorStyle等監聽這些消息并進行處理以完成旋轉、拉伸和放縮等運動控制。vtkRenderWindowInteractor自動建立一個默認的3D場景交互器樣式(Interactor Style):vtkInteractorStyleSwitch,當然你也可以選擇其他的交互器樣式,或者是創建自己的交互器樣式。在本例中,我們就是選擇了其他的交互器樣式來替代默認的:vtkInteractorStyleTrackballCamera。vtkRenderWindowInteractor::SetRenderWindow()——設置渲染窗口,消息是通過渲染窗口捕獲到的,所以必須要給交互器對象設置渲染窗口。
vtkRenderWindowInteractor::SetInteractorStyle()——定義交互器樣式,默認的交互樣式為vtkInteractorStyleSwitch。
vtkRenderWindowInteractor::Initialize() ——為處理窗口事件做準備,交互器工作之前必須先調用這個方法進行初始化。
vtkRenderWindowInteractor::Start() ——開始進入事件響應循環,交互器處于等待狀態,等待用戶交互事件的發生。進入事件響應循環之前必須先調用Initialize()方法。
2.7?vtkInteractorStyleTrackballCamera:
交互器樣式的一種,該樣式下,用戶是通過控制相機對物體作旋轉、放大、縮小等操作。做個類比:我們在照相的時候如果要想物體看起來顯得大一些,我們可以采取兩種做法,第一種做法是相機不動,讓我們要拍的物體靠近我們;第二種做法是物體不要動,我們把相機靠近物體,這樣物體看起來也是大一些。第二種做法就是vtkInteractorStyleTrackballCamera的風格。其父類為vtkInteractorStyle,除了vtkInteractorStyleTrackballCamera之外,VTK還定義了其他多種交互器樣式,如vtkInteractorStyleImage,主要用于顯示二維圖像時的交互。3.東靈的形象化講解
當我們去看舞臺劇的時候,我們坐在臺下,展現在我們面前的是一個舞臺,舞臺上有各式的燈光,各樣的演員。演員出場的時候肯定是會先化妝,有些演員可能會打扮成高富帥,有些演員可能會化妝成白富美。觀眾有時還會與臺上的演員有一定的互動。整個劇院就好比VTK程序的渲染窗口(vtkRenderWindow);舞臺就相當于渲染場景(vtkRenderer);而那些高富帥、白富美就是我們程序中的Actor(有些文獻翻譯成“演員”,有些翻譯成“角色”,這里我們不作翻譯);臺上的演員與臺下觀眾的互動可以看成是程序的交互(vtkRenderWindowInteractor);演員與觀眾的互動方式有很多種,現場的觀眾可以直接上臺跟演員們握手擁抱,電視機前的可以發短信,電腦、移動終端用戶等可以微博關注、加粉等等,這就好比我們程序里的交互器樣式(vtkInteractorStyle);舞臺上的演員我們都能一一分辨出來,不會把高富帥弄混淆,是因為他們化的妝、穿的服飾都不一樣,這就相當于我們程序里vtkActor的不同屬性(vtkProperty);臺下觀眾的眼睛可以看作是vtkCamera,前排的觀眾因為離得近,看臺上演員會顯得比較高大,而后排的觀眾看到的會顯得小點,每個觀眾看到的東西在他的世界里都是唯一的,所以渲染場景Renderer里的vtkCamera對象也是只有一個;舞臺上的燈光可以有多個,所以渲染場景里的vtkLight也存在多個。可以參考下圖,加深理解:
4.本程序的運行結果
可以使用鼠標與柱體交互,比如用鼠標滾輪可以對柱體放大、縮小;按下鼠標左鍵不放,然后移動鼠標,可以轉動柱體;按下鼠標左鍵,同時按下Shift鍵,移動鼠標,可以移動整個柱體,等等。
參考資料: 1.?VTKUsersGuide 11th 2.張曉東,羅火靈。 VTK圖形圖像開發。
總結
以上是生活随笔為你收集整理的VTK修炼之道6_仔细分析一个复杂程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 飞鸽传书确保服务数据的安全可靠
- 下一篇: WSARecv参数lpNumberOfB