1. 程式人生 > >vtk學習記錄(三)——初識vtkRenderer

vtk學習記錄(三)——初識vtkRenderer

[toc] ### 前言 一場疫情打亂了好多人的節奏,我也一樣,一不留神半年都快過去了,這期間雖說一直在鼓搗東西吧,不過確實是沒啥實質性的進展,索性就繼續把vtk的使用來完善下吧。 ### vtkRenderer vtk的基類,也就是所有類基本繼承於**vtkObjectBase**,Renderer也是一樣,看下圖,其實看原始碼挺好的,可以學習學習別人的思想,借鑑下充實自己。 ![vtkRenderer](https://img2020.cnblogs.com/blog/1757809/202005/1757809-20200516153858323-732096276.png) vtkRenderer個人理解就是個視窗渲染器,也是vtk的核心,沒了這玩意兒你沒法去操作你的**vtkActor**,你的**vtkInteractorStyle**也沒有掛載區域,具體的介紹也不多說,看資料看文件吧(我也不會-,-||)。 ### 引入vtk視窗 在上一篇,工程到了能正常執行的地步,但是沒有引入vtk相關的,接下來就是把vtk視窗放置到自己的qt工程的時間了。 ![新增視窗](https://img2020.cnblogs.com/blog/1757809/202005/1757809-20200516153915615-2112058431.png) 之前的配置中已經提到這個**QVTKWidget**,也就是vtk的視窗,至於怎麼拖拖到哪看你自己,不會的可以先鼓搗下單純的qt吧。 儲存之後,我們先來執行程式看下效果,如果不出意外的話會跟我這顯示的一樣。 ![異常](https://img2020.cnblogs.com/blog/1757809/202005/1757809-20200516153927230-1168753152.png) 我們來看下輸出的資訊。 ![輸出](https://img2020.cnblogs.com/blog/1757809/202005/1757809-20200516153935880-2077863037.png) vtk的新版本不再是QVTKWidget,也就是說這玩意兒沒了,一番找資料後發現,哦,原來是改名字了,新版本改成了**QVTKOpenGLWidget**,更改ui檔案後我們再來執行程式。 ![執行](https://img2020.cnblogs.com/blog/1757809/202005/1757809-20200516153943923-397229357.png) 可以看到圖中的**vtkOutputWindow**,這個視窗是vtk內建的錯誤資訊彈框,也就是說有異常的時候回給你輸出資訊提示,但其實你在輸出一樣能看到只是沒有這個直觀而已。 回頭看這個異常資訊,也就是說沒有重寫vtkxxx,沒有繫結事件機制什麼的,我們在標頭檔案加上下面這幾句。 ```cpp #include "vtkAutoInit.h" VTK_MODULE_INIT(vtkRenderingOpenGL2); VTK_MODULE_INIT(vtkInteractionStyle); VTK_MODULE_INIT(vtkRenderingFreeType); ``` 錯誤是解決了,不過這個視窗黑壓壓的也不知道是幹啥的,不用急我們來一段Demo。 ```cpp vtkSmartPointer coneSource = vtkSmartPointer::New(); coneSource->Update(); vtkSmartPointer polyData = vtkSmartPointer::New(); polyData = coneSource->GetOutput(); vtkSmartPointer mapper = vtkSmartPointer::New(); mapper->SetInputData(polyData); vtkSmartPointer actor = vtkSmartPointer::New(); actor->SetMapper(mapper); vtkSmartPointer render = vtkSmartPointer::New(); render->AddActor(actor); render->SetBackground(0.3, 0.3, 0.3); ui.qvtkWidget->GetRenderWindow()->AddRenderer(render); vtkSmartPointer rwi = vtkSmartPointer::New(); rwi->SetRenderWindow(ui.qvtkWidget->GetRenderWindow()); rwi->Initialize(); ``` 接下來簡單介紹下上面這段的意思,首先我們要先了解下opengl,大致知道模型從點到面到成像的過程,[opengl教程地址](https://learnopengl-cn.github.io/)。 首先我們建立一個**Source**,也就是點,面數據,通過**DataMapper**整理對映,然後**Actor**是模型的實體,至於**Renderer**就不多說了,**RenderWindowInteractor**是事件互動集合,也就是預設的互動事件。 引入對應的標頭檔案之後,執行專案,不出意外的話就是下面的效果。 ![執行](https://img2020.cnblogs.com/blog/1757809/202005/1757809-20200516153954764-491326321.png) ### 小結 真是不看不知道,竟然大半年都快過去了,這個學習記錄好久也沒更新了,但是在這段時間鼓搗的東西確實不少,回頭整理整理,下一步先整理下**vtkCamera**這個相機的玩意兒。