因为的只是做显示,所以打算不使用PCL,直接使用VTK做显示。
VTK显示的基本逻辑就是原始数据(source/reader) -> [filter ->] ->mapper ->actor -> render ->windows
就是所谓的管线结构,其中filter 是可以有,可以无的,使用的智能指针是VTK自己封装的vtkSmartPointer的模板类,含有一个静态成员函数::New() 能够生成新对象。
有一个坑是,vtk8.1里面qvtkwidget是弃用了,但是编译的插件还是QVtkWidget,你细品,到底是让用还是不让用呢,让用你倒是给一个dll插件让我好好用啊,结果是没有,只能用QOpenglwidget类型提升上QVTKOpenGLWidget
然后就是Renderwindow变了,得用vtkGenericOpenGLRenderWindow,但是Render还是可以用之前的Render,出于保险起见我查了下,还真有OPENGLRender,但是看到的教程里面都没有这么用,就没折腾。不用手动添加intearactor,猜测renderwindow已经封装进去了(qvtkopenglwidget你看看人家)。
最后就是模仿pcl的函数。
读取xxxReader
关灯actor->GetProperty()->LightingOff()
相机复位 Render->resetCamera()
最大的坑还在后面
当ply中只有点,没有面的时候没有显示?因为polydata中缺少拓扑结构,需要指明它为0维的vertix 顶点元素,需要使用一个filter,我去搜PointCloudFilter 结果方向错了,直到搜索如何显示点集
image.png
最后一条需要翻墙才能看到,然后发现一个vtkVertexGlyphFilter可以完成这个任务。

#if 1
    //正常的加载
    vtkSmartPointer<vtkPLYReader> reader =
        vtkSmartPointer<vtkPLYReader>::New();

    reader->SetFileName(filename.toLocal8Bit());
    reader->Update();
    
    vtkSmartPointer <vtkPolyData> polydata = reader->GetOutput();
    //没有拓扑结构 需要filter 加入 形成vertex 的拓扑 之前的话是只有点的
    auto vertexGlyphFilter = vtkSmartPointer<vtkVertexGlyphFilter>::New();
    vertexGlyphFilter->AddInputData(polydata);
    vertexGlyphFilter->Update();
    mapper =
        vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputConnection(vertexGlyphFilter->GetOutputPort());
    mapper->Update();
    vtkSmartPointer<vtkActor> actor =
        vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);
#else
    //使用模型代替
    vtkSmartPointer<vtkCylinderSource> cylinder =
    vtkSmartPointer<vtkCylinderSource>::New();
    cylinder->SetHeight(3.0);
    cylinder->SetRadius(1.0);
    cylinder->SetResolution(10);
    vtkSmartPointer<vtkPolyDataMapper> cylinderMapper =
    vtkSmartPointer<vtkPolyDataMapper>::New();
    cylinderMapper->SetInputConnection(cylinder->GetOutputPort());
    vtkSmartPointer<vtkActor> actor =
    vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(cylinderMapper);
#endif
    _renderer->AddActor(actor);
    _renderer->ResetCamera();
    _renderWindow->Render();

其中的_renderer_renderWindow是成员变量,当然你通过window获取也可以。条件编译是我在万念俱灰下质疑VTK是否真的能显示物体的代码……


程某有一计
28 声望7 粉丝

本科机械,半路转行C++,在掉头发的边缘疯狂试探。