我需要能够从无序点云数据生成网格。
当我尝试实施Marching Cubes算法时,我偶然发现了这篇论文:
Bayesian Point Cloud Reconstruction
我想知道这个algorihtm是否已经在.NET中实现了。 C ++也可以......
更新
行进立方体算法的问题在于我无法将我的点云数据(基本上是一组3D点)转换为算法所需的输入体素网格数据,这是一个三维数组值介于0和1之间。
我仍然不知道如何转换它......
答案 0 :(得分:2)
我知道有两个库可以用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是一个活跃的研究领域,您将能够在线找到大量信息并实现这一想法的各种实现。祝你好运。