日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

VTK修炼之道6_仔细分析一个复杂程序

發布時間:2025/3/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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_仔细分析一个复杂程序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美性受xxxx白人性爽 | 男男成人高潮片免费网站 | 欧美黄色一区二区三区 | 国产秋霞 | 成人片在线播放 | 国产精九九网站漫画 | 天堂俺去俺来也www久久婷婷 | 国产在线中文 | 日韩精品一区中文字幕 | 99热在 | av网站在线免费看 | 中文字幕 国产 | 日韩欧美超碰 | 成人a在线观看 | 国产精品视频999 | 午夜视频福利 | 中文字幕蜜桃 | 国产偷人妻精品一区 | 日本三级影院 | 黄色欧美在线观看 | 桃色成人 | 日韩免费福利 | 国产精品视频久久久 | 操人网 | 国产精品网站在线观看 | 成人亚洲一区二区 | 男女做激情爱呻吟口述全过程 | 国产成人精品一区二区三区免费 | 这里只有精品66 | 久久久噜噜噜久久中文字幕色伊伊 | 婷婷一区二区三区四区 | 国产香蕉视频 | 91成人在线观看喷潮蘑菇 | 日韩精品一区在线 | 裸体男女树林做爰 | 丰满雪白极品少妇流白浆 | 欧美亚洲日本国产 | 日本特黄一级大片 | 91色多多| 国产天堂资源 | 69视频网站 | 日韩毛片免费观看 | 日韩在线视频免费 | 成人黄色网址在线观看 | 99re6这里只有精品 | 双性尿奴穿贞c带憋尿 | 国产一区在线免费 | 天堂激情网 | 欧美日韩午夜激情 | 啪啪福利| 国产网站免费 | 在线看黄色的网站 | 午夜tv| 欧美日韩在线免费播放 | 一区二区三区黄色录像 | 四虎影视免费 | 国产51视频 | 国产精品视频在线观看免费 | 中出精品| 日韩在线视频观看 | 国产一区二区播放 | 毛片网站免费在线观看 | 火影黄动漫免费网站 | 噼里啪啦动漫高清在线观看 | 蜜臀在线视频 | 国产av剧情一区 | 亚洲第8页 | 欧美激情在线狂野欧美精品 | 国产中文字幕在线免费观看 | 色综合精品 | 日韩极品视频在线观看 | 精品一卡二卡三卡 | 成人av中文字幕 | 国产又粗又猛又爽又黄的 | porn国产| 免费福利视频网站 | 青青青在线免费观看 | 六月激情网 | 欧美性猛交xxx乱久交 | 久久天堂电影 | 在线观看中文字幕一区二区 | 国产精品爽爽爽 | 日本人妻不卡一区二区三区中文字幕 | 国产精品123区 | 国产精品亚洲第一 | 青青草这里只有精品 | 邻居交换做爰2 | 91精品久久久久久久99蜜桃 | 国产成人精品无码播放 | 贝利弗山的秘密1985版免费观看 | 在线观看www视频 | 伊人一级片 | 5566色| 国产亚洲自拍一区 | jizz网站 | 欧美 日韩 成人 | 国产精品成人Av | 成人免费毛片男人用品 | 三级av网|