Marching Cubes
Marching Cubes 是一种将体积表示转换为密集网格的算法。
- 将空间划分为体素:将 3D 空间划分为体素(立方体单元)网格。每个体素的大小决定了网格的分辨率。
- 采样八个顶点位置:对于每个体素,采样八个顶点(角点)处的密度。根据其密度确定每个顶点是在表面内部还是外部。
- 确定三角形配置:每个体素有八个顶点,每个顶点有两种可能的状态(内部或外部),产生 256 种可能的配置。每种配置对应于特定的三角剖分模式。
让我们更详细地了解这些步骤。
1. 将空间划分为体素
第一步是将 3D 空间划分为体素网格。每个体素的大小将决定网格的分辨率。
2. 采样八个顶点位置
对于每个体素,算法都会采样八个顶点处的密度。根据密度,每个顶点都被分类为表面 内部
或 外部
。
3. 确定三角形配置
每个体素的八个顶点可以处于两种可能的状态,从而产生 $2^8 = 256$ 种可能的配置。每种配置对应于特定的三角剖分模式。
4. 生成网格
为了生成最终的网格,算法“遍历”每个体素并应用相应的三角形配置,因此得名“Marching Cubes”。
此过程会生成一个密集的、粗糙的网格,以近似表示体积的表面。
局限性
虽然对可视化很有用,但由于几个限制因素,Marching Cubes 网格大多不适用于游戏等生产环境。
- 多边形数量:高多边形网格需要更多的计算才能进行渲染,这会严重影响实时应用的性能。
- 边流:较差的边流会影响网格在动画时的变形方式,导致出现诸如褶皱和捏合等不良伪影。
- 纹理:密集且不规则的拓扑结构使 UV 映射和纹理变得复杂,从而导致纹理伪影。
改进
诸如 FlexiCubes 之类的技术通过允许网格顶点移动来解决一些限制,从而创建更平滑的表面。这种方法被 InstantMesh(当前 领先的 开源 3D 管道)使用。但是,生成的网格仍然过于密集,不适用于生产。
实践
清理 Marching Cubes 输出的拓扑结构通常需要比从头开始创建网格更多的时间和精力。这为 3D 机器学习应用创建了一个主要的瓶颈。如前所述,高斯散点为解决此瓶颈提供了一种潜在的解决方案。
但是,最近出现了一些工作直接解决了此瓶颈,使用可微分技术来生成具有更高质量拓扑结构的低多边形网格。这将在下一节中介绍。
< > 更新 在 GitHub 上