需求:在主窗口加一个qvtkwidget,在这个widget里面用PCLVisualizer显示点云。
步骤:
1.创建widget和渲染器。
QVTKOpenGLNativeWidget* qvtkWidget(new QVTKOpenGLNativeWidget(this));
vtkNew<vtkRenderer> renderer;
渲染器就像一个函数,它的输入是光照,物体,相机视角,输出是一副图像。
2.创建渲染窗口,把qvtkWidget和渲染窗口关联起来。
vtkNew<vtkGenericOpenGLRenderWindow> renderWindow;
qvtkWidget->setRenderWindow(renderWindow.Get());
renderWindow->AddRenderer(renderer);
3.配置PCL Viewer
viewer.reset(new pcl::visualization::PCLVisualizer(
qvtkWidget->renderWindow()->GetRenderers()->GetFirstRenderer(),
qvtkWidget->renderWindow(),
"Viewer",
false // 不让 PCLVisualizer 创建独立的交互器
)
);
viewer->setupInteractor(qvtkWidget->interactor(), qvtkWidget->renderWindow());//连接交互器,从而能响应鼠标,键盘操作
然后把widget加到你需要的位置。比如viewerLayout->addWidget(qvtkWidget2, 0, 1);
我用到了这些头文件和宏,可能有些是多余的,建议都加上。
#include "vtkGenericOpenGLRenderWindow.h"
#include <pcl/visualization/common/actor_map.h>
#include "QVTKOpenGLNativeWidget.h"
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderWindow.h>
#include <vtkOutputWindow.h>
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingFreeType)
参考: