图形学笔记 - 4. 几何 - 基本表示方法及曲线和曲面
几何例子
曲面
复杂
布料
水滴、流体,模拟。
东西多,几何存储
毛发,复杂几何
近距离
二维
表示几何的许多方法
Implicit 隐式
- 代数曲面
- 水平集
- 距离函数
Explicit 显式
- 点云
- 多边形网格
- 细分subdivision,NURBS
每种选择最适合不同的任务/几何类型
几何的“隐式”表示
基于分类点
- 点满足某种特定的关系
例如球体:在3D中 x 2 + y 2 + z 2 = 1 x^2+y^2+z^2 = 1 x2+y2+z2=1的所有点
更一般地说, f ( x , y , z ) = 0 f(x,y,z) = 0 f(x,y,z)=0
采样很难
f
(
x
,
y
,
z
)
=
(
2
−
x
2
+
y
2
)
2
+
z
2
−
1
f(x,y,z)=(2-\sqrt{x^2+y^2})^2+z^2-1
f(x,y,z)=(2−x2+y2)2+z2−1
f
(
x
,
y
,
z
)
=
0
f(x,y,z) = 0
f(x,y,z)=0上有哪些点?
有些任务很难使用隐式表示
内部/外部测试简单
f
(
x
,
y
,
z
)
=
x
2
+
y
2
+
z
2
−
1
f(x,y,z)=x^2+y^2+z^2-1
f(x,y,z)=x2+y2+z2−1
(
3
/
4
,
1
/
2
,
1
/
4
)
(3/ 4,1 /2, 1/4)
(3/4,1/2,1/4)在里面吗
直接带入:
f
(
x
,
y
,
z
)
=
–
1
/
8
<
0
f(x,y,z) = –1/8 < 0
f(x,y,z)=–1/8<0。在里面
隐式表示使一些任务变得容易
几何的“显式”表示
所有的点都是直接或通过参数映射给出的
采样很容易
f
(
u
,
v
)
=
(
(
2
+
cos
u
)
cos
v
,
(
2
+
cos
u
)
sin
v
,
sin
u
)
f(u,v) = ((2 +\cos u)\cos v,(2+\cos u)\sin v,\sin u)
f(u,v)=((2+cosu)cosv,(2+cosu)sinv,sinu)
这个表面上有什么点,直接带入(u,v)
显式表示使一些任务变得容易
内外判断困难
f
(
u
,
v
)
=
(
cos
u
sin
v
,
sin
u
sin
v
,
cos
v
)
f(u,v) = (\cos u \sin v,\sin u \sin v,\cos v)
f(u,v)=(cosusinv,sinusinv,cosv)
不容易判断内外
没有“最好”的表示-几何很难!
“I hate meshes. I cannot believe how hard this is. Geometry is hard.” — David Baraff Senior Research Scientist Pixar Animation Studios
最好的表示取决于任务!
计算机图形学中更多的隐式表征
代数曲面
体素构造表示
水平集方法
分形
代数曲面
曲面是x, y, z的多项式的零点集
体素构造表示Constructive Solid Geometry
通过布尔运算组合隐式几何
距离函数
不是布尔值,逐渐混合曲面在一起使用
距离函数:给出从任何地方到对象的最小距离(可以是signed Distance)
一个例子:混合(线性插值)一个移动的边界
混合距离函数
可以混合任意两个距离函数d1, d2:
纯距离函数场景
See https://iquilezles.org/www/articles/raymarchingdf/raymarchingdf.htm
水平集
封闭形式的方程很难描述复杂的形状
备选方案:存储一个网格值逼近函数
找到插值值为零的曲面
对形状(如纹理)提供更显式的控制
来自医疗数据(CT、MRI等)的水平集。水平集编码,例如,恒定的组织密度
物理模拟
水平集编码到气液边界的距离
分形
展示自相似性,所有尺度的细节
描述自然现象的“语言”
难以控制形状
隐式表示的优缺点
优点:
- 紧凑的描述(例如,一个函数)
- 某些查询很容易(对象内部,到表面的距离)
- 适用于光线与表面的相交(稍后会详细介绍)
- 对于简单的形状,精确的描述/无采样误差
- 易于处理拓扑变化(例如,流体)
缺点: - 难以模拟复杂的形状
显示表示
点云
最简单的表示:点列表(x, y,z)
很容易表示任何几何图形
适用于大型数据集(>>1 点 / 像素)
经常转换成多边形网格
在采样不足的地区很难绘制
多边形网格
存储顶点和多边形(通常是三角形或四边形)
更容易进行处理 / 模拟
自适应采样更复杂的数据结构
也许是图形中最常见的表示
The Wavefront Object File (.obj) Format
常用于图形研究
只是一个指定顶点、法线、纹理坐标及其连通性的文本文件
v 几何体顶点 (Geometric vertices)
vt 贴图坐标点 (Texture vertices)
vn 顶点法线 (Vertex normals)
vp 参数空格顶点 (Parameter space vertices)
f 面 (Face) : 每三个点组成一个三角形
曲线(Curves)
相机路径
动画曲线
矢量字体
巴斯克维尔字体 - 表示为分段三次贝塞尔曲线
贝塞尔曲线(Bézier Curves)
用切线定义三次 Bézier 曲线
Evaluating Bézier Curves (de Casteljau Algorithm)
考虑三个点(二次贝塞尔)
使用线性插值插入一个点
两边都插入
递归重复
对
[
0
,
1
]
[0,1]
[0,1] 中的每个 t 运行相同的算法
三次贝塞尔曲线
总共四个输入点
相同的递归线性插值
可视化de Casteljau Algorithm
Bézier 曲线代数公式
de Casteljau 算法给出了系数金字塔
(画反了)
例:来自三点的二次贝塞尔曲线
b
0
1
(
t
)
=
(
1
−
t
)
b
0
+
t
b
1
\mathbf{b}_0^1(t) = (1-t)\mathbf{b}_0+t\mathbf{b}_1
b01(t)=(1−t)b0+tb1
b
1
1
(
t
)
=
(
1
−
t
)
b
1
+
t
b
2
\mathbf{b}_1^1(t) = (1-t)\mathbf{b}_1+t\mathbf{b}_2
b11(t)=(1−t)b1+tb2
b
0
2
(
t
)
=
(
1
−
t
)
b
0
1
+
t
b
1
1
\mathbf{b}_0^2(t) = (1-t)\mathbf{b}_0^1+t\mathbf{b}_1^1
b02(t)=(1−t)b01+tb11
于是
b
0
2
(
t
)
=
(
1
−
t
)
2
b
0
+
2
t
(
1
−
t
)
b
1
+
t
2
b
2
\mathbf{b}_0^2(t) = (1-t)^2\mathbf{b}_0+2t(1-t)\mathbf{b}_1+t^2\mathbf{b}_2
b02(t)=(1−t)2b0+2t(1−t)b1+t2b2
一般代数公式
n 阶 Bézier 曲线的 Bernstein 形式
Bernstein 多项式:
B
i
n
(
t
)
=
(
n
i
)
t
i
(
1
−
t
)
n
−
i
B_i^n(t)=\binom{n}{i}t^i(1-t)^{n-i}
Bin(t)=(in)ti(1−t)n−i
例:假设n=3,在R^3
我们可以有 3D 控制点,例如
b
0
=
(
0
,
2
,
3
)
,
b
1
=
(
2
,
3
,
5
)
,
b
2
=
(
6
,
7
,
9
)
,
b
3
=
(
3
,
4
,
5
)
\mathbf{b}_0 =(0,2,3), \mathbf{b}_1 =(2,3,5), \mathbf{b}_2 =(6,7,9), \mathbf{b}_3 =(3,4,5)
b0=(0,2,3),b1=(2,3,5),b2=(6,7,9),b3=(3,4,5)
这些点定义了一个t的三次贝塞尔曲线
b
n
(
t
)
=
b
0
(
1
−
t
)
3
+
b
1
3
t
(
1
−
t
)
2
+
b
2
3
t
2
(
1
−
t
)
+
b
3
t
3
\mathbf{b}^n(t)= \mathbf{b}_0(1 -t)^3 +\mathbf{b}_1 3t(1-t)2 +\mathbf{b}_23t^2(1-t)+\mathbf{b}_3t^3
bn(t)=b0(1−t)3+b13t(1−t)2+b23t2(1−t)+b3t3
三次贝塞尔基函数
Bernstein 多项式:
B
i
n
(
t
)
=
(
n
i
)
t
i
(
1
−
t
)
n
−
i
B_i^n(t)=\binom{n}{i}t^i(1-t)^{n-i}
Bin(t)=(in)ti(1−t)n−i
贝塞尔曲线的性质
插值端点
-
对于三次贝塞尔: b ( 0 ) = b 0 ; b ( 1 ) = b 3 b(0)=b_0;\ b(1)=b_3 b(0)=b0; b(1)=b3
切线到端段 -
三次形式: b ′ ( 0 ) = 3 ( b 1 − b 0 ) ; b ′ ( 1 ) = 3 ( b 3 − b 2 ) b'(0)=3(b_1-b_0);\ b'(1)=3(b_3-b_2) b′(0)=3(b1−b0); b′(1)=3(b3−b2)
仿射变换性质 -
通过变换控制点变换曲线。参考系无关
凸包性质 -
曲线在控制点的凸包内
凸包
分段贝塞尔曲线
高阶贝塞尔曲线很难控制
分段贝塞尔曲线
相反,链接许多低阶贝塞尔曲线
分段三次贝塞尔最常见的技术
广泛使用(字体、路径、Illustrator、Keynote…)
David Eck, http://math.hws.edu/eck/cs424/notes2013/canvas/bezier.html
连续性
两条贝塞尔曲线
a
:
[
k
,
k
+
1
]
→
R
N
\mathbf{a}:[k,k+1]\rightarrow \mathbb{R}^N
a:[k,k+1]→RN
b
:
[
k
+
1
,
k
+
2
]
→
R
N
\mathbf{b}:[k+1,k+2]\rightarrow \mathbb{R}^N
b:[k+1,k+2]→RN
假设这里有整数分区,可以一般化
C
0
C^0
C0 连续性:
a
n
=
b
0
\mathbf{a}_n=\mathbf{b}_0
an=b0
C
1
C^1
C1 连续性:
a
n
=
b
0
=
1
2
(
a
n
−
1
+
b
1
)
\mathbf{a}_n=\mathbf{b}_0=\frac{1}{2}(\mathbf{a}_{n-1}+\mathbf{b}_1)
an=b0=21(an−1+b1)
其他类型的样条
样条
- 为通过给定集合而构造的连续曲线的点并有一定数量的连续导数。
- 简而言之,控制下的曲线
B 样条 - basis splines的缩写
- 需要比贝塞尔曲线更多的信息
- 满足贝塞尔曲线具有的所有重要性质(即:超集
局部性
MORE:
NURBS
Prof. Shi-Min Hu’s course:
https://www.bilibili.com/video/av66548502?from=search&seid=65256805876131485
表面
Bézier Surfaces 贝塞尔表面
将贝塞尔曲线扩展到曲面
Bicubic(双三次型) Bézier 表面贴片
可视化 Bicubic Bézier 表面贴片
Animation: Steven Wittens, Making Things with Maths, http://acko.net
计算
参数(u, v)的表面位置
对于双三次贝塞尔表面贴片,
输入:4x4 控制点
输出是由
[
0
,
1
]
2
[0,1]^2
[0,1]2 中的(u, v)参数化的 2D 曲面
方法:可分离的一维 de Casteljau 算法
目标:评估对应于(u, v)的表面位置
de Casteljau 算法的(u,v)-可分离应用
- 使用 de Casteljau 计算 u 中4条贝塞尔曲线中每条曲线上的点 u。这为 “移动” 贝塞尔曲线提供了 4 个控制点
- 使用 1D de Casteljau计算“移动”曲线上的点 v
网格操作:几何处理
- 网格细分
- 网格简化
- 网格正则化