开发环境
ubuntu 20.04
VTK 8.2
编译VTK
下载源码
git clone --recursive https://gitlab.kitware.com/vtk/vtk.git
使用版本管理工具,切换版本到8.2
更改编译选项,这里使用cmake-gui进行配置
1、编译类型修改为Release
2、安装路径可以设置,也可以不设置,不设置默认安装到/usr/local目录下
3、勾选VTK_Group_Qt
4、勾选Module_vtkGUISupportQtOpenGL
生成成功后,执行编译
cmake ..
make -j4
make install
开发
CMakeLists
find_package(VTK 8.2 COMPONENTS vtkGUISupportQt
vtkGUISupportQtOpenGL
vtkRenderingGL2PSOpenGL2
vtkRenderingVolumeOpenGL2 REQUIRED)complice_module(${PROJECT_NAME})target_link_libraries( ${PROJECT_NAME} PRIVATE ${VTK_LIBRARIES}
.h
#include <QVTKOpenGLNativeWidget.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <vtkGenericOpenGLRenderWindow.h>
#include <vtkOrientationMarkerWidget.h>class CloudView : public QVTKOpenGLNativeWidget
{Q_OBJECT
public:explicit CloudView(QWidget* parent = nullptr);
private:pcl::visualization::PCLVisualizer::Ptr m_viewer;vtkSmartPointer<vtkRenderer> m_render;vtkSmartPointer<vtkGenericOpenGLRenderWindow> m_renderwindow;vtkSmartPointer<vtkOrientationMarkerWidget> m_axes;
};
.cpp
#include "cloudview.h"
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2)
VTK_MODULE_INIT(vtkRenderingFreeType)#include <vtkAxesActor.h>CloudView::CloudView(QWidget* parent): QVTKOpenGLNativeWidget(parent),m_render(vtkSmartPointer<vtkRenderer>::New()),m_renderwindow(vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New()),m_axes(vtkSmartPointer<vtkOrientationMarkerWidget>::New())
{m_renderwindow->AddRenderer(m_render);m_viewer.reset(new pcl::visualization::PCLVisualizer(m_render, m_renderwindow, "viewer", false));m_viewer->setupInteractor(this->GetInteractor(), this->GetRenderWindow());this->SetRenderWindow(m_viewer->getRenderWindow());m_viewer->setBackgroundColor((double)150.0 / 255.0, (double)150.0 / 255.0, (double)150.0 / 255.0);vtkSmartPointer<vtkAxesActor> actor = vtkSmartPointer<vtkAxesActor>::New();m_axes->SetOutlineColor(0.9300, 0.5700, 0.1300);m_axes->SetOrientationMarker(actor);m_axes->SetInteractor(m_viewer->getRenderWindow()->GetInteractor());m_axes->SetViewport(0.9, 0, 1, 0.15);m_axes->SetEnabled(true);m_axes->InteractiveOn();m_axes->InteractiveOff();m_viewer->getRenderWindow()->Render();
}void CloudView::addPointCloud(const Cloud::Ptr& cloud)
{if (!m_viewer->contains(cloud->id().toStdString()))m_viewer->addPointCloud<PointXYZRGBN>(cloud, cloud->id().toStdString());else{pcl::visualization::PointCloudColorHandlerRGBField<PointXYZRGBN> rgb(cloud);m_viewer->updatePointCloud<PointXYZRGBN>(cloud, rgb, cloud->id().toStdString());}if (cloud->pointSize() != 1)m_viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,cloud->pointSize(), cloud->id().toStdString());if (cloud->opacity() != 1)m_viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_OPACITY,cloud->opacity(), cloud->id().toStdString());m_viewer->getRenderWindow()->Render();
}
ui上拖拽一个openGl控件, 然后提升为CloudView,然后就可以显示点云数据了
PointCloud::Ptr pointPtr;ui->cloudview->addPointCloud( cloud);
ui->cloudview->resetCamera();
显示效果