在有些时候,我们会遇到需要将矢量图转换成像素图的时候,比如说图形渲染管线中的「栅格化」,或是对地形生成算法生成的连续地形进行采样转化成体素形式,又或者对某个模型进行风格化的重建。
Marching Cube 就是一种能够进行这种工作的算法,能够将一个表面连续的 3D 物体进行体素化。
Marching Cube 的大概思路是这样:
- 用 3D 网格采样同时得到了一些模型内部的点(下称蓝点)和模型外部的点(下称红点)。
- 以网格中的立方体为单位进行处理,对网格中每个立方体的每条边,如果边上两点的颜色不一致,则在边中点上添加粉点。
- 将粉点连起来,得到三角面(也称等值面)。
在具体实现的时候,因为立方体顶点情况是有限的,所以通常会使用一张哈希表来缓存计算结果,从而快速构造出对应的三角面。
另外,还可以在添加粉点的时候根据 SDF 进行插值平滑,或者更一般地办法是使用切面细分来平滑。这样的效果会更好,具体做法就不展开讨论了。