PCL库中Marching Cubes(移动立方体)算法解析
1. Marching Cubes算法的原理这里不再赘述,不懂的话,提供一下文献资源:
链接:MARCHING CUBES A HIGH RESOLUTION 3D SURFACE CONSTRUCTION ALGORITHM.pdf
提取码:n0wb
或者看这里的讲解:MarchingCubes算法提取等值面的基本原理
2. 提供一下PCL里面的源码,有需要的可以下载:
链接:marchingCubes.zip
提取码:oyw1
打开之后,有四个文件:
marching_cubes文件中实现了marching_cubes类,实现了大部分的Marching Cubes算法,但它是一个抽象类,不可实例化。
marching_cubes_hoppe文件实现了marching_cubes_hoppe类,继承自marching_cubes,实现了marching_cubes中的纯虚函数vexelizeData(),可以实例化。
3. 此篇博文是参考下面博文得出的,希望能讲的更透彻一些
—————————————————————————————————————————————————————————————
—————————————————————————————————————————————————————————————
下面我们开始正式分析PCL中Marching Cubes的实现方案。
步骤:点云数据体素化->确定顶点与等值面的关系->确定等值面与voxel各个边的交点->根据交点划分三角面。
4. 打开marching_cubes.h,找到顶点编号图
这个主要是帮助我们理解算法,8个顶点,12条边,都有各自的编号。更具体的如下图:
5. 打开marching_cubes.hpp,找到performReconstruction()函数。
这里是主函数体,通过调用具体的实现函数,完成了从点云数据到三角面的转换操作。
// 输入参数:无
// 输出参数:1. points:重建得到的三角面,以点序列的形式存储,每三个点代表一个三角面
// 2. polygons:三角面之间的连接关系,对理解算法基本无帮助
template <typename PointNT> void
pcl::MarchingCubes<PointNT>::performReconstruction (pcl::PointCloud<PointNT> &points,
std::vector<pcl::Vertices> &polygons)
{
// iso_level_:等值面的数值,用于判定网格点的两种状态(即在等值面的内外)。
//这里为什么限