因为的只是做显示,所以打算不使用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 结果方向错了,直到搜索如何显示点集
最后一条需要翻墙才能看到,然后发现一个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是否真的能显示物体的代码……
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。