形式为: f ( x , y , z ) = 0 f(x,y,z)=0 f(x,y,z)=0.
对于点 ( x , y , z ) (x,y,z) (x,y,z)
两种方法:
f : R 2 → R 3 ; ( u , v ) ↦ ( x , y , z ) f: \mathbb{R}^{2} \rightarrow \mathbb{R}^{3} ;(u, v) \mapsto(x, y, z) f:R2→R3;(u,v)↦(x,y,z)

Combine implicit geometry via Boolean operations.


Gradually blend surfaces together using distance functions
距离函数:空间中任意一点距离物体表面的距离,外部为正,内部为负.

通过融合两个物体的距离函数实现表面的融合,先将距离函数融合,再将融合后的距离函数恢复成表面
b
l
e
n
d
=
b
a
s
e
∗
(
1
−
a
)
+
a
∗
c
u
r
r
e
n
t
blend=base*(1-a)+a*current
blend=base∗(1−a)+a∗current
怎么通过距离函数求得物体表面呢?
通过一系列的点利用插值方法近似求得“等高线”.

分形,具有以非整数维形式充填空间的形态特征。通常被定义为“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”,即具有自相似的性质。

点云就是一系列的点 ( x , y , z ) (x,y,z) (x,y,z) ,容易表示任何形状的几何体,但是需要大量的数据点。

在 3D 计算机图形学和实体建模中,多边形网格是定义多面体对象形状的顶点,边和面的集合。面通常由三角形(三角形网格),四边形(quad)或其他简单的凸多边形(n-gons)组成,因为这可以简化渲染,但通常也可以由凹面多边形甚至带孔的多边形组成。

一种文本文件,其中描述了顶点、法线与纹理坐标的信息与它们的联通信息.

上图定义了一个立方体,而立方体只有六条法线,所以有两条为冗余的.

贝塞尔曲线的起点为 p 0 p_0 p0,终点为 p 3 p_3 p3,起点方向向量为 p 0 p 1 → \overrightarrow{p_0p_1} p0p1,终点方向向量为 p 2 p 3 → \overrightarrow{p_2p_3} p2p3。



不断进行线性插值,观察到给定 n + 1 n+1 n+1 个控制点 b 0 , b 1 , ⋯ , b n b_0,b_1,\cdots ,b_n b0,b1,⋯,bn,可以得到最高为 n n n 阶的点 b 0 n b^n_0 b0n
b
0
1
(
t
)
=
(
1
−
t
)
b
0
+
t
b
1
b
1
1
(
t
)
=
(
1
−
t
)
b
1
+
t
b
2
b
0
2
(
t
)
=
(
1
−
t
)
b
0
1
+
t
b
1
1
b
0
2
(
t
)
=
(
1
−
t
)
2
b
0
+
2
t
(
1
−
t
)
b
1
+
t
2
b
2

其中
B
i
n
(
t
)
=
(
n
i
)
t
i
(
1
−
t
)
n
−
i
B_{i}^{n}(t)=\left(
以三次贝塞尔曲线(四个控制点,cubic Bézier)为例:
b ( 0 ) = b 0 , b ( 1 ) = b 3 \mathbf{b}(0)=\mathbf{b}_0,\ \mathbf{b}(1)=\mathbf{b}_3 b(0)=b0, b(1)=b3
b ′ ( 0 ) = 3 ( b 1 − b 0 ) , b ′ ( 1 ) = 3 ( b 3 − b 2 ) \mathbf{b^{'}}(0)=3(\mathbf{b}_1-\mathbf{b}_0),\ \mathbf{b^{'}}(1)=3(\mathbf{b}_3-\mathbf{b}_2) b′(0)=3(b1−b0), b′(1)=3(b3−b2)
仿射变换控制点后绘制的曲线与对曲线上每个点做仿射变换后得到曲线相同,投影变换下不成立.
绘制出的贝塞尔曲线在控制点形成的凸包内
凸包:能够包围所有点的最小的凸多边形
如果用多个控制点来画贝塞尔曲线,那么很难通过控制点描述曲线的走势。因此我们分段绘制,然后连接.
一般三次贝塞尔曲线 (四个控制点) 比较常见.

定义:
由一系列控制点控制的l连续线条,在任意点都满足一定的连续性.
在两个方向上分别定义贝塞尔曲线:

在一个方向上绘制贝塞尔曲线,将每个贝塞尔曲线上的点当作控制点,在另一个方向上绘制贝塞尔曲线 (显式).

把每个三角形分裂成四个

根据权重确定每个顶点的位置,新旧顶点不同处理

对于新的顶点

一般情况下,这个新顶点由两个三角形共同拥有,所以它由这两个三角形的顶点来确定位置
p
o
s
i
t
i
o
n
=
3
8
(
A
+
B
)
+
1
8
(
C
+
D
)
position=\frac{3}{8}(A+B)+\frac{1}{8}(C + D)
position=83(A+B)+81(C+D)
对于旧的顶点,

它的新位置
O
′
O^{'}
O′ 由自己原本的位置
O
O
O 与相邻旧顶点的位置
V
i
V_i
Vi 决定
O
′
=
(
1
−
n
β
)
O
+
β
∑
i
=
0
n
−
1
V
i
w
h
e
r
e
β
=
1
n
[
5
8
−
(
3
8
+
1
4
cos
2
π
n
)
]
O^{'}=(1-n\beta)O+\beta\sum^{n-1}_{i=0}V_i\\where\quad \beta =\frac{1}{n}[\frac{5}{8}-(\frac{3}{8}+\frac{1}{4}\cos\frac{2\pi}{n})]
O′=(1−nβ)O+βi=0∑n−1Viwhereβ=n1[85−(83+41cosn2π)]
由上式可以看出,顶点的度
n
n
n 越大,顶点的新位置就越由原本的位置所决定。
如果网格不是三角形网格,则不能用 Loop Subdivision 来细分,那么可以用下面的方法

奇异点定义为度不为 4 的点,选取每个面的中心与每条边的中点作为新顶点,连接每个新顶点

划分三角形新生成了两个奇异点,可以判断非四边形面上的新顶点细分后成为奇异点;细分后不再有非四边形面。这种细分在每次细分后增加非四边形个数个奇异点,之后奇异点数不再会增加

更新顶点:

边坍缩是一种网格简化的方法.
利用二次误差度量 Quadric Error Metrics 来判断哪些边需要进行坍缩

新顶点应当使它到所有原先顶点相关联的三角形平面的距离和(二次度量误差)最小,我们提前算出每条边的分数,即其二次度量误差,按照由小到大的优先级顺序进行简化

但是,当我们坍缩一条边后,其相连的边也会发生变化,这样的话,变化的边它的二次度量误差也会发生变化。所以我们需要一种数据结构,可以取到最小值,也可以动态更新其他边,所以我们可以用优先队列(堆)作为数据结构。
但这种算法实际上是一种贪心算法,并不一定就是最优解,但是算法的效果不错,所以是不是最优解并不重要.
