VTK 初识vtkRenderer

vtkRenderer

vtk的基类,也就是所有类基本继承于vtkObjectBase,Renderer也是一样,看下图,其实看源码挺好的,可以学习学习别人的思想,借鉴下充实自己。
vtkRenderer

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是事件交互集合,也就是默认的交互事件。

引入对应的头文件之后,运行项目,不出意外的话就是下面的效果。

运行

原文地址:https://www.cnblogs.com/ybqjymy/p/13925436.html