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是事件交互集合,也就是默认的交互事件。
引入对应的头文件之后,运行项目,不出意外的话就是下面的效果。