我需要能够从无序的点云数据生成网格。
当我尝试实现 Marching Cubes 算法时,我偶然发现了这篇论文:
我想知道在.NET 中是否已经有这个算法的实现。C ++也可以...
更新
行进立方体算法的问题在于,我无法将我的点云数据(基本上是一组 3D 点)转换为算法所需的输入体素网格数据,该数据是一个介于 0 和1.
还是不知道怎么转换。。。
我需要能够从无序的点云数据生成网格。
当我尝试实现 Marching Cubes 算法时,我偶然发现了这篇论文:
我想知道在.NET 中是否已经有这个算法的实现。C ++也可以...
更新
行进立方体算法的问题在于,我无法将我的点云数据(基本上是一组 3D 点)转换为算法所需的输入体素网格数据,该数据是一个介于 0 和1.
还是不知道怎么转换。。。
据我所知,有两个库在 C++ 中实现了从点云生成网格。CGAL 的网格生成模块和PCL。我知道至少 CGAL 的版本支持多种算法,但我不确定他们是否有你所指的那个。但是,如果您正在寻找行进立方体的“更平滑”替代品,您可以尝试一下。
行进多维数据集的优点是您可以通过将其移植到 GPU 来大大加快它的速度。如果您只想在行进立方体之后平滑某些东西,您可以尝试CGAL 的 Mesh 简化技术。
CGAL 确实有商业使用的许可证,而 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 是一个活跃的研究领域,您将能够在线找到大量信息以及该想法的各种实现。祝你好运。