vtkRenderer
vtk的基類,也就是所有類基本繼承於vtkObjectBase,Renderer也是一樣,看下圖,其實看源碼挺好的,可以學習學習別人的思想,借鑒下充實自己。
vtkRenderer個人理解就是個窗口渲染器,也是vtk的核心,沒了這玩意兒你沒法去操作你的vtkActor,你的vtkInteractorStyle也沒有掛載區域,具體的介紹也不多說,看資料看文檔吧(我也不會-,-||)。
引入vtk窗口
在上一篇,工程到了能正常運行的地步,但是沒有引入vtk相關的,接下來就是把vtk窗口放置到自己的qt工程的時間了。
之前的配置中已經提到這個QVTKWidget,也就是vtk的窗口,至於怎么拖拖到哪看你自己,不會的可以先鼓搗下單純的qt吧。
保存之后,我們先來運行程序看下效果,如果不出意外的話會跟我這顯示的一樣。
我們來看下輸出的信息。
vtk的新版本不再是QVTKWidget,也就是說這玩意兒沒了,一番找資料后發現,哦,原來是改名字了,新版本改成了QVTKOpenGLWidget,更改ui文件后我們再來運行程序。

可以看到圖中的vtkOutputWindow,這個窗口是vtk內置的錯誤信息彈框,也就是說有異常的時候回給你輸出信息提示,但其實你在輸出一樣能看到只是沒有這個直觀而已。
回頭看這個異常信息,也就是說沒有重寫vtkxxx,沒有綁定事件機制什么的,我們在頭文件加上下面這幾句。
#include "vtkAutoInit.h" VTK_MODULE_INIT(vtkRenderingOpenGL2); VTK_MODULE_INIT(vtkInteractionStyle); VTK_MODULE_INIT(vtkRenderingFreeType);
錯誤是解決了,不過這個窗口黑壓壓的也不知道是干啥的,不用急我們來一段Demo。
vtkSmartPointer<vtkConeSource> coneSource = vtkSmartPointer<vtkConeSource>::New(); coneSource->Update(); vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New(); polyData = coneSource->GetOutput(); vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); mapper->SetInputData(polyData); vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); actor->SetMapper(mapper); vtkSmartPointer<vtkRenderer> render = vtkSmartPointer<vtkRenderer>::New(); render->AddActor(actor); render->SetBackground(0.3, 0.3, 0.3); ui.qvtkWidget->GetRenderWindow()->AddRenderer(render); vtkSmartPointer<vtkRenderWindowInteractor> rwi = vtkSmartPointer<vtkRenderWindowInteractor>::New(); rwi->SetRenderWindow(ui.qvtkWidget->GetRenderWindow()); rwi->Initialize();
接下來簡單介紹下上面這段的意思,首先我們要先了解下opengl,大致知道模型從點到面到成像的過程,opengl教程地址。
首先我們創建一個Source,也就是點,面數據,通過DataMapper整理映射,然后Actor是模型的實體,至於Renderer就不多說了,RenderWindowInteractor是事件交互集合,也就是默認的交互事件。
引入對應的頭文件之后,運行項目,不出意外的話就是下面的效果。

