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

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

    运行

  • 相关阅读:
    2018.9月总结
    L143 Seasonal 'Plague' Hits College Freshman
    2018.9.28 长难句2-非简单句
    Report: Disappearing Wetlands Put Planet Life at Risk
    PyQt(Python+Qt)学习随笔:QTableWidget的currentItem、rowCount、columnCount等部件状态属性访问方法
    PyQt(Python+Qt)学习随笔:QTableWidget的构造方法
    PyQt学习随笔:QTableWidgetItem项的setSizeHint()方法的作用
    PyQt(Python+Qt)学习随笔:QTableWidget中表格各列平均分配宽度的两种方法
    PyQt学习随笔:QTableWidget项sizeHint的作用以及与QHeadView的sectionResizeMode、ResizeToContents的关系
    PyQt(Python+Qt)学习随笔:QTableWidget表格部件中行高和列宽的计算方式
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/13925436.html
Copyright © 2020-2023  润新知