我需要能够从无序的点云数据生成网格。
当我尝试实现 Marching Cubes 算法时,我偶然发现了这篇论文:
Bayesian Point Cloud Reconstruction
我想知道是否已经在 .NET 中实现了该算法。 C++ 也可以...
更新
行进立方体算法的问题是我无法将我的点云数据(基本上是一组 3D 点)转换为算法需要的输入体素网格数据,这是一个三维值数组介于 0 和 1 之间。
我还是不知道怎么转换...
最佳答案
据我所知,有两个库使用 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 ,实现起来可能很乏味,但非常高效。您可以在其上运行行进立方体。
点云 - 体素集对偶性是一个活跃的研究领域,您可以在网上找到大量信息以及该想法的各种实现。祝你好运。
关于algorithm - 贝叶斯点云重建实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19098995/