来源:Mario Botsch 等人的 Polygon Mesh Processing,第 3 章 Differential Geometry,3.2 小节 Surfaces。
3.1 曲线 讲了平面曲线的长度和曲率。3.2 把这些概念推广到嵌入在 R3 中的光滑曲面。
这一节是后续离散微分算子的基础。3.3 中的三角网格法向、曲率、Laplace-Beltrami 离散化,都在模拟本节这些连续概念。
本节核心
曲线只有一个参数:
x(u)
曲面有两个参数:
x(u,v)=x(u,v)y(u,v)z(u,v)
其中:
(u,v)∈Ω⊂R2
也就是说,曲面可以看成从二维参数域 Ω 到三维空间的映射:
x:Ω→S⊂R3
本节主要回答:
- 曲面上的长度、角度、面积如何计算?
- 曲面的弯曲程度如何定义?
- 曲线曲率如何推广成曲面的主曲率、平均曲率和高斯曲率?
- Laplace-Beltrami 算子和平均曲率有什么关系?
3.2.1 曲面的参数化表示
书中用“世界地图”来解释曲面参数化。
把地球表面展开成地图,本质上是在找一个二维参数域:
(θ,ϕ)
来描述球面上的点。
球面的参数方程可以写成:
x(θ,ϕ)=RcosθcosϕRsinθcosϕRsinϕ
其中:
θ∈[0,2π],ϕ∈[−π/2,π/2]
R 是球半径。
这里:
- θ 类似经度。
- ϕ 类似纬度。
参数方程和隐式方程的区别
同一个球面也可以用隐式方程表示:
x2+y2+z2=R2
二者回答的问题不同。
| 表示 | 用途 |
|---|
| 参数方程 | 给定 (θ,ϕ),生成球面上的点 |
| 隐式方程 | 给定 (x,y,z),判断它是否在球面上 |
也就是:
parametric: parameters -> surface point
implicit: space point -> on surface?
这和第 1 章中的参数表示 / 隐式表示是一致的。
iso-parameter curves
参数曲面上有两类自然曲线。
固定 θ:
θ=constant
得到 iso-θ curves。对球面来说,它们是经过两极的经线。
固定 ϕ:
ϕ=constant
得到 iso-ϕ curves。对球面来说,它们是纬线。
在参数域里,iso-curves 是横竖网格线;映射到曲面后,它们显示参数化如何拉伸和扭曲曲面。
观察 iso-parameter grid 是理解参数化失真的好方法。球面地图在两极附近会严重扭曲,就是因为二维矩形参数域无法无失真地铺到球面上。
3.2.2 Metric Properties
曲线的 metric 由一阶导数 x′(u) 决定。
曲面的 metric 由两个偏导数决定:
xu=∂u∂x
xv=∂v∂x
它们分别是两条 iso-parameter curve 的切向量。
切平面和法向量
在曲面点 x(u0,v0) 处,两个切向量:
xu,xv
张成 tangent plane。
参数化 regular 的条件是:
xu×xv=0
也就是说,两个切向量不能共线或退化。
曲面单位法向量为:
n=∥xu×xv∥xu×xv
这和三角形法向的计算非常像:两个边向量叉乘,再归一化。
参数域方向到曲面切向量
设参数域中有方向:
wˉ=[uwvw]
在参数域中沿这条方向走:
(u,v)=(u0,v0)+twˉ
映射到曲面上得到一条曲线:
Cw(t)=x(u0+tuw, v0+tvw)
它在 t=0 处的切向量为:
w=∂t∂Cw(t)
由链式法则:
w=xuuw+xvvw
也可以写成矩阵形式:
w=Jwˉ
其中 Jacobian 为:
J=∂u∂x∂u∂y∂u∂z∂v∂x∂v∂y∂v∂z=[xuxv]
为什么满足 w = J w-bar?
曲面参数化是一个向量值函数:
x(u,v)=x(u,v)y(u,v)z(u,v)参数域中的方向为:
wˉ=[uwvw]沿这个方向走一条参数域中的直线:
u(t)=u0+tuw,v(t)=v0+tvw映射到曲面上得到曲线:
Cw(t)=x(u(t),v(t))曲面上的切向量就是这条曲线在 t=0 处的导数:
w=dtdCw(t)t=0=dtdx(u(t),v(t))t=0对向量函数逐坐标使用链式法则:
dtdx=∂u∂xdtdu+∂v∂xdtdv因为:
dtdu=uw,dtdv=vw所以:
w=xuuw+xvvw把 xu 和 xv 作为矩阵的两列:
J=[xuxv]则矩阵乘法给出:
Jwˉ=[xuxv][uwvw]=xuuw+xvvw因此:
w=Jwˉ直观地说,J 的两列分别表示“参数 u 增加一点时曲面点往哪里动”和“参数 v 增加一点时曲面点往哪里动”。任意参数方向 wˉ=(uw,vw)T 都是这两个基本方向的线性组合,所以曲面上的切向量也是 xu 和 xv 的同样线性组合。
所以 J 可以看作从参数域方向到曲面切向量的线性映射。
第一基本形式
Jacobian 不只把方向映射到切向量,它还编码了曲面的 metric。
第一基本形式定义为:
I=JTJ=[EFFG]
其中:
E=xuTxu
F=xuTxv
G=xvTxv
第一基本形式本质上是参数域上的一个内积矩阵。
给定参数域中的方向 wˉ,曲面上对应切向量长度平方为:
∥w∥2=wˉTIwˉ
因此它可以用来测量:
也常被称为 metric tensor。
曲面上曲线的长度
设参数域中有一条曲线:
u(t)=[u(t)v(t)]
它映射到曲面上:
x(u(t))
其切向量为:
dtdx(u(t))=xuut+xvvt
曲线长度为:
l(a,b)=∫ab[utvt]I[utvt]dt
展开为:
l(a,b)=∫abEut2+2Futvt+Gvt2dt
这就是第一基本形式用于测量曲面上曲线长度的方式。
曲面面积
参数区域 U⊆Ω 映射到曲面上,对应面积为:
A=∬Udet(I)dudv
为什么面积元素是 sqrt(det(I)) du dv?
参数区域里的一个很小矩形可以写成:
[u,u+du]×[v,v+dv]它在参数域中的两条边方向分别是:
[du0],[0dv]经过曲面参数化 x(u,v) 映射到三维空间后,这两条小边近似变成两个切向量:
xudu,xvdv所以曲面上的这个小面积片,局部近似为由 xudu 和 xvdv 张成的小平行四边形。它的面积是:
dA=∥xudu×xvdv∥把标量 du,dv 提出来:
dA=∥xu×xv∥dudv接下来把这个结果和第一基本形式联系起来。第一基本形式为:
I=[EFFG]其中:
E=xu⋅xu,F=xu⋅xv,G=xv⋅xv因此:
det(I)=EG−F2=∥xu∥2∥xv∥2−(xu⋅xv)2而两个向量叉乘面积满足:
∥a×b∥2=∥a∥2∥b∥2−(a⋅b)2令 a=xu,b=xv,就得到:
∥xu×xv∥2=EG−F2=det(I)所以局部面积元素为:
dA=det(I)dudv对整个参数区域 U 积分,就得到:
A=∬Udet(I)dudv直观地说,I=JTJ 记录了参数域里的长度和角度在曲面上如何被拉伸;det(I) 记录的是面积缩放的平方,所以真正的面积缩放因子是 det(I)。
由于:
det(I)=EG−F2
所以:
A=∬UEG−F2dudv
这个公式也等价于:
A=∬U∥xu×xv∥dudv
因为:
∥xu×xv∥2=EG−F2
数值例子:平面参数化
设一个平面 patch:
x(u,v)=2u3v0
偏导为:
xu=200,xv=030
所以:
E=xuTxu=4
F=xuTxv=0
G=xvTxv=9
第一基本形式为:
I=[4009]
单位参数方向 (1,0)T 映射后长度为 2。
单位参数方向 (0,1)T 映射后长度为 3。
一个单位参数正方形 [0,1]×[0,1] 的曲面面积为:
A=EG−F2=36=6
它确实变成了 2×3 的矩形。
Anisotropy:各向异性
参数域中的一个小圆,通过参数化映射到曲面后,一般会变成一个小椭圆。
这个椭圆叫 anisotropy ellipse。
它描述参数化在不同方向上拉伸得是否一样。
第一基本形式 I 的特征向量给出主拉伸方向,特征值给出拉伸量平方。
设 I 的特征值为:
λ1,λ2
则对应的伸缩因子为:
σ1=λ1,σ2=λ2
它们也是 Jacobian J 的 singular values。
如果:
σ1=σ2
说明局部各方向伸缩相同。
如果:
σ1≫σ2
说明参数化在某个方向被强烈拉伸,局部失真大。
参数化质量常常可以从 J 或第一基本形式的奇异值看出来:奇异值越接近,局部越接近等距或保角;差异越大,各向异性越强。
3.2.3 曲面曲率
曲线曲率衡量曲线怎么弯。
曲面有无穷多个切方向,因此要考虑每个切方向上的弯曲。
给定曲面点 p 和一个切向量 t,取由 t 和法向 n 张成的平面。
这个平面与曲面相交,得到一条平面曲线,叫 normal section。
这条 normal section 在 p 处的曲率,叫该方向的 normal curvature:
κn(tˉ)
第二基本形式
曲面曲率需要二阶导数。
二阶偏导为:
xuu,xuv,xvv
第二基本形式定义为:
II=[effg]
其中:
e=xuuTn
f=xuvTn
g=xvvTn
第一基本形式描述 metric,第二基本形式描述法向方向上的弯曲。
Normal curvature 公式
设参数域中的切方向为:
tˉ=[utvt]
则 normal curvature 为:
κn(tˉ)=tˉTItˉtˉTIItˉ
展开:
κn(tˉ)=Eut2+2Futvt+Gvt2eut2+2futvt+gvt2
它是“二阶弯曲量”除以“一阶 metric 长度量”。
主曲率和主方向
在一个曲面点处,normal curvature 随切方向变化。
其中最大值和最小值称为 principal curvatures:
κ1,κ2
通常约定:
κ1=maximum curvature
κ2=minimum curvature
对应的切方向称为 principal directions:
t1,t2
如果:
κ1=κ2
主方向是唯一的,并且互相正交。
如果:
κ1=κ2
该点称为 umbilical point,所有方向都可以看成主方向。
球面上每一点都是 umbilical point,因为各个方向弯曲一样。
平面上每一点也是 umbilical point,因为各个方向曲率都为 0。
Euler theorem
Euler 定理说明:任意方向的 normal curvature 都由两个主曲率决定。
如果 ψ 是切方向 t 与主方向 t1 的夹角,则:
κn(tˉ)=κ1cos2ψ+κ2sin2ψ
这说明任意方向曲率都是 κ1 和 κ2 的组合。
因此,只要知道两个主曲率和主方向,就知道该点全部方向上的弯曲行为。
曲率张量
局部曲率也可以用 curvature tensor 表示。
它是一个对称 3×3 矩阵 C。
其特征值为:
κ1,κ2,0
对应特征向量为:
t1,t2,n
如果:
P=[t1t2n]
并且:
D=diag(κ1,κ2,0)
则:
C=PDP−1
这个表示把“两个切向曲率 + 法向无曲率”统一写成矩阵形式。
平均曲率
Mean curvature 定义为两个主曲率的平均:
H=2κ1+κ2
它在几何处理中非常重要,例如:
- smoothing。
- fairing。
- mean curvature flow。
- Laplace-Beltrami 离散化。
平均曲率可以理解为曲面整体弯曲趋势。
高斯曲率
Gaussian curvature 定义为两个主曲率的乘积:
K=κ1κ2
它可以用来分类曲面点。
| 条件 | 类型 | 几何直觉 |
|---|
| K>0 | elliptic point | 两个方向同号,局部像碗或帽子 |
| K<0 | hyperbolic point | 两个方向异号,局部像马鞍 |
| K=0 | parabolic point | 至少一个方向曲率为 0,常在区域分界上 |
数值例子
如果:
κ1=2,κ2=1
则:
H=22+1=1.5
K=2×1=2>0
这是 elliptic point。
如果:
κ1=2,κ2=−1
则:
H=22−1=0.5
K=2×(−1)=−2<0
这是 hyperbolic point,也就是马鞍区域。
Intrinsic geometry
只依赖第一基本形式 I 的性质称为 intrinsic。
直观上,intrinsic geometry 是“生活在曲面上的二维生物”不看三维空间也能测到的性质。
例如:
- 曲面上曲线的长度。
- 曲面内角度。
- 曲面上两点沿表面的距离。
Gauss 的 Theorema Egregium 表明:高斯曲率 K 是 intrinsic 的。
也就是说,高斯曲率可以仅由第一基本形式决定。
但平均曲率 H 不是 intrinsic 的,它依赖曲面在三维空间中的嵌入方式。
一个经典直觉是:纸张可以从平面卷成圆柱,局部距离不变,但平均曲率变了;高斯曲率仍为 0。
Laplace 和 Laplace-Beltrami
后续章节会频繁使用 Laplace operator 和 Laplace-Beltrami operator。
在平面上,对函数 f(u,v):
Δf=fuu+fvv
它也可以写成:
Δf=div∇f
为什么 Laplace 可以理解为“散度作用在梯度上”?
先看平面上的标量函数:
f(u,v)它的梯度是:
∇f=[fufv]梯度 ∇f 是一个向量场。它告诉我们:在每个点上,函数 f 增长最快的方向是什么,以及增长有多快。
例如把 f 想成地形高度,那么 ∇f 指向“上坡最快”的方向。
散度作用在一个向量场上。若有向量场:
V(u,v)=[V1(u,v)V2(u,v)]它的散度是:
divV=∂u∂V1+∂v∂V2散度衡量的是:这个向量场在某个点附近整体上是“向外流出”还是“向内汇入”。
现在令向量场就是函数的梯度:
V=∇f=[fufv]那么:
div∇f=∂u∂fu+∂v∂fv也就是:
div∇f=fuu+fvv=Δf所以 Laplace operator 可以理解为两步:
- 先用 ∇f 找到函数往哪里增长。
- 再用 div 看这个增长趋势是否在局部扩散或汇聚。
如果 Δf>0,通常表示该点附近像一个局部“谷底”,周围平均值比它大;如果 Δf<0,通常表示该点附近像一个局部“山顶”,周围平均值比它小。
在网格处理中,这个理解很重要:离散 Laplace 算子常常可以看作“当前点和邻域平均之间的差异”。
Laplace-Beltrami operator 是 Laplace operator 在曲面上的推广:
ΔSf=divS∇Sf
它作用在定义于曲面上的函数。
曲面上的梯度和散度是什么意思?
在曲面上,函数 f 不再定义在普通平面上,而是定义在曲面 S 上:
f:S→R曲面梯度记作:
∇Sf它仍然表示 f 增长最快的方向,但这个方向必须贴在曲面上,也就是位于切平面中。
换句话说,∇Sf 不是指向三维空间任意方向,而是沿着曲面表面走时,函数增长最快的切向方向。
曲面散度记作:
divSV其中 V 是曲面上的切向量场。它衡量这个切向量场沿着曲面本身是向外扩散,还是向内汇聚。
因此:
ΔSf=divS∇Sf含义就是:
- 先在曲面上求 f 的最快变化方向。
- 再看这个变化方向场在曲面上如何扩散或汇聚。
和普通 Laplace 的区别在于:曲面上的长度、角度、面积不是由平面坐标直接决定,而是由第一基本形式 I 决定。因此 ∇S 和 divS 必须考虑曲面的 metric。
这也是为什么 Laplace-Beltrami 算子虽然形式上仍然是:
divS∇S但它比普通平面 Laplace 多了曲面几何信息。
Laplace-Beltrami 和平均曲率法向
当 Laplace-Beltrami operator 作用在曲面坐标函数 x 上时,有重要关系:
ΔSx=−2Hn
右侧称为 mean curvature normal。
这条公式在网格处理中非常关键。
因为后续离散 Laplace-Beltrami 算子可以用来近似:
Hn
也就是平均曲率法向。
这也是 mesh smoothing、fairing、curvature flow 等算法的基础。
虽然 ΔSx 和平均曲率有关,而平均曲率依赖三维嵌入;但 Laplace-Beltrami 算子本身是 intrinsic 的,它只依赖曲面的 metric。
和 3.1 的关系
3.1 中,曲线的长度由一阶导数决定:
l=∫∥x′(u)∥du
3.2 中,曲面上的长度、角度、面积由第一基本形式决定:
I=JTJ
3.1 中,曲线曲率由二阶导数决定:
κ=∥x′′(s)∥
3.2 中,曲面曲率由第二基本形式和第一基本形式共同决定:
κn=tˉTItˉtˉTIItˉ
曲线只有一个弯曲方向;曲面有无穷多个切方向,因此需要主曲率来概括。
本节记忆点
x(u,v):Ω→S⊂R3
- 两个偏导 xu,xv 张成切平面。
- 曲面法向为:
n=∥xu×xv∥xu×xv
J=[xu,xv]
I=JTJ=[EFFG]
EG−F2dudv
II=[effg]
κn=tˉTItˉtˉTIItˉ
- 主曲率是 normal curvature 的最大值和最小值。
- 平均曲率:
H=2κ1+κ2
K=κ1κ2
- Laplace-Beltrami 与平均曲率法向的关系:
ΔSx=−2Hn
后续问题
进入 3.3 时可以重点关注:
- 三角网格是 piecewise linear surface,为什么不能直接使用连续二阶导数?
- 离散法向如何由邻域三角形平均得到?
- 离散 Gaussian curvature 如何由角缺陷 angle deficit 得到?
- 离散 Laplace-Beltrami 的 cotangent weights 从哪里来?