Signed Distance Function(SDF)可视化页面

这个页面通过一个圆形障碍物 demo,展示 SDF 在几何表达、内外分类、最近点搜索、法向计算、零等值面与窄带判定中的整体工作过程, 并给出它与 OpenFOAM 中 searchableSurface、signedDistance、wallDist、isoSurface、IBM/Level-Set 思路之间的对应关系。

使用边界:这是二维圆形的教学模型,用于理解 SDF 的几何关系和数量级,不是 STL/CAD、复杂拓扑或 OpenFOAM 求解器的数值验证。 页面中的 OpenFOAM 名称用于概念对照;具体类、函数和可用性会随版本、库与求解器而变化。

定义

φ(x) = s(x) · d(x, Γ) 其中 d(x, Γ) = min ||x - y||, y ∈ Γ
Γ 为几何边界,符号 s(x) 用于区分 inside / outside。

符号约定

φ(x) < 0 inside φ(x) = 0 on interface φ(x) > 0 outside
本页面采用“内部为负,外部为正”的常见约定。

法向与界面

n = ∇φ / |∇φ| Γ = { x | φ(x) = 0 }
法向可以直接由 SDF 梯度得到,零等值面就是界面。

整体流程

1

定义几何

先给出一个几何边界 Γ。这里用一个圆形障碍物代替一般三角面片或 CAD 几何。

2

查询最近点

对于任意采样点 x,找到边界 Γ 上的最近点 xΓ,并得到无符号距离 d(x, Γ)。

3

判断内外

根据点位于 solid 还是 fluid 的哪一侧,确定符号 s(x)。

4

构造 SDF

得到有符号距离场 φ(x)=s(x)d(x,Γ)。内部为负,外部为正,界面为零。

5

提取几何信息

用 ∇φ/|∇φ| 计算法向,用 φ=0 得到界面,用 |φ|<ε 得到窄带。

6

进入应用

可用于 immersed boundary、level set、界面重构、网格/壁面距离计算与拓扑优化等。

交互 Demo

主场图:SDF 场、零等值面、最近点、法向与窄带

你的浏览器不支持 Canvas,无法显示 SDF 场。
蓝色:φ < 0(solid 内部) 白色:φ = 0(界面) 红色:φ > 0(fluid 外部)

当前采样点信息

采样点 x
最近点 xΓ
无符号距离 d
符号 s
SDF 值 φ
法向 n
分类

本 demo 演示的“生效流程”

1) 选取一个采样点 x 2) 计算到圆边界 Γ 的最近点 xΓ 3) 计算无符号距离 d = ||x - xΓ|| 4) 判断 x 在圆内还是圆外 5) 组合得到 φ = s · d 6) 用 φ 的符号区分 solid / fluid 7) 用 φ = 0 表示几何界面 8) 用 |φ| < ε 表示界面窄带 9) 用 n = ∇φ / |∇φ| 表示外法向 10) 这些量可进一步用于 IBM / Level Set / 几何重构

OpenFOAM 对应思路

几何对象 → searchableSurface / triSurface / plane 最近点查询 → findNearest(...) 内外判断 → getVolumeType(...) 有符号距离 → 依版本/求解器而异的 signed-distance 工作流 零等值面 → isoSurface / cutFaceIso / cutCellIso 传播/距离场 → wallDist / meshWave / FaceCellWave 法向 → 由几何法向或 ∇φ 归一化得到 IBM / Level-Set → 用 φ 做固液/流固分类和界面定位

剖面图:沿 y = cy 的一维 SDF 分布

你的浏览器不支持 Canvas,无法显示 SDF 剖面图。

与 OpenFOAM 的对应理解

1. 几何查询层

如果把这里的圆换成 STL / triSurface,那么“最近点”和“inside/outside 判断”就对应 `searchableSurface` 体系的功能。你可以把这一层理解为 SDF 构造的几何基础设施。

2. 距离场层

当你把几何查询结果推广到整片网格或控制体时,就会得到 pointDistance、cellDistance、 wallDist 等距离场。若再附加符号,就得到严格意义上的 signed distance field。

3. 界面与应用层

零等值面可表示 immersed boundary、level-set 界面、拓扑优化边界或局部重构界面。 对于 IBM,常见做法是用 φ 的符号确定流体/固体位置,用梯度得到法向和投影方向。