这个算法在3d重建中很常用,最早来自于1987年的论文《MARCHING CUBES: A HIGH RESOLUTION 3D SURFACE CONSTRUCTION ALGORITHM》。
不想重复造轮子,所以先贴几篇介绍这个算法的帖子:
Marching Cubes初探——Marching Cubes构建体素圆
看完之后基本就对这个算法有一定的了解了。
我想补充的还有几点。
1. 论文阅读
1.1 核心思想
There are two primary steps in our approach to the surface construction problem. First, we locate the surface corresponding to a user-specified value and create triangles. Then, to ensure a quality image of the surface, we calculate the normals to the surface at each vertex of each triangle.
1.2 概念名词
这篇文章经常会提到一个名词:density
。可能是3d重建领域的论文,时间跨度很大(比如这篇都很老了),对一个概念使用的名词会不统一。
思考之后,我认为它的意思类似于BundleFusion算法中的sdf值以及等值面的判断阈值。
2. 编码表的实现
Marching Cube的第一步中需要使用到二进制编码表的相关知识,还挺实用的。因为看到网上有一些文章就是在讨论Marching Cubes中这些EdgeTable,TriangleTable怎么实现比较方便。
我找到的可参考的代码,是BundleFusion中的extractIsoSurfaceAtPosition
函数。
3. 相关代码
我最近接触的项目中,使用到这个算法的有BundleFusion(C++)、tsdf-fusion(C++,python),有兴趣可以去github仔细阅读。
在tsdf-fusion-python中,我发现Marching Cubes算法已经被python-skimage库实现了,用起来很方便,功能也很全。
4. 法向量的求解
为什么我说skimage把Marching Cubes算法实现的很“全”呢?因为我发现以上我提到的使用C++实现的Marching Cube算法,似乎都没有完成第二步,即计算三角顶点的法向量。
这个原因不得而知,可能是因为不计算法向量对最终模型的结果影响不大吧,论文的表述说的也是“法向量有助于提高重建的质量”。
网上有关这个问题的介绍也比较少。
但最近我想把Marching Cubes的3d重建结果再修的好一点(自动补全,填洞),目前比较好的传统方法就是泊松重建了,但是这种泊松重建方法,必须要有法向量才能算,因此我不得不去自己想办法计算法向量。
和求解三角顶点的位置和颜色的方法类似,法向量的计算也是使用的插值。。。
(这里我还没想好怎么表述)