- 【3D入门-指标篇上】3D 网格重建评估指标详解与通俗比喻
- 【3D入门-指标篇下】 3D重建评估指标对比-附实现代码
- 【3D 入门-3】常见 3D 格式对比,.glb / .obj / .stl / .ply
- 【3D 入门-4】trimesh 极速上手之 3D Mesh 数据结构解析(Vertices / Faces)
- 【3D 入门-5】trimesh 极速上手之 Hunyuan3D-2.1 中的“非水密网格“处理流程
- 先有 SDF 描述形状内外(上图右侧白色到黑色的坐标),再由 Marching Cube (上图中的红色多面体是由一个个 cube 组成的)生成网格
- 图片来源:https://www.youtube.com/watch?v=M3iI2l0ltbE
一、什么是SDF?(Signed Distance Field,有向距离场)
1. 基础概念
SDF是一种描述空间中每个点与某个形状距离的数学工具。简单来说:
- 对于空间中的任意一点,SDF会计算它到某个物体表面的最短距离,并且用“正负号”表示点在物体的内部还是外部:
- 如果点在物体外部,距离为正数;
- 如果点在物体内部,距离为负数;
- 如果点正好在物体表面上,距离为0。
举个例子:
比如一个半径为1的球体,球心在原点(0,0,0)。对于空间中的点P(x,y,z),它的SDF值就是:
S
D
F
(
P
)
=
x
2
+
y
2
+
z
2
−
1
SDF(P) = \sqrt{x^2 + y^2 + z^2} - 1
SDF(P)=x2+y2+z2−1
- 当P在球外时(比如(2,0,0)),距离是2-1=1(正数);
- 当P在球内时(比如(0.5,0,0)),距离是0.5-1=-0.5(负数);
- 当P在球面上时(比如(1,0,0)),距离是0(表面)。
2. 为什么SDF很重要?
- 简洁描述形状:用数学公式就能表示复杂形状,比如球体、立方体甚至更复杂的物体。
- 方便计算:通过SDF可以快速判断点与物体的位置关系,这在3D建模、游戏渲染、物理模拟中很常用。
二、什么是Marching Cube算法?(移动立方体算法)
1. 算法的目标
Marching Cube算法的核心是:将SDF表示的形状,转换为计算机能显示的三角形网格(3D模型的基本组成单元)。
2. 工作原理(类比“切豆腐”)
假设我们有一块“豆腐”(代表3D空间),里面藏着一个用SDF描述的形状。算法的步骤如下:
-
第一步:划分网格
将3D空间分成许多小立方体(像切豆腐一样切成小方块),每个小立方体的顶点都有一个SDF值(正或负)。 -
第二步:判断表面位置
对于每个小立方体,观察它的8个顶点的SDF值:- 如果顶点的SDF是正数,说明它在形状外部;
- 如果是负数,说明在形状内部。
当相邻顶点的SDF值一正一负时,说明形状的表面穿过这两个顶点之间的边,需要计算表面与边的交点。
-
第三步:生成三角形
根据小立方体中顶点的正负分布,找到所有表面与边的交点,然后将这些交点连接成三角形。这些三角形拼接起来,就形成了形状的表面网格。
举个例子:
如果一个小立方体的4个顶点在形状内部(SDF负),4个在外部(SDF正),那么它的表面可能穿过某些边,算法会计算这些边上的交点,并把交点连成三角形,覆盖形状的表面。
三、两者的关系:SDF + Marching Cube = 3D模型生成
- SDF就像“蓝图”,用数学方式描述形状的内外;
- Marching Cube就像“施工队”,根据蓝图(SDF的正负值)把形状“雕刻”出来,变成计算机能显示的三角形网格。
四、生活中的类比
- SDF:像地图上的等高线,每个点的海拔(正负)表示它在山的内部还是外部。
- Marching Cube:像用积木搭建城堡,根据每个积木块的位置和形状,决定哪些积木需要被用来搭建表面,最终组成城堡的样子。
五、为什么这两个概念很重要?
- SDF在游戏中常用于“碰撞检测”(比如角色是否碰到墙壁),或生成动态形状(如水流、烟雾);
- Marching Cube是3D建模中生成复杂曲面的经典算法,比如医学图像(CT扫描)重建人体器官,或游戏中生成地形和物体模型。
如果想进一步理解,可以想象用无数小方块“包裹”一个苹果,每个方块根据苹果的形状(SDF)决定如何切割表面,最终用三角形拼成苹果的3D模型——这就是Marching Cube在做的事情~