据我所知,有两个库可以在 C++ 中实现从点云生成网格。 CGAL's Mesh Generation 模块和PCL。我知道至少 CGAL 的版本支持多种算法,但我不确定他们是否有你所指的那个。但是,如果您正在寻找行进立方体的“更平滑”替代品,您可以尝试一下。
移动方块的优点是可以大大加快速度by porting it to the GPU。如果你想在行进立方体之后平滑一些东西,你可以试试CGAL's Mesh simplification techniques.
CGAL 确实有一个license 用于商业用途,而 PCL 是在 BSD 下发布的,所以是免费的。
更新:
将点云转换为体素网格很简单,前提是您有足够的内存以必要的粒度制作网格。例如,如果您需要每个单元一个体素并覆盖 256^3 的空间,并且您有足够的内存可用,那么您只需创建一个 256^3 的二进制数组,并将云中任何一个点设置为 1。
如果您需要更高的粒度(例如每 0.1 个单元一个体素)或需要覆盖更多空间(1024^3),并且如果您没有足够的内存,那么您需要更智能的方法。
我能想到的一个选择是对您的点云进行排序并一次将其分成三个切片。假设您沿 z 对点进行排序,并说您的粒度为 0.1 个单位。你的方块移动算法可以是这样的:
for z in (minz to maxz in steps of 0.1) { //We want to do marching cubes on z-1, z, z+1
FreeVoxelSet(z-2) //This will free the voxel slice at z-2 from previous iteration
CreateVoxelSet(z+1) //This step will go through your sorted point cloud and voxelate all points between z and z+1
DoMarchingCubes(z) //You have z-1, z (from prev iterations) and z+1(this iter)
}
还有Sparse Voxel Octrees,实现起来可能很乏味,但效率很高。您可以在其上运行行进立方体。
Point Cloud - Voxel Set duality 是一个活跃的研究领域,您将能够在网上找到大量信息以及该想法的各种实现。祝你好运。