将vtk的vtkSmartPointer<vtkCylinderSource> 类型转化为pcl::PolygonMesh::Ptr 类型,要全部是三角形的polygons
时间: 2024-06-08 20:05:53 浏览: 185
PCL:1.11.1和1.13.0 VTK:7.1.1和8.2.0 pcap:4.1.3
将vtkSmartPointer<vtkCylinderSource>类型转换为pcl::PolygonMesh::Ptr类型的过程可以分为两步:
1. 通过vtkPolyDataMapper将vtk对象转换为pcl::PointCloud<pcl::PointXYZ>对象
2. 将pcl::PointCloud<pcl::PointXYZ>对象转换为pcl::PolygonMesh::Ptr对象
具体实现代码如下:
```c++
#include <vtkPolyDataMapper.h>
#include <vtkCylinderSource.h>
#include <vtkSmartPointer.h>
#include <pcl/io/vtk_lib_io.h>
#include <pcl/point_types.h>
#include <pcl/PolygonMesh.h>
int main()
{
// 创建vtk对象
vtkSmartPointer<vtkCylinderSource> cylinder = vtkSmartPointer<vtkCylinderSource>::New();
cylinder->SetRadius(1.0);
cylinder->SetHeight(2.0);
cylinder->SetResolution(30);
cylinder->Update();
// 将vtk对象转换为pcl::PointCloud<pcl::PointXYZ>对象
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::vtkPolyDataToPointCloud(cylinder->GetOutput(), *cloud);
// 将pcl::PointCloud<pcl::PointXYZ>对象转换为pcl::PolygonMesh::Ptr对象
pcl::PolygonMesh::Ptr mesh(new pcl::PolygonMesh);
mesh->cloud = *cloud;
mesh->polygons.resize(cloud->size() - 2);
for (size_t i = 0; i < cloud->size() - 2; i++) {
pcl::Vertices vertices;
vertices.vertices.push_back(0);
vertices.vertices.push_back(i + 1);
vertices.vertices.push_back(i + 2);
mesh->polygons[i] = vertices;
}
return 0;
}
```
这里假设我们要生成的多边形网格只包含三角形,因此我们将pcl::PolygonMesh::polygons初始化为大小为点云大小减2的向量,并且每个多边形只由三个顶点组成。我们通过vtkPolyDataToPointCloud函数将vtk对象转换为pcl::PointCloud<pcl::PointXYZ>对象,然后再将其转换为pcl::PolygonMesh::Ptr对象。
阅读全文